多点触摸第一个MFC程序
2010-12-12 18:10
375 查看
一.运行条件:
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();
}
可编译一下,然后我们就可以体验多点触摸的新鲜感!
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();
}
可编译一下,然后我们就可以体验多点触摸的新鲜感!
相关文章推荐
- Windows Touch多点触摸MFC程序
- 第一个MFC程序
- 我的第一个MFC HelloWord程序
- 一起学MFC(三)第一个MFC程序
- 我的第一个MFC程序
- MFC下使用Ribbon(我的第一个有Ribbon的程序!)
- 我的第一个MFC程序
- 从零开始学MFC(2)——编写第一个MFC程序
- 用Visual Studio做第一个MFC程序
- 我的第一个MFC程序
- MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(01)
- 第一个MFC程序“Hello, World!”(vs2008)
- 我的第一个MFC的ArcGIS Engine程序
- 终于手动做好了第一个稍微有的形状的MFC程序~一个简陋的图形绘图工具收藏(更新至1.1版)
- MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(02)
- MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(04)
- 第一个MFC小程序总结
- MFC的第一个程序Hello World, Hello MFC
- MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(03)
- MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(05)