节包含有关 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);
}
本文介绍Windows Touch API中的WM_GESTURE和WM_GESTURENOTIFY消息,包括各种笔势命令及其处理方式,如缩放、平移、旋转等,并提供了示例代码。
1156

被折叠的 条评论
为什么被折叠?



