|
1
|
1 #pragma once
|
|
|
2
|
|
|
3 #ifndef WM_GESTURE
|
|
|
4
|
|
|
5 #define WM_GESTURE 0x0119
|
|
|
6 #define WM_GESTURENOTIFY 0x011A
|
|
|
7
|
|
|
8
|
|
|
9 DECLARE_HANDLE(HGESTUREINFO);
|
|
|
10
|
|
|
11
|
|
|
12 /*
|
|
|
13 * Gesture flags - GESTUREINFO.dwFlags
|
|
|
14 */
|
|
|
15 #define GF_BEGIN 0x00000001
|
|
|
16 #define GF_INERTIA 0x00000002
|
|
|
17 #define GF_END 0x00000004
|
|
|
18
|
|
|
19 /*
|
|
|
20 * Gesture IDs
|
|
|
21 */
|
|
|
22 #define GID_BEGIN 1
|
|
|
23 #define GID_END 2
|
|
|
24 #define GID_ZOOM 3
|
|
|
25 #define GID_PAN 4
|
|
|
26 #define GID_ROTATE 5
|
|
|
27 #define GID_TWOFINGERTAP 6
|
|
|
28 #define GID_PRESSANDTAP 7
|
|
|
29 #define GID_ROLLOVER GID_PRESSANDTAP
|
|
|
30
|
|
|
31 /*
|
|
|
32 * Gesture information structure
|
|
|
33 * - Pass the HGESTUREINFO received in the WM_GESTURE message lParam into the
|
|
|
34 * GetGestureInfo function to retrieve this information.
|
|
|
35 * - If cbExtraArgs is non-zero, pass the HGESTUREINFO received in the WM_GESTURE
|
|
|
36 * message lParam into the GetGestureExtraArgs function to retrieve extended
|
|
|
37 * argument information.
|
|
|
38 */
|
|
|
39 typedef struct tagGESTUREINFO {
|
|
|
40 UINT cbSize; // size, in bytes, of this structure (including variable length Args field)
|
|
|
41 DWORD dwFlags; // see GF_* flags
|
|
|
42 DWORD dwID; // gesture ID, see GID_* defines
|
|
|
43 HWND hwndTarget; // handle to window targeted by this gesture
|
|
|
44 POINTS ptsLocation; // current location of this gesture
|
|
|
45 DWORD dwInstanceID; // internally used
|
|
|
46 DWORD dwSequenceID; // internally used
|
|
|
47 ULONGLONG ullArguments; // arguments for gestures whose arguments fit in 8 BYTES
|
|
|
48 UINT cbExtraArgs; // size, in bytes, of extra arguments, if any, that accompany this gesture
|
|
|
49 } GESTUREINFO, *PGESTUREINFO;
|
|
|
50 typedef GESTUREINFO const * PCGESTUREINFO;
|
|
|
51
|
|
|
52
|
|
|
53 /*
|
|
|
54 * Gesture notification structure
|
|
|
55 * - The WM_GESTURENOTIFY message lParam contains a pointer to this structure.
|
|
|
56 * - The WM_GESTURENOTIFY message notifies a window that gesture recognition is
|
|
|
57 * in progress and a gesture will be generated if one is recognized under the
|
|
|
58 * current gesture settings.
|
|
|
59 */
|
|
|
60 typedef struct tagGESTURENOTIFYSTRUCT {
|
|
|
61 UINT cbSize; // size, in bytes, of this structure
|
|
|
62 DWORD dwFlags; // unused
|
|
|
63 HWND hwndTarget; // handle to window targeted by the gesture
|
|
|
64 POINTS ptsLocation; // starting location
|
|
|
65 DWORD dwInstanceID; // internally used
|
|
|
66 } GESTURENOTIFYSTRUCT, *PGESTURENOTIFYSTRUCT;
|
|
|
67
|
|
|
68 /*
|
|
|
69 * Gesture argument helpers
|
|
|
70 * - Angle should be a double in the range of -2pi to +2pi
|
|
|
71 * - Argument should be an unsigned 16-bit value
|
|
|
72 */
|
|
|
73 #define GID_ROTATE_ANGLE_TO_ARGUMENT(_arg_) ((USHORT)((((_arg_) + 2.0 * 3.14159265) / (4.0 * 3.14159265)) * 65535.0))
|
|
|
74 #define GID_ROTATE_ANGLE_FROM_ARGUMENT(_arg_) ((((double)(_arg_) / 65535.0) * 4.0 * 3.14159265) - 2.0 * 3.14159265)
|
|
|
75
|
|
|
76 /*
|
|
|
77 * Gesture information retrieval
|
|
|
78 * - HGESTUREINFO is received by a window in the lParam of a WM_GESTURE message.
|
|
|
79 */
|
|
|
80 WINUSERAPI
|
|
|
81 BOOL
|
|
|
82 WINAPI
|
|
|
83 GetGestureInfo(
|
|
|
84 __in HGESTUREINFO hGestureInfo,
|
|
|
85 __out PGESTUREINFO pGestureInfo);
|
|
|
86
|
|
|
87
|
|
|
88
|
|
|
89 /*
|
|
|
90 * Gesture extra arguments retrieval
|
|
|
91 * - HGESTUREINFO is received by a window in the lParam of a WM_GESTURE message.
|
|
|
92 * - Size, in bytes, of the extra argument data is available in the cbExtraArgs
|
|
|
93 * field of the GESTUREINFO structure retrieved using the GetGestureInfo function.
|
|
|
94 */
|
|
|
95 WINUSERAPI
|
|
|
96 BOOL
|
|
|
97 WINAPI
|
|
|
98 GetGestureExtraArgs(
|
|
|
99 __in HGESTUREINFO hGestureInfo,
|
|
|
100 __in UINT cbExtraArgs,
|
|
|
101 __out_bcount(cbExtraArgs) PBYTE pExtraArgs);
|
|
|
102
|
|
|
103 /*
|
|
|
104 * Gesture information handle management
|
|
|
105 * - If an application processes the WM_GESTURE message, then once it is done
|
|
|
106 * with the associated HGESTUREINFO, the application is responsible for
|
|
|
107 * closing the handle using this function. Failure to do so may result in
|
|
|
108 * process memory leaks.
|
|
|
109 * - If the message is instead passed to DefWindowProc, or is forwarded using
|
|
|
110 * one of the PostMessage or SendMessage class of API functions, the handle
|
|
|
111 * is transfered with the message and need not be closed by the application.
|
|
|
112 */
|
|
|
113 WINUSERAPI
|
|
|
114 BOOL
|
|
|
115 WINAPI
|
|
|
116 CloseGestureInfoHandle(
|
|
|
117 __in HGESTUREINFO hGestureInfo);
|
|
|
118
|
|
|
119
|
|
|
120 /*
|
|
|
121 * Gesture configuration structure
|
|
|
122 * - Used in SetGestureConfig and GetGestureConfig
|
|
|
123 * - Note that any setting not included in either GESTURECONFIG.dwWant or
|
|
|
124 * GESTURECONFIG.dwBlock will use the parent window's preferences or
|
|
|
125 * system defaults.
|
|
|
126 */
|
|
|
127 typedef struct tagGESTURECONFIG {
|
|
|
128 DWORD dwID; // gesture ID
|
|
|
129 DWORD dwWant; // settings related to gesture ID that are to be turned on
|
|
|
130 DWORD dwBlock; // settings related to gesture ID that are to be turned off
|
|
|
131 } GESTURECONFIG, *PGESTURECONFIG;
|
|
|
132
|
|
|
133 /*
|
|
|
134 * Gesture configuration flags - GESTURECONFIG.dwWant or GESTURECONFIG.dwBlock
|
|
|
135 */
|
|
|
136
|
|
|
137 /*
|
|
|
138 * Common gesture configuration flags - set GESTURECONFIG.dwID to zero
|
|
|
139 */
|
|
|
140 #define GC_ALLGESTURES 0x00000001
|
|
|
141
|
|
|
142 /*
|
|
|
143 * Zoom gesture configuration flags - set GESTURECONFIG.dwID to GID_ZOOM
|
|
|
144 */
|
|
|
145 #define GC_ZOOM 0x00000001
|
|
|
146
|
|
|
147 /*
|
|
|
148 * Pan gesture configuration flags - set GESTURECONFIG.dwID to GID_PAN
|
|
|
149 */
|
|
|
150 #define GC_PAN 0x00000001
|
|
|
151 #define GC_PAN_WITH_SINGLE_FINGER_VERTICALLY 0x00000002
|
|
|
152 #define GC_PAN_WITH_SINGLE_FINGER_HORIZONTALLY 0x00000004
|
|
|
153 #define GC_PAN_WITH_GUTTER 0x00000008
|
|
|
154 #define GC_PAN_WITH_INERTIA 0x00000010
|
|
|
155
|
|
|
156 /*
|
|
|
157 * Rotate gesture configuration flags - set GESTURECONFIG.dwID to GID_ROTATE
|
|
|
158 */
|
|
|
159 #define GC_ROTATE 0x00000001
|
|
|
160
|
|
|
161 /*
|
|
|
162 * Two finger tap gesture configuration flags - set GESTURECONFIG.dwID to GID_TWOFINGERTAP
|
|
|
163 */
|
|
|
164 #define GC_TWOFINGERTAP 0x00000001
|
|
|
165
|
|
|
166 /*
|
|
|
167 * PressAndTap gesture configuration flags - set GESTURECONFIG.dwID to GID_PRESSANDTAP
|
|
|
168 */
|
|
|
169 #define GC_PRESSANDTAP 0x00000001
|
|
|
170 #define GC_ROLLOVER GC_PRESSANDTAP
|
|
|
171
|
|
|
172 #define GESTURECONFIGMAXCOUNT 256 // Maximum number of gestures that can be included
|
|
|
173 // in a single call to SetGestureConfig / GetGestureConfig
|
|
|
174
|
|
|
175 WINUSERAPI
|
|
|
176 BOOL
|
|
|
177 WINAPI
|
|
|
178 SetGestureConfig(
|
|
|
179 __in HWND hwnd, // window for which configuration is specified
|
|
|
180 __in DWORD dwReserved, // reserved, must be 0
|
|
|
181 __in UINT cIDs, // count of GESTURECONFIG structures
|
|
|
182 __in_ecount(cIDs) PGESTURECONFIG pGestureConfig, // array of GESTURECONFIG structures, dwIDs will be processed in the
|
|
|
183 // order specified and repeated occurances will overwrite previous ones
|
|
|
184 __in UINT cbSize); // sizeof(GESTURECONFIG)
|
|
|
185
|
|
|
186
|
|
|
187
|
|
|
188
|
|
|
189 #define GCF_INCLUDE_ANCESTORS 0x00000001 // If specified, GetGestureConfig returns consolidated configuration
|
|
|
190 // for the specified window and it's parent window chain
|
|
|
191
|
|
|
192 WINUSERAPI
|
|
|
193 BOOL
|
|
|
194 WINAPI
|
|
|
195 GetGestureConfig(
|
|
|
196 __in HWND hwnd, // window for which configuration is required
|
|
|
197 __in DWORD dwReserved, // reserved, must be 0
|
|
|
198 __in DWORD dwFlags, // see GCF_* flags
|
|
|
199 __in PUINT pcIDs, // *pcIDs contains the size, in number of GESTURECONFIG structures,
|
|
|
200 // of the buffer pointed to by pGestureConfig
|
|
|
201 __inout_ecount(*pcIDs) PGESTURECONFIG pGestureConfig,
|
|
|
202 // pointer to buffer to receive the returned array of GESTURECONFIG structures
|
|
|
203 __in UINT cbSize); // sizeof(GESTURECONFIG)
|
|
|
204
|
|
|
205
|
|
|
206
|
|
|
207 typedef BOOL
|
|
|
208 (WINAPI *pGetGestureInfo_t)(
|
|
|
209 __in HGESTUREINFO hGestureInfo,
|
|
|
210 __out PGESTUREINFO pGestureInfo);
|
|
|
211
|
|
|
212 typedef BOOL
|
|
|
213 (WINAPI * pCloseGestureInfoHandle_t)(
|
|
|
214 __in HGESTUREINFO hGestureInfo);
|
|
|
215
|
|
|
216 typedef BOOL
|
|
|
217 (WINAPI * pSetGestureConfig_t) (
|
|
|
218 __in HWND hwnd, // window for which configuration is specified
|
|
|
219 __in DWORD dwReserved, // reserved, must be 0
|
|
|
220 __in UINT cIDs, // count of GESTURECONFIG structures
|
|
|
221 __in_ecount(cIDs) PGESTURECONFIG pGestureConfig, // array of GESTURECONFIG structures, dwIDs will be processed in the
|
|
|
222 // order specified and repeated occurances will overwrite previous ones
|
|
|
223 __in UINT cbSize); // sizeof(GESTURECONFIG)
|
|
|
224
|
|
|
225 class CGestureAPI {
|
|
|
226 public:
|
|
|
227 CGestureAPI() {
|
|
|
228 HMODULE dll = GetModuleHandle(_T("user32.dll"));
|
|
|
229
|
|
|
230 Bind(GetGestureInfo, dll, "GetGestureInfo");
|
|
|
231 Bind(CloseGestureInfoHandle, dll, "CloseGestureInfoHandle");
|
|
|
232 Bind(SetGestureConfig, dll, "SetGestureConfig");
|
|
|
233 }
|
|
|
234
|
|
|
235 bool IsAvailable() {
|
|
|
236 return this->GetGestureInfo != NULL;
|
|
|
237 }
|
|
|
238
|
|
|
239 pGetGestureInfo_t GetGestureInfo;
|
|
|
240 pCloseGestureInfoHandle_t CloseGestureInfoHandle;
|
|
|
241 pSetGestureConfig_t SetGestureConfig;
|
|
|
242 private:
|
|
|
243 template<typename func_t> static void Bind(func_t & f, HMODULE dll, const char * name) {
|
|
|
244 f = reinterpret_cast<func_t>(GetProcAddress(dll, name));
|
|
|
245 }
|
|
|
246 };
|
|
|
247 #else
|
|
|
248
|
|
|
249 class CGestureAPI {
|
|
|
250 public:
|
|
|
251 inline static bool IsAvailable() { return true; }
|
|
|
252 inline static BOOL GetGestureInfo(HGESTUREINFO hGestureInfo, PGESTUREINFO pGestureInfo) {
|
|
|
253 return ::GetGestureInfo(hGestureInfo, pGestureInfo);
|
|
|
254 }
|
|
|
255 inline static BOOL CloseGestureInfoHandle(HGESTUREINFO hGestureInfo) {
|
|
|
256 return ::CloseGestureInfoHandle(hGestureInfo);
|
|
|
257 }
|
|
|
258
|
|
|
259 inline static BOOL SetGestureConfig(HWND hwnd, DWORD dwReserved, UINT cIDs, PGESTURECONFIG pGestureConfig, UINT cbSize) {
|
|
|
260 return ::SetGestureConfig(hwnd, dwReserved, cIDs, pGestureConfig, cbSize);
|
|
|
261 }
|
|
|
262 };
|
|
|
263 #endif
|
|
|
264
|