#pragma once #ifndef WM_GESTURE #define WM_GESTURE 0x0119 #define WM_GESTURENOTIFY 0x011A DECLARE_HANDLE(HGESTUREINFO); /* * Gesture flags - GESTUREINFO.dwFlags */ #define GF_BEGIN 0x00000001 #define GF_INERTIA 0x00000002 #define GF_END 0x00000004 /* * Gesture IDs */ #define GID_BEGIN 1 #define GID_END 2 #define GID_ZOOM 3 #define GID_PAN 4 #define GID_ROTATE 5 #define GID_TWOFINGERTAP 6 #define GID_PRESSANDTAP 7 #define GID_ROLLOVER GID_PRESSANDTAP /* * Gesture information structure * - Pass the HGESTUREINFO received in the WM_GESTURE message lParam into the * GetGestureInfo function to retrieve this information. * - If cbExtraArgs is non-zero, pass the HGESTUREINFO received in the WM_GESTURE * message lParam into the GetGestureExtraArgs function to retrieve extended * argument information. */ typedef struct tagGESTUREINFO { UINT cbSize; // size, in bytes, of this structure (including variable length Args field) DWORD dwFlags; // see GF_* flags DWORD dwID; // gesture ID, see GID_* defines HWND hwndTarget; // handle to window targeted by this gesture POINTS ptsLocation; // current location of this gesture DWORD dwInstanceID; // internally used DWORD dwSequenceID; // internally used ULONGLONG ullArguments; // arguments for gestures whose arguments fit in 8 BYTES UINT cbExtraArgs; // size, in bytes, of extra arguments, if any, that accompany this gesture } GESTUREINFO, *PGESTUREINFO; typedef GESTUREINFO const * PCGESTUREINFO; /* * Gesture notification structure * - The WM_GESTURENOTIFY message lParam contains a pointer to this structure. * - The WM_GESTURENOTIFY message notifies a window that gesture recognition is * in progress and a gesture will be generated if one is recognized under the * current gesture settings. */ typedef struct tagGESTURENOTIFYSTRUCT { UINT cbSize; // size, in bytes, of this structure DWORD dwFlags; // unused HWND hwndTarget; // handle to window targeted by the gesture POINTS ptsLocation; // starting location DWORD dwInstanceID; // internally used } GESTURENOTIFYSTRUCT, *PGESTURENOTIFYSTRUCT; /* * Gesture argument helpers * - Angle should be a double in the range of -2pi to +2pi * - Argument should be an unsigned 16-bit value */ #define GID_ROTATE_ANGLE_TO_ARGUMENT(_arg_) ((USHORT)((((_arg_) + 2.0 * 3.14159265) / (4.0 * 3.14159265)) * 65535.0)) #define GID_ROTATE_ANGLE_FROM_ARGUMENT(_arg_) ((((double)(_arg_) / 65535.0) * 4.0 * 3.14159265) - 2.0 * 3.14159265) /* * Gesture information retrieval * - HGESTUREINFO is received by a window in the lParam of a WM_GESTURE message. */ WINUSERAPI BOOL WINAPI GetGestureInfo( __in HGESTUREINFO hGestureInfo, __out PGESTUREINFO pGestureInfo); /* * Gesture extra arguments retrieval * - HGESTUREINFO is received by a window in the lParam of a WM_GESTURE message. * - Size, in bytes, of the extra argument data is available in the cbExtraArgs * field of the GESTUREINFO structure retrieved using the GetGestureInfo function. */ WINUSERAPI BOOL WINAPI GetGestureExtraArgs( __in HGESTUREINFO hGestureInfo, __in UINT cbExtraArgs, __out_bcount(cbExtraArgs) PBYTE pExtraArgs); /* * Gesture information handle management * - If an application processes the WM_GESTURE message, then once it is done * with the associated HGESTUREINFO, the application is responsible for * closing the handle using this function. Failure to do so may result in * process memory leaks. * - If the message is instead passed to DefWindowProc, or is forwarded using * one of the PostMessage or SendMessage class of API functions, the handle * is transfered with the message and need not be closed by the application. */ WINUSERAPI BOOL WINAPI CloseGestureInfoHandle( __in HGESTUREINFO hGestureInfo); /* * Gesture configuration structure * - Used in SetGestureConfig and GetGestureConfig * - Note that any setting not included in either GESTURECONFIG.dwWant or * GESTURECONFIG.dwBlock will use the parent window's preferences or * system defaults. */ typedef struct tagGESTURECONFIG { DWORD dwID; // gesture ID DWORD dwWant; // settings related to gesture ID that are to be turned on DWORD dwBlock; // settings related to gesture ID that are to be turned off } GESTURECONFIG, *PGESTURECONFIG; /* * Gesture configuration flags - GESTURECONFIG.dwWant or GESTURECONFIG.dwBlock */ /* * Common gesture configuration flags - set GESTURECONFIG.dwID to zero */ #define GC_ALLGESTURES 0x00000001 /* * Zoom gesture configuration flags - set GESTURECONFIG.dwID to GID_ZOOM */ #define GC_ZOOM 0x00000001 /* * Pan gesture configuration flags - set GESTURECONFIG.dwID to GID_PAN */ #define GC_PAN 0x00000001 #define GC_PAN_WITH_SINGLE_FINGER_VERTICALLY 0x00000002 #define GC_PAN_WITH_SINGLE_FINGER_HORIZONTALLY 0x00000004 #define GC_PAN_WITH_GUTTER 0x00000008 #define GC_PAN_WITH_INERTIA 0x00000010 /* * Rotate gesture configuration flags - set GESTURECONFIG.dwID to GID_ROTATE */ #define GC_ROTATE 0x00000001 /* * Two finger tap gesture configuration flags - set GESTURECONFIG.dwID to GID_TWOFINGERTAP */ #define GC_TWOFINGERTAP 0x00000001 /* * PressAndTap gesture configuration flags - set GESTURECONFIG.dwID to GID_PRESSANDTAP */ #define GC_PRESSANDTAP 0x00000001 #define GC_ROLLOVER GC_PRESSANDTAP #define GESTURECONFIGMAXCOUNT 256 // Maximum number of gestures that can be included // in a single call to SetGestureConfig / GetGestureConfig WINUSERAPI BOOL WINAPI SetGestureConfig( __in HWND hwnd, // window for which configuration is specified __in DWORD dwReserved, // reserved, must be 0 __in UINT cIDs, // count of GESTURECONFIG structures __in_ecount(cIDs) PGESTURECONFIG pGestureConfig, // array of GESTURECONFIG structures, dwIDs will be processed in the // order specified and repeated occurances will overwrite previous ones __in UINT cbSize); // sizeof(GESTURECONFIG) #define GCF_INCLUDE_ANCESTORS 0x00000001 // If specified, GetGestureConfig returns consolidated configuration // for the specified window and it's parent window chain WINUSERAPI BOOL WINAPI GetGestureConfig( __in HWND hwnd, // window for which configuration is required __in DWORD dwReserved, // reserved, must be 0 __in DWORD dwFlags, // see GCF_* flags __in PUINT pcIDs, // *pcIDs contains the size, in number of GESTURECONFIG structures, // of the buffer pointed to by pGestureConfig __inout_ecount(*pcIDs) PGESTURECONFIG pGestureConfig, // pointer to buffer to receive the returned array of GESTURECONFIG structures __in UINT cbSize); // sizeof(GESTURECONFIG) typedef BOOL (WINAPI *pGetGestureInfo_t)( __in HGESTUREINFO hGestureInfo, __out PGESTUREINFO pGestureInfo); typedef BOOL (WINAPI * pCloseGestureInfoHandle_t)( __in HGESTUREINFO hGestureInfo); typedef BOOL (WINAPI * pSetGestureConfig_t) ( __in HWND hwnd, // window for which configuration is specified __in DWORD dwReserved, // reserved, must be 0 __in UINT cIDs, // count of GESTURECONFIG structures __in_ecount(cIDs) PGESTURECONFIG pGestureConfig, // array of GESTURECONFIG structures, dwIDs will be processed in the // order specified and repeated occurances will overwrite previous ones __in UINT cbSize); // sizeof(GESTURECONFIG) class CGestureAPI { public: CGestureAPI() { HMODULE dll = GetModuleHandle(_T("user32.dll")); Bind(GetGestureInfo, dll, "GetGestureInfo"); Bind(CloseGestureInfoHandle, dll, "CloseGestureInfoHandle"); Bind(SetGestureConfig, dll, "SetGestureConfig"); } bool IsAvailable() { return this->GetGestureInfo != NULL; } pGetGestureInfo_t GetGestureInfo; pCloseGestureInfoHandle_t CloseGestureInfoHandle; pSetGestureConfig_t SetGestureConfig; private: template static void Bind(func_t & f, HMODULE dll, const char * name) { f = reinterpret_cast(GetProcAddress(dll, name)); } }; #else class CGestureAPI { public: inline static bool IsAvailable() { return true; } inline static BOOL GetGestureInfo(HGESTUREINFO hGestureInfo, PGESTUREINFO pGestureInfo) { return ::GetGestureInfo(hGestureInfo, pGestureInfo); } inline static BOOL CloseGestureInfoHandle(HGESTUREINFO hGestureInfo) { return ::CloseGestureInfoHandle(hGestureInfo); } inline static BOOL SetGestureConfig(HWND hwnd, DWORD dwReserved, UINT cIDs, PGESTURECONFIG pGestureConfig, UINT cbSize) { return ::SetGestureConfig(hwnd, dwReserved, cIDs, pGestureConfig, cbSize); } }; #endif