Develop and Download Open Source Software

Browse CVS Repository

Annotation of /gikonavigoeson/gikonavi/Gesture.pas

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.10 - (hide annotations) (download) (as text)
Mon Feb 11 13:46:13 2008 UTC (16 years, 2 months ago) by h677
Branch: MAIN
CVS Tags: v1_59_0_771, v1_59_0_770, v1_59_0_773, v1_59_0_772, v1_59_0_775, v1_59_0_774, v1_59_0_777, v1_59_0_776, v1_59_0_778, v1_63_1_819, v1_62_0_812, v1_59_1_765, v1_60_0_788, v1_60_0_789, v1_58_0_748, v1_58_0_745, v1_60_0_781, v1_60_0_782, v1_58_0_746, v1_60_0_784, v1_60_0_786, v1_60_0_787, v1_59_0_767, v1_59_1_778, v1_59_0_768, v1_59_0_769, v1_57_1_744, v1_58_0_752, v1_58_0_750, v1_58_0_751, v1_58_0_756, v1_58_0_757, v1_58_0_754, v1_58_0_755, v1_58_0_759, v1_61_0_796, v1_61_0_797, v1_61_0_795, v1_61_0_798, v1_61_0_799, v1_63_0_818, v1_63_0_817, v1_63_0_816, v1_63_0_815, v1_62_0_805, v1_62_0_804, v1_62_0_807, v1_62_0_806, v1_62_0_803, v1_62_0_802, v1_62_0_809, v1_60_0_780, v1_60_0_779, v1_62_0_810, v1_62_0_811, v1_58_0_747, v1_60_0_783, v1_59_2_785, v1_60_1_793, v1_58_0_763, v1_58_0_762, v1_58_0_761, v1_58_0_760, v1_62_1_813, v1_57_2_749, v1_57_0_742, v1_57_0_743, v1_57_0_740, v1_57_0_741, v1_57_0_744, v1_61_0_800, v1_60_0_793, v1_60_0_792, v1_60_0_791, v1_60_0_790, v1_60_2_794, v1_61_1_801, HEAD
Branch point for: Bb57, Bb62, Bb63, Bb60, Bb61, Bb59, Bb58
Changes since 1.9: +1 -1 lines
File MIME type: text/x-pascal
Hookの変数が、符号付整数だったので、符号無し整数に変更した。

1 yoffy 1.1 unit Gesture;
2    
3     interface
4    
5     uses
6     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7     Dialogs, Math, StrUtils;
8    
9     type
10     TMouseGesture = class(TObject)
11     private
12 h677 1.10 FHook: Cardinal;
13 yoffy 1.1 FHandle: THandle;
14     FGestureItemList: TStringList;
15     FBeginGesture: Boolean;
16     FCancelMode: Boolean;
17     FLastTime: Cardinal;
18     FStartPoint: TPoint;
19     FLastPoint: TPoint;
20     FMargin: Integer;
21     FOnGestureStart: TNotifyEvent;
22     FOnGestureMove: TNotifyEvent;
23     FOnGestureEnd: TNotifyEvent;
24     function GetGestureCount: Integer;
25     function CheckAction(Message: Integer; x, y: Integer): Boolean;
26     procedure AddAction(sx, sy: Integer);
27     function AddGesture(Item: string): Integer;
28     function Get(Index: integer): string;
29     procedure Put(Index: integer; Item: string);
30     public
31     constructor Create;
32     destructor Destroy; override;
33     procedure SetHook(hWnd: THandle);
34     procedure UnHook;
35     property Items[Index: Integer]: string read Get write Put; default;
36     property GestureCount: Integer read GetGestureCount;
37     property Margin: Integer read FMargin write FMargin;
38     function GetGestureStr: string;
39 h677 1.9 procedure Clear;
40 yoffy 1.1 property OnGestureStart: TNotifyEvent read FOnGestureStart write FOnGestureStart;
41     property OnGestureMove: TNotifyEvent read FOnGestureMove write FOnGestureMove;
42     property OnGestureEnd: TNotifyEvent read FOnGestureEnd write FOnGestureEnd;
43     end;
44    
45     function GestureProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
46    
47     var
48     MouseGesture: TMouseGesture;
49    
50     implementation
51    
52 h677 1.7 uses
53     GikoSystem;
54    
55 yoffy 1.1 constructor TMouseGesture.Create;
56     begin
57     inherited;
58     FHook := 0;
59     FCancelMode := False;
60     FBeginGesture := False;
61     FMargin := 15;
62     FGestureItemList := TStringList.Create;
63     end;
64    
65     destructor TMouseGesture.Destroy;
66     begin
67     UnHook;
68 h677 1.9 Clear;
69 yoffy 1.1 FGestureItemList.Free;
70     inherited;
71     end;
72    
73     //鐃?鐃?鐃?鐃?鐃?鐃?
74     procedure TMouseGesture.SetHook(hWnd: THandle);
75     begin
76     if FHook <> 0 then
77     Exit;
78     FHandle := hWnd;
79     UnHook;
80     FHook := SetWindowsHookEx(WH_MOUSE, @GestureProc, 0{HInstance}, GetCurrentThreadId);
81     end;
82    
83     //鐃?鐃?鐃?鐃?鐃?鐃?鐃緒申鐃緒申
84     procedure TMouseGesture.UnHook;
85     begin
86     if FHook = 0 then
87     Exit;
88     UnhookWindowsHookEx(FHook);
89     FHook := 0;
90     end;
91    
92     //鐃?鐃?鐃?鐃?鐃緒申鐃?鐃?鐃緒申
93     function GestureProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
94     var
95     mhs: PMouseHookStruct;
96     begin
97     if nCode = HC_ACTION then begin
98     mhs := PMouseHookStruct(lParam);
99     if MouseGesture.CheckAction(wParam, mhs^.pt.X, mhs^.pt.Y) then begin
100     Result := 1;
101     Exit;
102     end;
103     end;
104     Result := CallNextHookEx(MouseGesture.FHook, nCode, wParam, lParam);
105     end;
106    
107     function TMouseGesture.CheckAction(Message: Integer; x, y: Integer): Boolean;
108     var
109     dp: TPoint;
110     sp: TPoint;
111 h677 1.2 hwnd: THandle;
112 yoffy 1.1 begin
113     Result := False;
114     case Message of
115     WM_MOUSEMOVE: begin
116     if FBeginGesture then begin
117 h677 1.2 //鐃緒申鐃?鐃?鐃?鐃緒申鐃?鐃緒申鐃?鐃?鐃緒申鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
118     hwnd := GetCapture;
119     //鐃?鐃?鐃?鐃?鐃?鐃?鐃?鐃緒申鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃?鐃?鐃緒申鐃緒申鐃緒申
120     if (hwnd <> 0) and (hwnd <> FHandle) then begin
121     ReleaseCapture;
122 h677 1.7 SetCapture(FHandle);
123 h677 1.2 end;
124 yoffy 1.1 dp := Point(x - FLastPoint.X, y - FLastPoint.Y);
125     sp := Point(Sign(dp.X), Sign(dp.Y));
126 h677 1.2 if (dp.X * dp.X + dp.Y * dp.Y) > (FMargin * FMargin) then begin
127 yoffy 1.1 dp := Point(Abs(dp.X), Abs(dp.Y));
128 h677 1.2 if dp.X > dp.Y div 3 then
129 yoffy 1.1 sp.Y := 0;
130 h677 1.2 if dp.Y > dp.X div 3 then
131 yoffy 1.1 sp.X := 0;
132     AddAction(sp.X, sp.Y);
133     FLastTime := GetTickCount;
134     FLastPoint := Point(x, y);
135     end;
136 h677 1.7 Result := True;
137     end;
138 yoffy 1.1 end;
139     WM_RBUTTONDOWN: begin
140 h677 1.7 if (not FCancelMode) then begin
141     if ( GikoSys.Setting.GestureIgnoreContext ) then begin
142     //鐃緒申鐃?鐃?鐃?鐃緒申鐃?鐃緒申鐃?鐃?鐃緒申鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
143     hwnd := GetCapture;
144     //鐃?鐃?鐃?鐃?鐃?鐃?鐃?鐃緒申鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃?鐃?鐃緒申鐃緒申鐃緒申
145     if (hwnd <> 0) and (hwnd <> FHandle) then begin
146     Exit;
147     end;
148     end;
149 h677 1.4 FBeginGesture := True;
150     FLastTime := 0;
151     FLastPoint := Point(x, y);
152     FStartPoint := Point(x, y);
153     Result := True;
154     SetCapture(FHandle);
155     end;
156 yoffy 1.1 end;
157     WM_RBUTTONUP: begin
158 h677 1.4 if FCancelMode then
159     FCancelMode := False
160 h677 1.5 else if (FBeginGesture) then begin
161 h677 1.4 FBeginGesture := False;
162     ReleaseCapture;
163     if FGestureItemList.Count <> 0 then begin
164 h677 1.8 if Assigned(FOnGestureEnd) then begin
165 h677 1.4 FOnGestureEnd(Self);
166 h677 1.8 end else begin
167 h677 1.9 Clear;
168 h677 1.8 end;
169 h677 1.4 end else begin
170     FCancelMode := True;
171     //鐃?鐃?鐃?鐃?鐃緒申鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃?鐃?鐃?鐃?DOWN,UP鐃緒申鐃?鐃?鐃緒申鐃緒申鐃?鐃?
172     mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_RIGHTDOWN, FStartPoint.X, FStartPoint.Y, 0, 0);
173     mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_RIGHTUP, x, y, 0, 0);
174     end;
175 yoffy 1.1 end;
176     end;
177     end;
178     end;
179    
180     //鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
181     procedure TMouseGesture.AddAction(sx, sy: Integer);
182     var
183     Direction: string;
184     begin
185     Direction := '';
186     if (sx > 0) and (sy = 0) then
187     Direction := '鐃緒申'
188     else if (sx < 0) and (sy = 0) then
189     Direction := '鐃緒申'
190     else if sy > 0 then
191     Direction := '鐃緒申'
192     else if sy < 0 then
193     Direction := '鐃緒申'
194     else
195     Exit;
196     if FGestureItemList.Count > 0 then begin
197     if Items[FGestureItemList.Count - 1] = Direction then
198     Exit;
199     end else begin
200     //鐃?鐃?鐃?鐃?鐃緒申鐃?鐃?鐃?
201     if Assigned(FOnGestureStart) then
202     FOnGestureStart(Self);
203     end;
204     AddGesture(Direction);
205     if Assigned(FOnGestureMove) then
206     FOnGestureMove(Self);
207     end;
208    
209     //鐃緒申鐃緒申鐃緒申鐃?鐃?鐃?鐃?鐃緒申鐃?鐃緒申鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
210     function TMouseGesture.AddGesture(Item: string): Integer;
211     begin
212     Result := FGestureItemList.Add(Item);
213     end;
214    
215     //鐃?鐃緒申鐃緒申鐃緒申鐃緒申index鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
216     function TMouseGesture.Get(Index: Integer): string;
217     begin
218     Result := FGestureItemList[Index];
219     end;
220    
221     //鐃?鐃緒申鐃緒申鐃緒申鐃緒申index鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
222     procedure TMouseGesture.Put(Index: Integer; Item: string);
223     begin
224     FGestureItemList[Index] := Item;
225     end;
226    
227     //鐃?鐃?鐃?鐃?鐃緒申鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
228     function TMouseGesture.GetGestureStr: string;
229     var
230     i: Integer;
231     begin
232     Result := '';
233     for i := 0 to FGestureItemList.Count - 1 do
234     Result := Result + Items[i];
235     end;
236    
237     //鐃?鐃?鐃?鐃?鐃緒申鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
238     function TMouseGesture.GetGestureCount: Integer;
239     begin
240     Result := FGestureItemList.Count;
241     end;
242    
243     //鐃?鐃?鐃?鐃?鐃緒申鐃?鐃緒申鐃?鐃緒申鐃?鐃緒申鐃緒申
244 h677 1.9 procedure TMouseGesture.Clear;
245 yoffy 1.1 begin
246     FGestureItemList.Clear;
247     end;
248    
249     end.

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26