開始使用 Windows 觸控手勢
本節說明使用多重觸控手勢的基本步驟。
使用 Windows Touch 手勢時,通常會執行下列步驟:
- 設定接收手勢的視窗。
- 處理手勢訊息。
- 解譯手勢訊息。
設定視窗以接收手勢
根據預設,您會收到 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);
}
}
相關主題