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

Windows 7 多點觸控開發實戰:原始觸點處理與 WM_TOUCH 訊息解碼

     編輯:關於.NET

實驗目標

本實驗採用「最佳」層次的觸控開發方式——直接處理低階 WM_TOUCH 訊息,建立多點觸控繪圖應用(模擬 MS Paint 多指繪圖),學習:

  • 註冊視窗接收 WM_TOUCH 訊息
  • 解碼封裝在單一訊息中的多個觸點資料
  • 追蹤觸點 ID 生命週期,實現多指同時繪製獨立筆劃

系統需求

  • Microsoft Visual Studio 2008 SP1
  • Windows 7
  • Windows 7 SDK
  • 多點觸控硬體

三種觸控開發層次回顧

  1. 「好」:利用控制項內建觸控行為
  2. 「出色」:使用 WM_GESTURE 高階手勢(上一實驗)
  3. 「最佳」:直接處理 WM_TOUCH 原始觸點(本實驗),適用於需同時操作多個獨立觸點的場景
  4. 實驗應用程式:Multi-touch Scratchpad

    視窗支援多指同時繪製連續線條,每根手指對應一條獨立筆劃,主觸點(第一指)以黑色顯示,次要觸點循環使用紅、綠、藍、青、洋紅、黃六色。

    實作步驟詳解

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

    同前一實驗,建立 C++ Win32 專案,修改 targetver.h 設定 0x0601。

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

    程式碼與手勢實驗相同,使用 GetSystemMetrics(SM_DIGITIZER) 與 SM_MAXIMUMTOUCHES。

    任務 3:加入筆劃類別並處理繪圖

    加入 Stroke.h/.cpp 管理筆劃集合:

    • g_StrkColFinished:已完成筆劃集合
    • g_StrkColDrawing:正在繪製中筆劃集合

    在 WM_PAINT 中繪製兩個集合所有筆劃。

    任務 4:註冊視窗接收 WM_TOUCH

    在 InitInstance 的 ShowWindow 前呼叫:

    if (!RegisterTouchWindow(hWnd, 0)) {
        MessageBox(hWnd, L"Cannot register for touch input", L"Error", MB_OK);
        return FALSE;
    }
    

    預設視窗接收 WM_GESTURE,此呼叫切換為低階 WM_TOUCH。

    任務 5:處理 WM_TOUCH 訊息與解碼觸點資料

    WM_TOUCH 的 wParam 為觸點數量,lParam 為觸控輸入控制代碼。處理流程:

    case WM_TOUCH: {
        UINT numInputs = (UINT)wParam;
        TOUCHINPUT* ti = new TOUCHINPUT[numInputs];
        if (GetTouchInputInfo((HTOUCHINPUT)lParam, numInputs, ti, sizeof(TOUCHINPUT))) {
            for (UINT 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]);
            }
        }
        CloseTouchInputHandle((HTOUCHINPUT)lParam);
        delete[] ti;
        break;
    }
    

    關鍵結構:TOUCHINPUT

    • x, y:螢幕座標(單位:百分之一像素),需除以 100 並用 ScreenToClient 轉換
    • dwID:觸點唯一識別碼(手指按下時產生,抬起時釋放,可重複使用)
    • dwFlags:TOUCHEVENTF_DOWN、MOVE、UP

    任務 6:實作觸點事件處理器

    OnTouchDownHandler:建立新筆劃、記錄起始點、指派顏色與觸點 ID,加入 g_StrkColDrawing。

    OnTouchMoveHandler:依觸點 ID 在 g_StrkColDrawing 找到對應筆劃,加入新點,局部重繪最新線段。

    OnTouchUpHandler:依觸點 ID 找到筆劃,移至 g_StrkColFinished,從繪製中集合移除,觸發全視窗重繪。

    輔助函式 GetTouchPoint 處理座標轉換,GetTouchColor 根據是否為主觸點決定顏色。

    實驗總結

    本實驗深入展示 WM_TOUCH 低階觸控程式設計核心:視窗註冊、訊息解封裝、觸點 ID 追蹤與筆劃生命週期管理。此技術適用於繪圖板、樂器模擬、多使用者協作等需精確控制每個觸點的高階應用場景。

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