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);
}
}
関連トピック