Windows Touch多点触摸MFC程序

一.运行条件:

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();
}

可编译一下,然后我们就可以体验多点触摸的新鲜感!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值