首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Windows 7 多點觸控開發實戰:手勢識別與 WM_GESTURE 訊息處理

     編輯:關於.NET

實驗目標

本實驗引導開發者建立支援多點觸控手勢的 Win32 應用程式,學習核心技能:

  • 理解手勢事件操作 UI 物件的意義
  • 檢測多點觸控硬體是否存在且就緒
  • 從 WM_GESTURE 視窗訊息中提取手勢資訊並套用至繪圖物件

系統需求

  • Microsoft Visual Studio 2008 SP1
  • Windows 7 作業系統
  • Windows 7 SDK
  • 支援多點觸控的硬體裝置

三種觸控開發層次

建立觸控應用有三種途徑:

  1. 「好」: 善用 Win32 控制項內建觸控支援(如捲動),零程式碼即可提供基本體驗。
  2. 「出色」: 使用 WM_GESTURE 高階手勢訊息,系統自動將低階觸點轉換為平移、縮放、旋轉等手勢,開發效率最高,本實驗採用此法。
  3. 「最佳」: 直接處理原始 WM_TOUCH 訊息,適用於繪圖板、鋼琴等需同時追蹤多點的複雜場景。
  4. 實驗應用程式:Multitouch Gesture Demo

    應用程式視窗中央顯示一個彩色矩形,支援五種手勢互動:

    • 平移:雙指並排拖曳移動矩形
    • 旋轉:雙指觸摸矩形呈圓周運動
    • 縮放:雙指捏合或張開放大/縮小
    • 雙指點擊:雙指同時點擊切換對角線顯示
    • 雙指交替點擊:一指按住、另一指點擊後放開第一指,變換矩形顏色

    實作步驟詳解

    任務 1:建立 Win32 專案並設定目標平台

    1. 啟動 Visual Studio 2008 SP1,建立 C++ Win32 專案
    2. 修改 targetver.h,將 WINVER 與 _WIN32_WINNT 設為 0x0601(Windows 7)

    任務 2:檢測多點觸控硬體

    在 _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 取得最大觸點數。

    任務 3:加入繪圖物件並繪製矩形

    將 DrawingObject.h/.cpp 加入專案,在 WndProc 處理 WM_SIZE 重設物件大小、WM_PAINT 繪製矩形。

    任務 4:處理 WM_GESTURE 訊息

    系統預設送出 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 釋放資源。

    任務 5:啟用旋轉手勢(修正 Bug)

    預設視窗不接收 GID_ROTATE,需在 InitInstance 的 ShowWindow 前呼叫 SetGestureConfig:

    GESTURECONFIG gc = {0};
    gc.dwWant = GC_ALLGESTURES;
    SetGestureConfig(hWnd, 0, 1, &gc, sizeof(gc));
    

    設定完成後即可正常接收旋轉手勢。

    實驗總結

    本實驗完整展示如何:檢測觸控硬體、配置視窗接收所需手勢、解析 GESTUREINFO 結構、根據手勢類型與旗標採取差異化處理邏輯,並妥善管理手勢資源控制代碼。掌握此技術可快速為傳統桌面應用加入自然直覺的觸控互動體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved