您的位置:首页 > 其它

Windows Touch多点触摸MFC程序

2013-05-05 09:12 302 查看
一.运行条件:WIN7系统,WIN7 SDK v7.0,VS2008二.添加多点触摸代码:(1)在***View.h中添加几个手势有关的数据成员和成员函数:
POINT _ptFirst;        // first significant point of gesture
POINT _ptSecond;       // second significant point of gesture
DWORD _dwID;      // current ID
ULONGLONG _dwArguments;    // this is holder for additional information about gesture event

注:以下函数都在***View.cpp中:(2) 初始化InitGesture():
//初始化手势,以使窗口能响应手势事件
void ChdHomeMDIView::GST_InitGesture()
{
    //初始化手势
    GESTURECONFIG config = { 0 };
    config.dwWant = GC_ROTATE;//支持旋转
    config.dwID = GID_ROTATE;
    config.dwBlock = 0;
 
    SetGestureConfig(
        GetSafeHwnd(),
        0,
        1,
        &config,
        sizeof(GESTURECONFIG)
        );
 
    config.dwID = GID_PAN;//支持单点鼠标移动,并且设置阻塞一个手指的单击并移动否则不能响应鼠标单击WM_LBUTTONDOWN和鼠标移动WM_MOUSEMOVE
    config.dwWant = GC_PAN;
 
    config.dwBlock = GC_PAN_WITH_GUTTER;
    config.dwBlock |= GC_PAN_WITH_SINGLE_FINGER_VERTICALLY;
    config.dwBlock |= GC_PAN_WITH_SINGLE_FINGER_HORIZONTALLY;
 
    //将窗口与手势设置相关联,使窗口能响应手势信息
    SetGestureConfig(
        GetSafeHwnd(),
        0,
        1,
        &config,
        sizeof(GESTURECONFIG)
        );
 
 
    //initialize datamember
    _dwID= GID_END;
    _dwArguments= 0;
}

注意,初始化非常重要,而且如果想让程序支持多点触摸和一个手指触摸,必须设置手势的阻塞,这样才能保证程序仍可以响应一个手指触摸WM_LBUTTON和WM_MOUSEMOVE.(3)添加像WIN32那样的事件处理函数WindowProc(UINT message, WPARAM wParam, LPARAM lParam);,步骤是:打开***View.h文件,在[属性]框中找到[重写],这里面有很多可以重载的系统函数,找到后面的WindowProc,添加即可,注意不能添加PreTranslateMsg,因为它只是预处理,可以识别WM_GESTURE,但没有解析出具体是哪种手势(GID_ZOOM,GID_ROTATE,or GID_PAN):
LRESULT ChdHomeMDIView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    // TODO: 在此添加专用代码和/或调用基类
       switch ( message)
       {
            
           case WM_GESTURE://多点触摸
              return GST_WndProcessGesture( GetSafeHwnd(), wParam, lParam);//调用触摸引擎的处理函数
               
 
              break;
 
           default:
 
              break;
       }
   
 
 
    return CView::WindowProc(message, wParam, lParam);
}

(4)处理多点触摸的主函数WndProcessGesture如下:
//处理手势
LRESULT ChdHomeMDIView::GST_WndProcessGesture(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
    POINT ptZoomCenter;
    double k;
 
    GESTUREINFO  gi;
    ZeroMemory(&gi,sizeof(GESTUREINFO));
    gi.cbSize = sizeof(GESTUREINFO);
    BOOL result = GetGestureInfo((HGESTUREINFO)lParam, &gi);
 
    //keep track if application has handled the gesture
    BOOL fGHandled = FALSE;
 
    if(result)
    {
        
       switch(gi.dwID)
       {
       case GID_BEGIN:
       case GID_END:
……
           break;    
 
       case GID_PAN://两个手指按下后移动
……
           //可调用移动的函数
           break;
      
       case GID_ZOOM:
           ……
           //可调用缩放的函数
           break;
 
       case GID_ROTATE:
           ……
           //可调用旋转的函数
           break;
      
       case GID_TWOFINGERTAP://二个手指双击
           break;
 
       default:     
           break;
       }
    }
 
    // Notify the system that this application has handled the gesture
    if (fGHandled)
    {
       CloseGestureInfoHandle((HGESTUREINFO)lParam);
    }
    //if the application did not handle the gesture, pass it back to the system
    else
    {
       ::DefWindowProc(hWnd, WM_GESTURE, wParam, lParam);
    }
 
    // redraw the window
    ::InvalidateRect(
       hWnd,
       NULL,
       FALSE
       );
    return
       (
       GID_ZOOM |
       GID_PAN |
       GID_ROTATE |
       GF_INERTIA |
       GID_TWOFINGERTAP
       ) << 1;
}

(5)多点触摸的主要的函数已经写好了,现在可以通过菜单来调用初始化函数GST_InitGesture(),或者在***View类的构造函数里调用GST_InitGesture().否则如果不调用初始化的话,则旋转和鼠标单击都无效.下面是在***View类的构造函数里调用GST_InitGesture():
ChdHomeMDIView::ChdHomeMDIView()
{
    ……
    GST_InitGesture();
}
可编译一下,然后我们就可以体验多点触摸的新鲜感!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: