当前位置: 首页 > 图文教程 > 操作系统 > Windows > 双手玩电脑 Windows7系统双指触控API揭秘

Windows
被忽略的Windows Server 2008几大特性
Windows下20个省力的特殊的执行命令
解决新安装Windows XP后键盘不可用问题
禁止他人使用机器中的某个软件的方法
让Windows XP更快 只需屏蔽五项功能
保留原装系统轻松搞定HP笔记本分区
微软发布Windows HPC Server 2008
XP的一个无敌命令 替换正在使用文件
Windows 7功能清单被泄漏 内容极为丰富
关于Windows XP SP3 的常见问题解答
加强Windows操作系统安全性的十大建议
解除远程管理Windows XP SP2的烦恼
如何用光盘修复SATA硬盘的分区表
Windows 2000中的加密技术被发现漏洞
Windows优化助手正在测试 功能新颖
五种方法解决XP系统无法停止通用卷设备
申请Windows 2008 Beta 3激活码的方法
IT企业:如果不选Vista,就选OS X
Windows操作系统中几个故障的解决方法
Windows 2008 Beta 3激活码申请方法

双手玩电脑 Windows7系统双指触控API揭秘


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-01-30   浏览: 79 ::
收藏到网摘: n/a

  Windows 7有一些酷炫的功能是XP、Vista系统没有的,例如窗口分组预览、快速隐藏桌面图标、摇走其他窗口……这些酷炫的功能是怎么设计的?我们开发的个人软件如何使用这些功能,给用户带来惊喜?

  在《少数派报告》中阿汤哥直接用双指在触摸屏上操作程序,酷毙了。这种功能Win 7也支持,只要有触摸设备,我们也可以在Win 7上用双手玩转电脑。双指触控如缩放、双指放大、双指翻页等特效都可以在Win 7中实现。

  常用的两种手势

  1.缩放手势

  缩放手势用于界面放大或缩小,在浏览图片、文章阅读等程序中常常会用到。双指缩放的手势如图1所示:双指并拢置于窗体中,一指向上滑动,一指向下滑动,这是放大,双指分开置于窗体上,两指向中间滑动,则是缩小。

不用鼠标 用双指掌控Windows 7


  程序要识别出这个手势,第一步,要得到手指点到屏幕的消息。第二步,根据两指的坐标计算出距离,根据一个经验值对两指距离进行比较,来得到这是两指分开或两指并拢。第三步,可以根据一个定时器来实时捕捉手指点的坐标,来计算出移动方向及速率,进一步就可判断出两指是反向滑动还是相向滑动。

  2.平移手势

  平移手势往往用于导航。例如在一个图片查看程序中,使用向左平移手势可以导航到上一张,使用向右平移手势导航到下一张图片。平移手势如图2所示:双指同时向左滑动,或向右滑动。如何区分用户是要改变图片的位置还是翻页呢?这里必须使用到加速度。

不用鼠标 用双指掌控Windows 7


  可以在一个定时器中实时捕捉手指坐标,计算出速率和加速度,可以通过一个经验值去和加速度比较,当加速度比较大的时候,可以认为是翻页,反之则是拖动。当然,这还不够,当拖动时,还需要进一步判断是否到达程序边界,如果到达边界,也认为是翻页。对于翻页的处理,向左快速移动或到达左边界,则认为是上一页。

  双指触控API揭秘

  双指触控的核心是把原始触摸数据放入运动模型中去计算,以识别出用户的手势。原始触摸数据可以从WM_TOUCH消息中得到。通过WM_TOUCH识别出缩放和平移手势。

  第一步:检查多点触控硬件

  这里使用GetSystemMetrics  API来获取硬件是不是就绪:

  BYTE digitizerStatus = (BYTE)GetSystemMetrics(SM_DIGITIZER);
  if ((digitizerStatus & (0x80 + 0x40)) == 0){
  //没检测到多点触控设备或设备没有就绪
  }
  //检查设备支持几个触摸点,需要注意的是目前Win 7对2个触摸点支持得比较好
  BYTE nInputs = (BYTE)GetSystemMetrics(SM_MAXIMUMTOUCHES);

  第二步:切换到原始触摸消息

  在默认情况下,Win 7默认提供 WM_GESTURE(手势)消息。这个手势是系统根据原始触摸数据来识别的手势,使用 RegisterTouchWindow API函数可让系统返回WM_TOUCH原始触摸输入消息,核心代码:

  RegisterTouchWindow(hWnd, 0)) //hwnd为当前窗口的句柄。

  第三步:得到原始触摸数据

  使用GetTouchInputInfo API得到原始触摸数据,核心代码:

  GetTouchInputInfo((HTOUCHINPUT)lParam,numInputs,ti,sizeof(TOUCHINPUT)))
  numInputs为预先声明的变量,用于存储有几个触摸点,如果是5个手指同时在屏幕滑动,那么numInputs就为5。
  ti是TOUCHINPUT结构,其包含了触点的X和Y坐标、发生时间、触摸类型(类似于鼠标按下、鼠标移动、鼠标释放等)。

  for(unsigned int i=0; i<numInputs; ++i){ //根据触摸输入点循环
  if (ti[i].dwFlags & TOUCHEVENTF_DOWN){
  OnTouchDownHandler(hWnd, ti[i]);//交给触点按下函数处理
  }else if (ti[i].dwFlags & TOUCHEVENTF_MOVE){
  OnTouchMoveHandler(hWnd, ti[i]);//交给触点移动函数处理
  }else if (ti[i].dwFlags & TOUCHEVENTF_UP){
  OnTouchUpHandler(hWnd, ti[i]);} //交给触点释放函数处理
  }

  这里的触点按下、移动、释放等函数,实际上是一个运动仿真模型,我们在模型中,要将触点的轨迹生成若干条运动曲线,并计算出每个点的方位角、速率、法向加速度、切向加速度等,以识别出具体的手势。

  小知识:让程序支持多点触控最简单的方法是用Win 7的手势识别功能,主要用到以下API:
  GetSystemMetrics,用于检查多点触控硬件设备是否存在并就绪。
  GetGestureInfo,用于获取手势类型及相关数据。