北京時(shí)間12月04日消息,中國(guó)觸摸屏網(wǎng)訊, 多點(diǎn)觸控(Multi Touch)是微軟新一代作業(yè)系統(tǒng)Windows 7較受關(guān)注的特點(diǎn)之一,本文將使用Visual C# 2008建立一個(gè)Windows Form應(yīng)用程式,并說(shuō)明如何取得觸控動(dòng)作相關(guān)資訊。
本文來(lái)自:http://www.zc28898.cn/touchscreen/news/front/200912/04-4057.html
在Windows 7的Home Premium、Professional、Enterprise和Ultimate版本中,只要搭配支援多點(diǎn)觸控的硬體即可使用多點(diǎn)觸控功能。而應(yīng)用程式方面,對(duì)觸控的支援則可分為三個(gè)等級(jí):Good、Better和Best(請(qǐng)參考表1)。
Good等級(jí)表示不需要修改程式碼可直接支援?dāng)?shù)個(gè)基本的手勢(shì);Better等級(jí)要能針對(duì)各種不同的手勢(shì)做出合理自然的互動(dòng);Best等級(jí)則是使用更進(jìn)階的功能處理更詳細(xì)的資訊,自訂各種觸控操作經(jīng)驗(yàn)。
Windows 7支援的手勢(shì)有9種(參考表2),我們可以看到除了Rotate和Two-Finger Tap之外,其馀手勢(shì)都可以對(duì)應(yīng)到傳統(tǒng)的滑鼠或鍵盤的操作,也就是說(shuō)應(yīng)用程式不需大幅修改既有的程式,即可支援Windows 7大部分的手勢(shì),然而你也可以在程式中重新定義這些手勢(shì)所對(duì)應(yīng)的動(dòng)作。
如何取得設(shè)備資訊?
在開(kāi)始處理觸控動(dòng)作前,你可以呼叫GetSystemMetrics并傳入SM_DIGITIZER來(lái)得知目前電腦的觸控支援能力(參考程式1),根據(jù)GetSystemMetrics的傳回值,即可得知相關(guān)資訊(參考表3)。若你沒(méi)有適當(dāng)?shù)挠|控硬體,可以使用Multi-Touch Vista這個(gè)軟體搭配2隻滑鼠模擬2點(diǎn)輸入。
如何取得觸控訊息?
為了支援觸控動(dòng)作,Windows 7定義了2個(gè)新的視窗訊息:WM_GESTURE與WM_TOUCH。Windows 7中的視窗預(yù)設(shè)只會(huì)收到WM_GESTURE訊息,若呼叫了RegisterTouchWindow之后則會(huì)變成只會(huì)收到WM_TOUCH訊息,然而本文將專注于探討WM_GESTURE訊息。
由于目前的WinForm尚未將這2個(gè)訊息轉(zhuǎn)換為控制項(xiàng)的事件,所以為了處理這2個(gè)訊息,最直接的方式就是覆寫控制項(xiàng)的WndProc方法。在本文的范例中,我們覆寫Form的WndProc方法,如此便能處理表單上的觸控動(dòng)作(參考程式2)。
若你要讓其他控制項(xiàng)支援觸控動(dòng)作,則必須另外繼承該控制項(xiàng),并覆寫其WndProc方法,或是在表單的WndProc方法中實(shí)作判斷觸控目的控制項(xiàng)的邏輯。
在收到一個(gè)手勢(shì)的第一個(gè)WM_GESTURE訊息前,程式會(huì)先收到一個(gè)WM_GESTURENOTIFY訊息,你可以在此時(shí)呼叫SetGestureConfig并帶入GESTURECONFIG結(jié)構(gòu),設(shè)定目前要接受或忽略哪些手勢(shì)。
也可以在視窗一載入時(shí)就先設(shè)定好(參考程式3)。視窗預(yù)設(shè)不會(huì)收到關(guān)于Rotate手勢(shì)的訊息,若想收到所有手勢(shì)的訊息則必須呼叫 SetGestureConfig 做設(shè)定,詳細(xì)的設(shè)定項(xiàng)目請(qǐng)參考:http://msdn.microsoft.com/library/dd353241.aspx。
如何解讀觸控資訊?
在手勢(shì)作用的過(guò)程中成是會(huì)收到多個(gè)WM_GESTURE訊息,其所帶的參數(shù)可用來(lái)取得GESTUREINFO結(jié)構(gòu)(參考程式4),其中比較重要的部分是dwFlags、dwID、ptsLocation以及ullArguments。dwID可用來(lái)分辨是哪種手勢(shì)(參考表4),dwFlags表示手勢(shì)的狀態(tài)(開(kāi)始、慣性動(dòng)作、停止),ptsLocation及ullArguments則根據(jù)不同的手勢(shì)有不同的意義,詳細(xì)資訊請(qǐng)參考:http://msdn.microsoft.com/library/dd353242.aspx。
在此我們只看到5種Gesture ID,但前文卻提到了9種手勢(shì),這是因?yàn)镕licks (筆觸,根據(jù)滑動(dòng)方向提供一組功能)是對(duì)應(yīng)到Pan手勢(shì)或鍵盤動(dòng)作,而其他3種手勢(shì)只會(huì)引發(fā)單純的滑鼠事件。在滑鼠事件處理常式中,利用GetMessageExtraInfo可得知事件是由滑鼠還是觸控所產(chǎn)生,進(jìn)而做不同的處理(參考程式5)。
本文中的范例會(huì)于收到WM_GESTURE訊息時(shí),在DecodeGesture方法中利用GetGestureInfo來(lái)取得與手勢(shì)相關(guān)的GESTUREINFO結(jié)構(gòu),并根據(jù)不同的手勢(shì)做對(duì)應(yīng)的動(dòng)作(參考程式6)。需注意的是,處理完之后必須呼叫CloseGestureInfoHandle關(guān)閉GESTUREINFO的handle,否則會(huì)造成記憶體遺漏。
處理Pan手勢(shì)的小技巧
在處理Pan手勢(shì)時(shí),為了避免Windows將手勢(shì)誤判為Flicks,造成不良的使用經(jīng)驗(yàn),最好暫時(shí)關(guān)閉Flicks的功能。此動(dòng)作可以在控制項(xiàng)載入時(shí)就呼叫SetProp進(jìn)行設(shè)定(參考程式7),或是在WndProc中收到WM_TABLET_QUERYSYSTEMGESTURESTATUS訊息時(shí)設(shè)定m.Result為TABLET_DISABLE_FLICKS(參考程式8)。其他可設(shè)定的項(xiàng)目請(qǐng)參考http://msdn.microsoft.com/en-us/library/bb969148.aspx。
結(jié)語(yǔ)
了解以上處理WM_GESTURE訊息的方式之后,即可試著閱讀并修改Windows 7 SDK中的MTGestures范例程式。該范例會(huì)在表單上繪製一個(gè)長(zhǎng)方形,并依據(jù)不同的手勢(shì)對(duì)表單上的長(zhǎng)方形做出不同的動(dòng)作。