Windows Touch多点触摸MFC程序
2013-05-05 09:12
302 查看
一.运行条件:WIN7系统,WIN7 SDK v7.0,VS2008二.添加多点触摸代码:(1)在***View.h中添加几个手势有关的数据成员和成员函数:
注:以下函数都在***View.cpp中:(2) 初始化InitGesture():
注意,初始化非常重要,而且如果想让程序支持多点触摸和一个手指触摸,必须设置手势的阻塞,这样才能保证程序仍可以响应一个手指触摸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):
(4)处理多点触摸的主函数WndProcessGesture如下:
(5)多点触摸的主要的函数已经写好了,现在可以通过菜单来调用初始化函数GST_InitGesture(),或者在***View类的构造函数里调用GST_InitGesture().否则如果不调用初始化的话,则旋转和鼠标单击都无效.下面是在***View类的构造函数里调用GST_InitGesture():
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(); }可编译一下,然后我们就可以体验多点触摸的新鲜感!
相关文章推荐
- stdafx.h、stdafx.cpp是干什么用的?为什么我的每一个cpp文件都必须包含stdafx.h? Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编
- Windows编程之MFC窗口程序浅析
- MFC编程第一节:Windows程序内部运行原理
- Windows编程之MFC向导程序框架
- Windows编程入门(5)MFC程序最小托盘化
- Windows 7安装ArcGIS DeskTop10:错误1935,安装程序集“Microsoft.VC90.MFC,processorArchitecture…..”
- VC/MFC程序中获取当前Windows操作系统版本名称(2016-04-25修改)
- MFC基础:Windows内部程序运行原理
- MFC视频教程(孙鑫)学习笔记1-Windows程序内部运行原理
- 基于MFC编写Windows服务程序
- MFC(一)——Windows程序内部运行原理
- windows mfc 程序,不同程序通信和互斥
- MFC入门(一)-- 第一个简单的windows图形化界面小程序(打开计算器,记事本,查IP)
- MFC Windows 程序设计->WinMain 简单Windows程序 命令行编译
- MFC第一个例子 -- windows程序运行原理
- 如何在非MFC程序中使用MFC类——解决#error : WINDOWS.H already included.
- Windows下MFC程序利用LockCop解决死锁
- windows程序及MFC简介
- stdafx.h、stdafx.cpp是干什么用的?为什么我的每一个cpp文件都必须包含stdafx.h? Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编
- 用MFC编写windows程序——CListCtrl & CSliderCtrl