Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Windows 7 多點觸控 API 深度解析:縮放與平移手勢識別實作

編輯:Windows 7 系統介紹

Windows 7 引入許多創新功能:工作列縮圖預覽、快速隱藏桌面圖示、搖晃視窗最小化等。更令人興奮的是原生多點觸控支援——正如《未來報告》中湯姆·克魯斯雙手操作觸控螢幕,只要擁有觸控裝置,開發者即可透過 API 將這些體驗帶入自有應用程式。

Win 7 兩大核心觸控手勢

1. 縮放手勢

適用於圖片瀏覽、文件閱讀等縮放場景。雙指並攏一上一下滑動為放大,雙指分開向中間滑動為縮小。識別邏輯三步驟:

  1. 取得手指觸控點訊息(WM_TOUCH)。
  2. 依兩指座標計算距離,以經驗值判斷分開或並攏。
  3. 透過計時器即時捕捉座標,計算移動方向與速率,進一步判斷反向(放大)或相向(縮小)滑動。

2. 平移手勢

常用於導覽(如相簿左右翻頁)。雙指同向滑動。關鍵在於區分「拖曳內容」與「翻頁」——需引入加速度判斷:計時器即時計算速率與加速度,加速度超過經驗值視為翻頁;未超過則為拖曳。另需判斷是否觸及邊界,邊界到達亦視為翻頁。向左高速移動或觸及左邊界 → 上一頁;向右 → 下一頁。

雙指觸控 API 核心流程

核心在於將原始觸控資料送入運動模型計算以識別手勢。原始資料來自 WM_TOUCH 訊息。

步驟 1:檢查多點觸控硬體

BYTE digitizerStatus = (BYTE)GetSystemMetrics(SM_DIGITIZER);
if ((digitizerStatus & (0x80 + 0x40)) == 0) {
    // 未偵測到多點觸控裝置或裝置未就緒
}
BYTE nInputs = (BYTE)GetSystemMetrics(SM_MAXIMUMTOUCHES); // 目前 Win 7 對 2 點支援最佳

步驟 2:切換至原始觸控訊息

預設 Win 7 提供 WM_GESTURE(系統識別後的手勢)。呼叫 RegisterTouchWindow(hWnd, 0) 讓視窗接收 WM_TOUCH 原始輸入。

步驟 3:取得原始觸控資料

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(取得手勢類型與資料)。

Copyright © Windows教程網 All Rights Reserved