代码改变世界

在Windows Mobile 6.5中使用手势

2010-12-21 21:15  MagicKing110  阅读(2062)  评论(3编辑  收藏  举报

作者:MSDN     日期:2009.12.28  译者:Mobile On Line

 

这个语言参考部分包含了对触摸事件、手势、以及手势动画等编程元素的描述。

触摸API分为两个部分,管理触摸输入的手势API,和控制显示区域如何对用户触摸作出反应的手势物理引擎API。

触摸函数、消息、以及结构体是与鼠标共享的,因为应用程序像处理鼠标左键单击一样处理手写笔事件。想了解其他触摸参考信息,请转到鼠标参考

索引

  • 触摸手势     介绍窗口触摸,并讨论如何在你的应用程序中实现触摸接口。
  • 手势参考(DTK)     这个API允许你的程序监视触摸输入并对触摸输入进行编程。
  • 物理引擎概览     介绍了物理引擎,以及在实现物理借口的时候如何使用它。
  • 物理引擎参考(DTK)     这个API控制屏幕如何对触摸输入作出响应,并允许你的应用程序像Shell一样响应触摸。

触摸手势

触摸手势被描述为你的手指或手写笔在屏幕上的控件或对象上作出的短暂、定向移动。大部分的手势是一个独立的点击。因此,他们都相当于一个finger–down(WM_LBUTTONDOWN)和finger–up (WM_LBUTTONUP)对。例外的是Double Tap,它包含两对短暂连续的finger–down(WM_LBUTTONDOWN)和finger–up (WM_LBUTTONUP)。手势的识别基于finger–down 和 finger–up事件,再加上方向、位置和被手势识别器计算出的速度。Windows Mobile支持如下五种手势。

手势 描述
Tap Tap表现为鼠标的左键单击。
当一个finger–down事件和一个finger–up事件在规定的时间段、特定的距离发生时,应用程序就会收到一个单独的GID_SELECT手势消息。在WM_LBUTTONDOWN事件之后,GID_SELECT消息之前,可能会有几个WM_MOUSEMOVE消息。
Double Tap Double Tap表现为鼠标的左键双击。
当两个finger–up事件在规定的时间段、特定的距离内发生时,应用程序会收到一个GID_DOUBLESELECT消息。
Hold 用户可以在屏幕上按下并保持不动以表示鼠标右击。
当手指保持按下超过规定的时间,并且所有的点都在特定距离内时,应用程序会收到一个GID_HOLD消息。当手指抬起或Hold时间达到界限时,会紧跟着一个GID_END消息。
Flick 用户可以移动手指划过屏幕以开始逐像素滚动,并且如果移动足够快的话,滚动在手指抬起后仍会继续。
在手指的滑动结束时,应用程序会收到一个独立的GID_SCROLL手势消息。Flick会频繁的发生在Pan之后(一个或多个GID_PAN消息之后,紧跟着一个GID_SCROLL消息,然后是一个GID_END消息)。
Pan 用户可以在屏幕上按下手指并保持按下状态,然后向任何方向拖动手指以表示鼠标拖动事件。
当手指位置改变的时候应用程序会收到一个或多个GID_PAN消息,紧接着在手指抬起时会收到一个GID_END消息。鼠标消息是和手势消息交替的。 Panning可以在Hold手势之后发生。

想了解更多关于GID_*的手势消息,请参考GESTUREINFO

手势识别引擎的系统架构是由一个附加了已存在的触摸事件的手势识别状态机组成的。触摸事件从Touch Screen Drivers传送到状态机中。当手势被识别的时候,一个窗口消息就会被发送到目标进程的消息队列中。

注意:呼叫SetCapture会改变手势的目标窗口。

手势事件通常在任何finger–up前被传递,从而使接收者可以通过调用TKGetGestureInfo并取消任何针对finger–up触摸事件的计划动作来处理这个手势。

窗口自动手势

自动手势使窗口内的控件和应用程序能自动处理Flick和Pan手势。你可以通过使用函数TKSetWindowAutoGestureTKGetWindowAutoGesture来控制手势处理。自动手势使将要发送给窗口程序的活动消息来管理Flick和Pan的交叉触发。你可以通过调用TKGetAnimateMessageInfo来取回这些消息。

 

手势参考(DTK)

窗口自动手势使窗口中的内容能够对Flick和Pan手势作出自动滚动的响应。这个语言参考部分包含了对这个技术编程要点的描述。

本节内容

  • 手势函数(DTK)    提供了对触摸手势相关函数的概览。
  • 手势结构体(DTK)     提供了对触摸手势相关结构体的概述。
  • 手势宏(DTK)     提供了对触摸手势相关的宏的概述。
  • 手势常数(DTK)     提供了对手势相关函数的概述。
  • 手势消息(DTK)     提供了对触摸手势相关消息的概述。

手势常数(DTK)

下面的常数作为GESTUREINFO结构体使用的命令。

名字 描述

GID_BEGIN

1 包含了标识触摸手势开始点的坐标。当屏幕被触摸时被发送。。

GID_END

2 包含了标识触摸手势结束点的坐标。当手指或手写笔离开屏幕时被发出。
GESTUREINFO的参数域经常被这个命令置为零。

GID_PAN

4 当用户按在窗口上,保持手指和屏幕接触并向任意方向移动时,Pan就会发生。识别引擎会发送一个包含起始位置及当前位置的GID_PAN消息。对每一个鼠标移动消息,都会发送一个新的GID_PAN消息,直到手指或手写笔离开窗口。GID_END被用于标识Pan移动的结束位置。
应用程序能够从两个连续的Pan手势之间的不同上计算出移动的轨迹。
如果GF_INERTIA标志被设置的话,GESTUREINFO的参数域的值就和GID_SCROLL是相同的。

GID_SCROLL

8 当用户在窗口上按下(或者划过屏幕),然后在手指或手写笔抬起之前迅速向任意方向移动时,Scroll就会发生。
识别引擎在Flick手势之后会发出GID_SCROLL消息。
GID_SCROLL被发送给接收当前触摸会话的第一个手势消息,如Pan消息或Hold消息的窗口。
GESTUREINFO的参数域包含了关于角度、方向及Flick速度的信息。
核心的方向用以下的值来表示:
  • ARG_SCROLL_NONE
  • ARG_SCROLL_RIGHT
  • ARG_SCROLL_UP
  • ARG_SCROLL_LEFT
  • ARG_SCROLL_DOWN 当设备旋转时,手势会进行调整以适应旋转。
    Flick的角度用0~65535的值来度量。
    下面的宏从原始角度中提取角度、方向和速度:
  • GID_SCROLL_ANGLE
  • GID_SCROLL_DIRECTION
  • GID_SCROLL_VELOCITY

    你可以用下面的宏在角度和弧度之间进行转换:GID_ROTATE_ANGLE_TO_ARGUMENT

    GID_ROTATE_ANGLE_FROM_ARGUMENT

  • GID_HOLD

    9 当用户在窗口上按下并保持手指或手写笔不动比Hold超时时间长时,Hold就会发生。
    识别引擎会发送一个GID_HOLD手势消息,并且在手指或手写笔抬起时紧跟着一个GID_END消息。
    Hold手势之后可以紧跟着一个生成若干GID_PAN消息的Pan移动,但是GID_HOLD消息是从来不会发生在GID_PAN消息之后的。

    GID_SELECT

    10 当用户用手指或手写笔拍击屏幕并且事件短于Select超时时间时,Selection就会发生。
    GESTUREINFO的参数域对这个命令是不可用的。

    GID_DOUBLESELECT

    11 当用户在少于特定的DOUBLESELECT超时时间内用手指或手写笔点击屏幕两次时,Selection就会发生。这个超时时间在连续的鼠标弹起事件之间。
    GESTUREINFO的参数域对这个命令是不可用的。

     

    手势函数(DTK)

     

    手势宏(DTK)

     

    手势消息(DTK)

     

    手势结构体(DTK)

     

    2010.4.12 补充说明:

     

    本来准备完整翻译这篇文档,可是今天突然发现这篇文档已经有朋友译过了。那我就没有必要再重复制造轮子,给互联网制造信息垃圾了。因此这篇文档的翻译就到此为止,不再继续了。

    • 要看完整译文请转到博客园这位朋友的博客Windows Mobile Space。 当然,这个主要针对本地代码开发,因为Gesture API是一个本地API。
    • 微软的两位工程师(Alex Yakhnin, Ron Buckton)对这两个本地API进行了封装,开源提供了他们的托管代码版本。你可以到这里下载Dll或源码Alex Yakhnin的博客页面上也提供了相应的WebCast视频教程链接。
    • MobileSide.cn的博文 《Windows Mobile 6.5 Gesture API 介绍》 介绍了Gesture API的入门知识,也简单介绍了对上面提到的托管封装的使用,可参考。 (因为看到作者的博客搬家通告,担心链接丢失,转了一份过来,也可以点此查看转载副本

     


    相关信息

    英文原文:Using Gestures in Windows Mobile 6.5

    中文译文:在Windows Mobile 6.5中使用手势

    中文翻译:Mobile On Line