Windows 7 引入許多創新功能:工作列縮圖預覽、快速隱藏桌面圖示、搖晃視窗最小化等。更令人興奮的是原生多點觸控支援——正如《未來報告》中湯姆·克魯斯雙手操作觸控螢幕,只要擁有觸控裝置,開發者即可透過 API 將這些體驗帶入自有應用程式。
適用於圖片瀏覽、文件閱讀等縮放場景。雙指並攏一上一下滑動為放大,雙指分開向中間滑動為縮小。識別邏輯三步驟:
常用於導覽(如相簿左右翻頁)。雙指同向滑動。關鍵在於區分「拖曳內容」與「翻頁」——需引入加速度判斷:計時器即時計算速率與加速度,加速度超過經驗值視為翻頁;未超過則為拖曳。另需判斷是否觸及邊界,邊界到達亦視為翻頁。向左高速移動或觸及左邊界 → 上一頁;向右 → 下一頁。
核心在於將原始觸控資料送入運動模型計算以識別手勢。原始資料來自 WM_TOUCH 訊息。
BYTE digitizerStatus = (BYTE)GetSystemMetrics(SM_DIGITIZER);
if ((digitizerStatus & (0x80 + 0x40)) == 0) {
// 未偵測到多點觸控裝置或裝置未就緒
}
BYTE nInputs = (BYTE)GetSystemMetrics(SM_MAXIMUMTOUCHES); // 目前 Win 7 對 2 點支援最佳
預設 Win 7 提供 WM_GESTURE(系統識別後的手勢)。呼叫 RegisterTouchWindow(hWnd, 0) 讓視窗接收 WM_TOUCH 原始輸入。
GetTouchInputInfo((HTOUCHINPUT)lParam, numInputs, ti, sizeof(TOUCHINPUT));
// numInputs:觸控點數量
// 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(取得手勢類型與資料)。