现在的位置: 首页 > 综合 > 正文

Windows Touch的WM_GESTURE与WM_GESTURENOTIGY消息-中文整理

2013年02月11日 ⁄ 综合 ⁄ 共 3080字 ⁄ 字号 评论关闭

节包含有关 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);
    }

抱歉!评论已关闭.