本實驗引導開發者建立支援多點觸控手勢的 Win32 應用程式,學習核心技能:
建立觸控應用有三種途徑:
應用程式視窗中央顯示一個彩色矩形,支援五種手勢互動:
targetver.h,將 WINVER 與 _WIN32_WINNT 設為 0x0601(Windows 7)在 _tWinMain 呼叫 InitInstance 前插入檢測碼:
BYTE digitizerStatus = (BYTE)GetSystemMetrics(SM_DIGITIZER);
if ((digitizerStatus & (0x80 + 0x40)) == 0) { // Stack Ready + MultiTouch
MessageBox(0, L"No touch support", L"Error", MB_OK);
return 1;
}
BYTE nInputs = (BYTE)GetSystemMetrics(SM_MAXIMUMTOUCHES);
wsprintf(szTitle, L"%s - %d touch inputs", szTitle, nInputs);
透過 SM_DIGITIZER 確認觸控堆疊就緒與多點支援,SM_MAXIMUMTOUCHES 取得最大觸點數。
將 DrawingObject.h/.cpp 加入專案,在 WndProc 處理 WM_SIZE 重設物件大小、WM_PAINT 繪製矩形。
系統預設送出 WM_GESTURE,需在 WndProc 加入:
case WM_GESTURE:
return ProcessGestureMessage(hWnd, wParam, lParam);
核心處理函式 ProcessGestureMessage 使用 GetGestureInfo 解析 GESTUREINFO 結構,關鍵欄位:
dwID:手勢識別碼(GID_PAN、GID_ZOOM、GID_ROTATE、GID_TWOFINGERTAP、GID_PRESSANDTAP)dwFlags:GF_BEGIN(首次)、GF_INERTIA(慣性)、GF_END(結束)ullArguments:手勢參數(縮放倍率、旋轉角度等)處理邏輯:
GF_BEGIN),計算與上一次的差值進行位移或縮放使用完畢必須呼叫 CloseGestureInfoHandle 釋放資源。
預設視窗不接收 GID_ROTATE,需在 InitInstance 的 ShowWindow 前呼叫 SetGestureConfig:
GESTURECONFIG gc = {0};
gc.dwWant = GC_ALLGESTURES;
SetGestureConfig(hWnd, 0, 1, &gc, sizeof(gc));
設定完成後即可正常接收旋轉手勢。
本實驗完整展示如何:檢測觸控硬體、配置視窗接收所需手勢、解析 GESTUREINFO 結構、根據手勢類型與旗標採取差異化處理邏輯,並妥善管理手勢資源控制代碼。掌握此技術可快速為傳統桌面應用加入自然直覺的觸控互動體驗。