共用方式為


使用 Windows Touch 手勢消費者入門

本節說明使用多重觸控手勢的基本步驟。

使用 Windows Touch 手勢時,通常會執行下列步驟:

  1. 設定接收手勢的視窗。
  2. 處理手勢訊息。
  3. 解譯手勢訊息。

設定視窗以接收手勢

根據預設,您會收到 WM_GESTURE 訊息。

注意

如果您呼叫 RegisterTouchWindow,您將停止接收 WM_GESTURE 訊息。 如果您未收到 WM_GESTURE 訊息,請確定您尚未呼叫 RegisterTouchWindow

 

下列程式碼顯示簡單的 InitInstance 實作。

#include <windows.h>


BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // Store instance handle in our global variable

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

處理手勢訊息

與處理 Windows Touch 輸入訊息類似,您可以透過許多方式處理手勢訊息。 如果您使用 Win32,您可以在 WndProc 中檢查 WM_GESTURE 訊息。 如果您要建立其他類型的應用程式,您可以將 WM_GESTURE 訊息新增至訊息對應,然後實作自訂處理常式。

下列程式碼示範如何處理手勢訊息。

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {    
    case WM_GESTURE:
            // Insert handler code here to interpret the gesture.            
            return DecodeGesture(hWnd, message, wParam, lParam);            

解譯手勢訊息

GetGestureInfo函式可用來將手勢訊息解譯成描述手勢的結構。 結構 GESTUREINFO具有手勢的相關資訊,例如執行手勢的位置和手勢類型。 下列程式碼示範如何擷取和解譯手勢訊息。

  LRESULT DecodeGesture(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
    // Create a structure to populate and retrieve the extra message info.
    GESTUREINFO gi;  
    
    ZeroMemory(&gi, sizeof(GESTUREINFO));
    
    gi.cbSize = sizeof(GESTUREINFO);

    BOOL bResult  = GetGestureInfo((HGESTUREINFO)lParam, &gi);
    BOOL bHandled = FALSE;

    if (bResult){
        // now interpret the gesture
        switch (gi.dwID){
           case GID_ZOOM:
               // Code for zooming goes here     
               bHandled = TRUE;
               break;
           case GID_PAN:
               // Code for panning goes here
               bHandled = TRUE;
               break;
           case GID_ROTATE:
               // Code for rotation goes here
               bHandled = TRUE;
               break;
           case GID_TWOFINGERTAP:
               // Code for two-finger tap goes here
               bHandled = TRUE;
               break;
           case GID_PRESSANDTAP:
               // Code for roll over goes here
               bHandled = TRUE;
               break;
           default:
               // A gesture was not recognized
               break;
        }
    }else{
        DWORD dwErr = GetLastError();
        if (dwErr > 0){
            //MessageBoxW(hWnd, L"Error!", L"Could not retrieve a GESTUREINFO structure.", MB_OK);
        }
    }
    if (bHandled){
        return 0;
    }else{
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
  }

Windows Touch 手勢