您的位置:首页 > 其它

多点触摸第一个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();
}

可编译一下,然后我们就可以体验多点触摸的新鲜感!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: