北京时间12月04日消息,中国触摸屏网讯, 多点触控(Multi Touch)是微软新一代作业系统Windows 7较受关注的特点之一,本文将使用Visual C# 2008建立一个Windows Form应用程式,并说明如何取得触控动作相关资讯。
本文来自:http://www.51touch.com/touchscreen/news/front/200912/04-4057.html
在Windows 7的Home Premium、Professional、Enterprise和Ultimate版本中,只要搭配支援多点触控的硬体即可使用多点触控功能。而应用程式方面,对触控的支援则可分为三个等级:Good、Better和Best(请参考表1)。
Good等级表示不需要修改程式码可直接支援数个基本的手势;Better等级要能针对各种不同的手势做出合理自然的互动;Best等级则是使用更进阶的功能处理更详细的资讯,自订各种触控操作经验。
Windows 7支援的手势有9种(参考表2),我们可以看到除了Rotate和Two-Finger Tap之外,其馀手势都可以对应到传统的滑鼠或键盘的操作,也就是说应用程式不需大幅修改既有的程式,即可支援Windows 7大部分的手势,然而你也可以在程式中重新定义这些手势所对应的动作。
如何取得设备资讯?
在开始处理触控动作前,你可以呼叫GetSystemMetrics并传入SM_DIGITIZER来得知目前电脑的触控支援能力(参考程式1),根据GetSystemMetrics的传回值,即可得知相关资讯(参考表3)。若你没有适当的触控硬体,可以使用Multi-Touch Vista这个软体搭配2隻滑鼠模拟2点输入。
如何取得触控讯息?
为了支援触控动作,Windows 7定义了2个新的视窗讯息:WM_GESTURE与WM_TOUCH。Windows 7中的视窗预设只会收到WM_GESTURE讯息,若呼叫了RegisterTouchWindow之后则会变成只会收到WM_TOUCH讯息,然而本文将专注于探讨WM_GESTURE讯息。
由于目前的WinForm尚未将这2个讯息转换为控制项的事件,所以为了处理这2个讯息,最直接的方式就是覆写控制项的WndProc方法。在本文的范例中,我们覆写Form的WndProc方法,如此便能处理表单上的触控动作(参考程式2)。
若你要让其他控制项支援触控动作,则必须另外继承该控制项,并覆写其WndProc方法,或是在表单的WndProc方法中实作判断触控目的控制项的逻辑。
在收到一个手势的第一个WM_GESTURE讯息前,程式会先收到一个WM_GESTURENOTIFY讯息,你可以在此时呼叫SetGestureConfig并带入GESTURECONFIG结构,设定目前要接受或忽略哪些手势。
也可以在视窗一载入时就先设定好(参考程式3)。视窗预设不会收到关于Rotate手势的讯息,若想收到所有手势的讯息则必须呼叫 SetGestureConfig 做设定,详细的设定项目请参考:http://msdn.microsoft.com/library/dd353241.aspx。
如何解读触控资讯?
在手势作用的过程中成是会收到多个WM_GESTURE讯息,其所带的参数可用来取得GESTUREINFO结构(参考程式4),其中比较重要的部分是dwFlags、dwID、ptsLocation以及ullArguments。dwID可用来分辨是哪种手势(参考表4),dwFlags表示手势的状态(开始、惯性动作、停止),ptsLocation及ullArguments则根据不同的手势有不同的意义,详细资讯请参考:http://msdn.microsoft.com/library/dd353242.aspx。
在此我们只看到5种Gesture ID,但前文却提到了9种手势,这是因为Flicks (笔触,根据滑动方向提供一组功能)是对应到Pan手势或键盘动作,而其他3种手势只会引发单纯的滑鼠事件。在滑鼠事件处理常式中,利用GetMessageExtraInfo可得知事件是由滑鼠还是触控所产生,进而做不同的处理(参考程式5)。
本文中的范例会于收到WM_GESTURE讯息时,在DecodeGesture方法中利用GetGestureInfo来取得与手势相关的GESTUREINFO结构,并根据不同的手势做对应的动作(参考程式6)。需注意的是,处理完之后必须呼叫CloseGestureInfoHandle关闭GESTUREINFO的handle,否则会造成记忆体遗漏。
处理Pan手势的小技巧
在处理Pan手势时,为了避免Windows将手势误判为Flicks,造成不良的使用经验,最好暂时关闭Flicks的功能。此动作可以在控制项载入时就呼叫SetProp进行设定(参考程式7),或是在WndProc中收到WM_TABLET_QUERYSYSTEMGESTURESTATUS讯息时设定m.Result为TABLET_DISABLE_FLICKS(参考程式8)。其他可设定的项目请参考http://msdn.microsoft.com/en-us/library/bb969148.aspx。
结语
了解以上处理WM_GESTURE讯息的方式之后,即可试著阅读并修改Windows 7 SDK中的MTGestures范例程式。该范例会在表单上绘製一个长方形,并依据不同的手势对表单上的长方形做出不同的动作。