节包含有关 Windows Touch 笔势的通知。
本节中指定了以下通知。
通知 | 说明 |
---|---|
WM_GESTURE | 发送到窗口过程以传递有关笔势的信息。 |
WM_GESTURENOTIFY | 为您提供设置笔势配置的机会。 |
WM_GESTURE 消息
传递有关笔势的信息。MFC的CWnd类已经加载了这个消息,以虚函数的方式供集成的类使用,函数声明为LRESULT OnGesture(WPARAM wParam, LPARAM lParam);然后分配指派手势的不同虚函数执行相应的手势代码。
参数
- wParam
-
提供标识笔势命令和特定于笔势的参数值的信息。此信息是在 GESTUREINFO 结构中的 ullArguments 成员中传递的相同信息。
- lParam
-
提供标识笔势命令和特定于笔势的参数值的信息的句柄。可通过调用 GetGestureInfo 检索此信息。
返回值
如果应用程序处理此消息,则它应返回 0。
如果应用程序不处理此消息,则它必须调用 DefWindowProc。不执行此操作将导致应用程序泄露内存,因为将不会关闭触控输入句柄,并且将不会释放关联的进程内存。
评论
下表列出了支持的笔势命令。
笔势 ID | 值 (dwID) | 说明 |
---|---|---|
GID_BEGIN | 1 | 指示泛型笔势已开始。 |
GID_END | 2 | 指示泛型笔势已结束。 |
GID_ZOOM | 3 | 指示缩放开始、缩放移动或缩放停止。第一条 GID_ZOOM 命令消息开始缩放但不会导致任何缩放。第二条 GID_ZOOM 命令触发与第一条 GID_ZOOM 中包含的状态相关的缩放。 |
GID_PAN | 4 | 指示平移移动或平移开始。第一条 GID_PAN 命令指示平移开始但不会执行任何平移。在出现第二条 GID_PAN 命令消息时,应用程序将开始平移。 |
GID_ROTATE | 5 | 指示旋转移动或旋转开始。第一条 GID_ROTATE 命令消息指示旋转移动或旋转开始但不会进行旋转。第二条 GID_ROTATE 命令消息将触发与第一条 GID_ROTATE 中包含的状态相关的旋转操作。 |
GID_TWOFINGERTAP | 6 | 指示双指点击笔势。 |
GID_PRESSANDTAP | 7 | 指示按住并点击笔势。可以用来表示鼠标的右键动作。 |
注意 若要启用旧版支持,必须使用 DefWindowProc 转发带有 GID_BEGIN 和 GID_END 笔势命令的消息。
下表指示在 lParam 和 wParam 参数中传递的笔势参数。
笔势 ID | 笔势 | ullArgument | GestureInfo 结构中的 ptsLocation |
---|---|---|---|
GID_ZOOM | 放大/缩小 | 指示两个点之间的距离。 | 指示缩放中心。 |
GID_PAN | 平移 | 指示两个点之间的距离。 | 指示平移的当前位置。 |
GID_ROTATE | 旋转(支点) | 指示旋转角度(如果设置了 GF_BEGIN 标志)。否则,它是自旋转开始后的角度更改。此值将使用正负符号指示旋转的方向。使用 GID_ROTATE_ANGLE_FROM_ARGUMENT 和GID_ROTATE_ANGLE_TO_ARGUMENT 宏获取和设置角度值。 | 这将指示旋转的中心,即目标对象绕其旋转的固定点。 |
GID_TWOFINGERTAP | 双指点击 | 指示两个手指之间的距离。 | 指示两个手指的中心。 |
GID_PRESSANDTAP | 按住并点击 | 指示第一个手指和第二个手指之间的增量。此值将存储在 POINT 结构中的 ullArgument 的低 32 位中。 | 指示第一个手指按住的位置。 |
注意 所有距离和位置都以物理屏幕坐标形式提供。
注意 只应将 dwID 和 ullArgument 参数视为随 GID_* 命令附带,并且应用程序不应更改这些参数。
示例
以下代码演示如何获取与此消息关联的特定于笔势的信息。
注意 应始终将未处理的消息转发给 DefWindowProc,并应关闭已通过调用 CloseGestureInfoHandle 处理的消息的笔势输入句柄。在此示例中,将禁止显示默认的笔势处理程序行为,因为每个笔势用例中已关闭 TOUCHINPUT 句柄。如果在上面的代码中删除未处理的消息的用例,则默认笔势处理程序会通过在默认用例中将消息转发给 DefWindowProc 来处理消息。
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); } }
WM_GESTURENOTIFY 消息
为您提供设置笔势配置的机会。
参数
- wParam
-
未使用。
- lParam
-
一个指向 GESTURENOTIFYSTRUCT 的指针。
返回值
应从 DefWindowProc 返回一个值。
评论
当接收到 WM_GESTURENOTIFY 消息时,应用程序可使用 SetGestureConfig 指定要接收的笔势。始终应使用 DefWindowProc 函数向上冒泡传递此消息。
注意 处理 WM_GESTURENOTIFY 消息将更改窗口生存期内(而不仅仅是下一个笔势)的笔势配置。
示例
以下示例演示了如何启用所有笔势。有关更多示例,请参见 SetGestureConfig。
switch (message) { case WM_GESTURENOTIFY: GESTURECONFIG gc = {0,GC_ALLGESTURES,0}; BOOL bResult = SetGestureConfig(hWnd,0,1,&gc,sizeof(GESTURECONFIG)); if(!bResult) { // an error } return DefWindowProc(hWnd, WM_GESTURENOTIFY, wParam, lParam); }