本节包含有关 Windows Touch 笔势的结构。
本节中指定了以下结构。
结构 | 说明 |
---|---|
GESTURECONFIG | 用于设置启用或禁用哪些笔势消息的配置。 |
GESTUREINFO | 包含有关笔势的信息。 |
GESTURENOTIFYSTRUCT | 包含有关 WM_GESTURENOTIFY 通知的信息。 |
GESTURECONFIG 结构
获取和设置用于启用笔势消息的配置以及此配置的类型。
语法
typedef struct _GESTURECONFIG { DWORD dwID; DWORD dwWant; DWORD dwBlock; } GESTURECONFIG, *PGESTURECONFIG;
成员
-
dwID
-
将启用或禁用消息的配置类型的标识符。有关更多信息,请参见“备注”。
dwWant
-
要启用的消息。
dwBlock
-
要禁用的消息。
评论
无法禁用双指平移并保留单指平移。必须先为 GC_PAN 设置所需的位,然后才能为 GC_PAN_WITH_SINGLE_FINGER_HORIZONTALLY 或 GC_PAN_WITH_SINGLE_FINGER_VERTICALLY 设置它们。
如果已通过调用 SetGestureConfig 来禁用延时,则带 GF_END 标志的 GID_PAN 消息中将包含延时矢量。
当传递此结构时,dwID 成员将包含有关一组笔势的信息。这将确定其他标志的含义。如果为平移消息设置标志,则这些标志将与为旋转消息设置的标志不同。
下表指示 GESTURECONFIG 结构的 dwID 成员支持的笔势的各种标识符。请注意,若将 dwID 设置为 0,则指示设置全局笔势配置标志。
名称 | 值 | 说明 |
---|---|---|
GID_ZOOM | 3 | 指示缩放笔势的配置设置。 |
GID_PAN | 4 | 指示平移笔势。 |
GID_ROTATE | 5 | 指示旋转笔势。 |
GID_TWOFINGERTAP | 6 | 指示双指点击笔势。 |
GID_PRESSANDTAP | 7 | 指示按住并点击笔势。 |
当 dwID 设置为 0 时使用以下标志。
名称 | 值 | 说明 |
---|---|---|
GC_ALLGESTURES | 0x00000001 | 指示所有笔势。 |
当 dwID 设置为 GID_ZOOM 时使用以下标志。
名称 | 值 | 说明 |
---|---|---|
GC_ZOOM | 0x00000001 | 指示缩放笔势。 |
当 dwID 设置为 GID_PAN 时使用以下标志。
名称 | 值 | 说明 |
---|---|---|
GC_PAN | 0x00000001 | 指示所有平移笔势。 |
GC_PAN_WITH_SINGLE_FINGER_VERTICALLY | 0x00000002 | 指示单指垂直平移。 |
GC_PAN_WITH_SINGLE_FINGER_HORIZONTALLY | 0x00000004 | 指示单指水平平移。 |
GC_PAN_WITH_GUTTER | 0x00000008 | 将垂直移动限制为向主方向进行,直至达到某个阈值以突破槽。 |
GC_PAN_WITH_INERTIA | 0x00000010 | 指示带有延时的平移以便在平移笔势停止时平滑地慢慢停止。 |
注意 在 SetGestureConfig 中设置 GID_PAN 标志将影响用于平移的默认笔势处理程序。不应为相同的标志同时设置 dwWant 和 dwBlock;这将导致出现意外行为。有关平移和旧版平移支持的更多信息,请参见 Windows Touch 笔势;有关启用和阻止笔势的示例,请参见 SetGestureConfig。
当 dwID 设置为 GID_ROTATE 时使用以下标志。
名称 | 值 | 说明 |
---|---|---|
GC_ROTATE | 0x00000001 | 指示旋转笔势。 |
当 dwID 设置为 GID_TWOFINGERTAP 时使用以下标志。
名称 | 值 | 说明 |
---|---|---|
GC_TWOFINGERTAP | 0x00000001 | 指示双指点击笔势。 |
当 dwID 设置为 GID_PRESSANDTAP 时使用以下标志。
名称 | 值 | 说明 |
---|---|---|
GC_PRESSANDTAP | 0x00000001 | 指示按住并点击笔势。 |
示例
GESTURECONFIG gc[3]; UINT uiGcs = 3; ZeroMemory(&gc, sizeof(gc)); gc[0].dwID = GID_ZOOM; gc[1].dwID = GID_ROTATE; gc[2].dwID = GID_PAN; BOOL bResult = GetGestureConfig(hWnd, 0, 0, &uiGcs, gc, sizeof(GESTURECONFIG)); if (!bResult){ DWORD err = GetLastError(); }
GESTUREINFO 结构
存储有关笔势的信息。
语法
typedef struct _GESTUREINFO { UINT cbSize; DWORD dwFlags; DWORD dwID; HWND hwndTarget; POINTS ptsLocation; DWORD dwInstanceID; DWORD dwSequenceID; ULONGLONG ullArguments; UINT cbExtraArgs; } GESTUREINFO, *PGESTUREINFO;
成员
-
cbSize
-
结构的大小(以字节为单位)。调用方必须将此成员设置为
sizeof(GESTUREINFO)
。
dwFlags
-
笔势的状态。有关其他信息,请参见“备注”。
dwID
-
笔势命令的标识符。
hwndTarget
-
此笔势面向的窗口的句柄。
ptsLocation
-
POINTS 结构,其中包含与笔势关联的坐标。这些坐标总是相对于屏幕原点。
dwInstanceID
-
结构的内部使用的标识符。
dwSequenceID
-
序列的内部使用的标识符。
ullArguments
-
一个 64 位无符号整数,其中包含适合 8 个字节的笔势参数。
cbExtraArgs
-
此笔势附带的外部参数的大小(以字节为单位)。
评论
ullArguments 成员的 HIDWORD 始终为 0,但存在以下例外情况:
- 对于 GID_PAN,除非存在延时,否则它为 0。若设置 GF_INERTIA,则 HIDWORD 为一个延时矢量(两个 16 位值)。
- 对于 GID_PRESSANDTAP,它是两个点之间的距离。
通过将笔势信息结构的句柄传递给 GetGestureInfo 函数来检索 GESTUREINFO 结构。
以下标志指示笔势的各种状态,这些标志存储在 dwFlags 中。
名称 | 值 | 说明 |
---|---|---|
GF_BEGIN | 0x00000001 | 笔势已开始。 |
GF_INERTIA | 0x00000002 | 笔势已触发延时。 |
GF_END | 0x00000004 | 笔势已完成。 |
注意 大多数应用程序将忽略 GID_BEGIN 和 GID_END 消息,并会将它们传递到 DefWindowProc。默认的笔势处理程序将使用这些消息。当第三方应用程序使用 GID_BEGIN 和 GID_END 消息时,应用程序行为将是不确定的。
下表指示笔势的各种标识符。
名称 | 值 | 说明 |
---|---|---|
GID_BEGIN | 1 | 笔势已开始。 |
GID_END | 2 | 笔势已结束。 |
GID_ZOOM | 3 | 缩放笔势。 |
GID_PAN | 4 | 平移笔势。 |
GID_ROTATE | 5 | 旋转笔势。 |
GID_TWOFINGERTAP | 6 | 双指点击笔势。 |
GID_PRESSANDTAP | 7 | 按住并点击笔势。 |
注意 GID_PAN 笔势具有内置延时。在平移笔势结束时,操作系统将创建其他平移笔势消息。
定义以下类型以表示指向 GESTUREINFO 结构的常量指针。
typedef GESTUREINFO const * PCGESTUREINFO;
示例
LRESULT DecodeGesture(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ // Create a structure to populate and retrieve the extra message info. GESTUREINFO gi; ZeroMemory(&gi, sizeof(GESTUREINFO)); gi.cbSize = sizeof(GESTUREINFO); BOOL bResult = GetGestureInfo((HGESTUREINFO)lParam, &gi); BOOL bHandled = FALSE; if (bResult){ // now interpret the gesture switch (gi.dwID){ case GID_ZOOM: // Code for zooming goes here bHandled = TRUE; break; case GID_PAN: // Code for panning goes here bHandled = TRUE; break; case GID_ROTATE: // Code for rotation goes here bHandled = TRUE; break; case GID_TWOFINGERTAP: // Code for two-finger tap goes here bHandled = TRUE; break; case GID_PRESSANDTAP: // Code for roll over goes here bHandled = TRUE; break; default: // A gesture was not recognized break; } }else{ DWORD dwErr = GetLastError(); if (dwErr > 0){ //MessageBoxW(hWnd, L"Error!", L"Could not retrieve a GESTUREINFO structure.", MB_OK); } } if (bHandled){ return 0; }else{ return DefWindowProc(hWnd, message, wParam, lParam); } }
GESTURENOTIFYSTRUCT 结构
当使用 WM_GESTURENOTIFY 消息进行传输时,将传递有关笔势的信息。
语法
typedef struct tagGESTURENOTIFYSTRUCT { UINT cbSize; DWORD dwFlags; HWND hwndTarget; POINTS ptsLocation; DWORD dwInstanceID; } GESTURENOTIFYSTRUCT, *PGESTURENOTIFYSTRUCT;
成员
-
cbSize
-
结构的大小。
dwFlags
-
保留以供将来使用。
hwndTarget
-
笔势通知的目标窗口。
ptsLocation
-
笔势在物理屏幕坐标中的位置。
dwInstanceID
-
一个特定的笔势实例,其笔势消息以 GID_START 开始并以 GID_END 结束。