手勢 Gestures 在行動裝置上越來越重要,使用者可在行動裝置,透過觸控筆(滑鼠),透過不同的手勢動作來執行命令,在 Windows Mobile 6.5 的 new feature 中,就包含了 Gestures API (另一個是 Widget),本文介紹 Windows Mobile 6.5 Developer Tool 中 Gestures API Sample Code。
更多文章,請到我在點部落所建立的部落格「.NET菜鳥自救會」閱讀
http://www.dotblogs.com.tw/chou/
簡介
手勢 Gestures 在行動裝置上越來越重要,使用者可在行動裝置,透過觸控筆(滑鼠),透過不同的手勢動作來執行命令,在 Windows Mobile 6.5 的 new feature 中,就包含了 Gestures API (另一個是 Widget),本文介紹 Windows Mobile 6.5 Developer Tool 中 Gestures API Sample Code。
Gestures API
2.1 Touch Gestures
Touch Gestures 是當使用者在螢幕上,透過手指或觸控筆做短暫且具方向性的描繪動作,根據其動作,產生相對應的事件,最簡單的就是對螢幕做一次敲擊,而在做敲擊的動作中,手指按下 ( WM_LBUTTONDOWN) 與手指離開( WM_LBUTTONUP) 時就會產生事件。而在手指按下與離開的這段期間,手指移動的方向(帶正負)、位置與速度,透過手勢辨識產生相對應的事件,Gestures API 支援五種不同的手勢訊息。
(1) Tap : 代表滑鼠左鍵單擊,事件 GID_SELECT
(2) Double Tap : 代表滑鼠左鍵雙擊,事件 GID_DOUBLESELECT
(3) Hold : 使用者觸控筆觸控螢幕並保持狀態,代表滑數右鍵,事件 GID_HOLD
(4) Flick : 使用者在螢幕透過手指做單一像素滑動,當速度夠快時,則產生捲動,事件 GID_SCROLL -> GID_END
(5) Pan : 使用者觸控且在螢幕上隨意移動,代表滑鼠移動,事件 GID_PAN -> GID_END
*註 : 相關事件可參考 GESTUREINFO
想要使用 Gestures API,需 include 一些標頭檔,主要是以下三個
#include <gesture.h>
#include <GesturePhysicsEngine.h>
#include <WindowAutoGesture.h>
檔案位置在 C:\Program Files\Windows Mobile 6 SDK\PocketPC\Include\Armv4i
2.2 WM_GESTURE 訊息
以下程式碼為取得 WM_GESTURE 訊息的基礎程式,且透過 switch 方式,當取得 Gestures 訊息時所對應哪些處理。
//
// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
LRESULT CALLBACK WndProca(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
BOOL fHandled = FALSE;
GESTUREINFO gi = {sizeof(gi)};
// Go get the gesture - will return FALSE if the gesture engine is not present in the system.
if (TKGetGestureInfo(reinterpret_cast<HGESTUREINFO>(lParam), &gi))
{
switch(wParam)
{
case GID_HOLD:
break;
case GID_SELECT:
break;
case GID_DOUBLESELECT:
break;
case GID_PAN:
break;
}
if (!fHandled)
{
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
return 0;
}
2.3 Gesture Metrics Sample
以下影片是執行 Gesture Metrics Sample 範例程式,一開始觸控螢幕,並且保持不動,產生 GID_HOLD 訊息,接著單擊螢幕,產生 GID_SELECT 訊息,最後雙擊螢幕,產生 GID_DOUBLESELECT訊息。
http://www.youtube.com/watch?v=qs_fzupt_qM
在此範例程式,使用 WM_GESTURE 中的 GID_SELECT, GID_HOLD, GID_SELECT 和 GID_DOUBLESELECT訊息,當使用者觸控螢幕時,有三種情形
(1) GID_HOLD
使用者觸控螢幕時,於 OnLButtonDown 事件中,StartTimer(hWnd, ID_HOLD_TIMER); 於 WndProc 接收 WM_GESTURE 訊息,當訊息為 GID_HOLD 時,則 KillTimers(hWnd); // ID_HOLD_TIMER,並於畫面顯示 HOLD DETECTED
(2) GID_SELECT
於 WndProc 接收 WM_GESTURE 訊息,當訊息為 GID_SELECT 時,透過 TKGetGestureInfo 取得結構與細節,顯示 SELECT DETECTED,StartTimer(hWnd, ID_DOUBLESELECT_TIMER);
(3) GID_DOUBLESELECT
於 WndProc 接收 WM_GESTURE 訊息,當訊息為 GID_DOUBLESELECT 時 檢測到是GID_DOUBLESELECT,則 KillTimers(hWnd); // ID_DOUBLESELECT_TIMER,並顯示 DOUBLE SELECT DETECTED。