windows7触屏操作API

windows7触屏操作API

每当用户触摸触敏式 Windows 7 设备时,Windows 7 多点触控平台都会向您的应用程序发送手势消息 WM_GESTURE。这是现成的免费行为,如果您希望停止接收此类消息,则需要选择退出。 手势被视为单指或双指触控输入,可以转换为用户执行的某种预定义操作(手势)。一旦检测到手势(操作系统为您进行所有检测),操作系统就会向应用程序发送手势消息。此消息包含解码和进行操作所需的全部信息。Windows 7 支持下列手势:

  • 缩放
  • 单指和双指平移
  • 旋转
  • 双指点击
  • 按下并点击

处理 WM_Gesture 消息  要使用手势,必须处理发送到应用程序的 WM_GESTURE 消息。如果您是 Win32 程序员,可以在应用程序的 WndProc 函数中检查 WM_GESTURE 消息。 WM_GESTURE 是用于所有手势的通用消息。因此,要确定需要处理的手势,您首先需要对手势消息进行解码。有关手势的信息可在 lParam 参数中找到,您需要使用一个特殊函数 GetGestureInfo 来解码手势消息,如下面的代码片段中所示。 [cpp] view plain copy print

  1. GESTUREINFO gi;  
  2. ZeroMemory(&gi, sizeof(GESTUREINFO));  
  3. gi.cbSize = sizeof(gi);  
  4. BOOL bResult = GetGestureInfo((HGESTUREINFO)lParam, &gi);  

获取 GESTUREINFO 结构后,可以检查 dwID 以确定执行了哪个手势。GESTUREINFO 结构包含几个其他重要成员:

  • cbSize – 结构大小(以字节为单位)
  • ptsLocation – 一个 POINTS 结构,其中包含与手势相关的坐标。这些坐标始终都相对于屏幕的原点
  • dwFlags – 手势的状态,例如开始、延时和结束
  • ullArguments – 一个 64 位无符号整数,其中包含手势的参数,组合为八字节。这是额外信息,对于每个手势类型都是唯一的

继续操作并编写用于处理所有手势的完整 switch-case 方法

 

[cpp] view plain copy print embed id=”ZeroClipboardMovie_2″ src=”https://csdnimg.cn/public/highlighter/ZeroClipboard.swf” loop=”false” menu=”false” quality=”best” bgcolor=”#ffffff” width=”16″ height=”16″ name=”ZeroClipboardMovie_2″ align=”middle” allowscriptaccess=”always” allowfullscreen=”false” type=”application/x-shockwave-flash” pluginspage=”http://www.macromedia.com/go/getflashplayer” flashvars=”id=2&width=16&height=16″ wmode=”transparent”>

  1. void CMTTestDlg::DecodeGesture(WPARAM wParam, LPARAM lParam)  
  2. {  
  3.     GESTUREINFO gi;   
  4.     ZeroMemory(&gi, sizeof(GESTUREINFO));  
  5.     GetGestureInfo((HGESTUREINFO)lParam, &gi);  
  6.     switch (gi.dwID){  
  7.         case GID_ZOOM:  
  8.             // Code for zooming goes here   
  9.             break;  
  10.         case GID_PAN:  
  11.             break;  
  12.         case GID_ROTATE:  
  13.             break;  
  14.         case GID_TWOFINGERTAP:  
  15.             break;  
  16.         case GID_PRESSANDTAP:  
  17.             break;  
  18.         default:  
  19.             // You have encountered an unknown gesture   
  20.             break;  
  21.     CloseGestureInfoHandle((HGESTUREINFO)lParam);  
  22. }  

 

 

请注意,在函数的末尾,我们调用了   CloseGestureInfoHandle  函数,用于关闭与手势信息处理程序相关联的资源。如果处理 WM_GESTURE 消息,则您要确保使用此函数来关闭句柄。不这么做可能会导致内存泄漏。 处理手势消息具有一个固定流程,包括配置、解码手势消息以及根据应用程序的需要处理特定手势。正如您在以上代码中看到的那样,执行这个流程并不很难。

 

现在,让我们来详细了解缩放手势,通过这种手势,您也可以大致了解所有其他手势的工作原理。 使用缩放手势缩放对象缩放手势通常被用户视为两个接触点之间的“挤压”运动,您可以将手指相互靠近以缩小内容显示,或者将手指分开以放大内容显示。使用缩放手势,您可以缩放对象的大小。 图   说明了缩放手势的使用方式

windows7触屏操作API
  1. case GID_ZOOM:  
  2. switch(gi.dwFlags)  
  3. {  
  4. case GF_BEGIN:  
  5.     _dwArguments = LODWORD(gi.ullArguments);  
  6.     _ptFirst.x = gi.ptsLocation.x;  
  7.     _ptFirst.y = gi.ptsLocation.y;  
  8.     ScreenToClient(hWnd,&_ptFirst);  
  9.     break;  
  10. default:  
  11.     // We read here the second point of the gesture. This is middle point between fingers.    
  12.     _ptSecond.x = gi.ptsLocation.x;  
  13.     _ptSecond.y = gi.ptsLocation.y;  
  14.     ScreenToClient(hWnd,&_ptSecond);  
  15.     // We have to calculate zoom center point    
  16.     ptZoomCenter.x = (_ptFirst.x + _ptSecond.x)/2;  
  17.     ptZoomCenter.y = (_ptFirst.y + _ptSecond.y)/2;             
  18.       
  19.     // The zoom factor is the ratio between the new and the old distance.    
  20.     k = (double)(LODWORD(gi.ullArguments))/(double)(_dwArguments);  
  21.     // Now we process zooming in/out of the object   
  22.     ProcessZoom(k,ptZoomCenter.x,ptZoomCenter.y);  
  23.     InvalidateRect(hWnd,NULL,TRUE);  
  24.   
  25.     // Now we have to store new information as a starting information for the next step   
  26.     _ptFirst = _ptSecond;  
  27.     _dwArguments = LODWORD(gi.ullArguments);  
  28.     break;  
  29. }  
  30. break;  

来源:DennisThink

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2013年10月6日
下一篇 2013年10月7日

相关推荐