さて前回うまくいかなかったタッチパネルの情報の取得、Windows 7からは新しくその名もWM_TOUCHというメッセージがある。
今回はこれを使ってTOUCHINPUTを取得してみる。
https://msdn.microsoft.com/en-us/library/windows/desktop/dd317341(v=vs.85).aspx
Visual StudioでMFCのダイアログベースのスケルトンを作成する
名前は適当に付ける(ここでは"MFCAho")。
ウィンドウをタッチ対応として登録する
CMFCAhoDlg::OnInitDialog()に以下を追加する。
RegisterTouchWindow(1, 0);
これでこのダイアログがWM_TOUCHを受信できるようになる。
https://msdn.microsoft.com/en-us/library/windows/desktop/dd317326(v=vs.85).aspx
WM_TOUCHのメッセージハンドラーを実装
Visual Studio 2015のMFCスケルトンでは、WM_TOUCHのメッセージハンドラがデフォルトでは定義されていない。
ゆえにWindowProcをオーバーライドして、自分でメッセージハンドラーを実装する必要がある。
Class Wizardを開き、ダイアログのクラスを選択し、"Virtual Functions"から"WindowProc"を選び、ダイアログクラスに追加する。
こんな感じになっているはずだ。
LRESULT CMFCAhoDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: Add your specialized code here and/or call the base class return CDialogEx::WindowProc(message, wParam, lParam); }
ここに、メッセージハンドラを追加する。
LRESULT CMFCApplication1Dlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: Add your specialized code here and/or call the base class switch (message) { case WM_TOUCH: { break; } default: break; } return CDialogEx::WindowProc(message, wParam, lParam); }
WM_TOUCHのイベントハンドラを実装する
こりだけ。
case WM_TOUCH: { UINT cInputs = LOWORD(wParam); PTOUCHINPUT pInputs = new TOUCHINPUT[cInputs]; GetTouchInputInfo( (HTOUCHINPUT)lParam, cInputs, pInputs, sizeof(TOUCHINPUT) ); // ここでTOUCHINPUTの処理をする delete[]pInputs; break; }
TOUCHINPUT構造体の詳細は以下。
https://msdn.microsoft.com/en-us/library/windows/desktop/dd317334(v=vs.85).aspx
typedef struct _TOUCHINPUT { LONG x; LONG y; HANDLE hSource; DWORD dwID; DWORD dwFlags; DWORD dwMask; DWORD dwTime; ULONG_PTR dwExtraInfo; DWORD cxContact; DWORD cyContact; } TOUCHINPUT, *PTOUCHINPUT;
これで、タッチの座標(x, y)も、触ったか・動いたか・離したか(dwFlags)も取得できる。