Windows Touchメッセージ入門-中国語という理屈
Windows Touchメッセージ入門
このセクションでは、Windows Touchをアプリケーションで正常に動作させるための関連タスクについて説明します.
次の手順は、通常、Windows Touchメッセージの使用時に実行されます.
Windows Touch用のメッセージはWM_TOUCH.このメッセージは、デジタイザに接触している状態を示します.
入力デジタル化機能のテスト
GetSystemMetrics関数を使用してSM_を転送できます.DIGITIZERのnIndex値は、入力ディジタイザの機能を問い合わせる.GetSystemMetricsは、デバイスが準備ができているかどうか、デバイスがペンをサポートしているかタッチしているか、入力デバイスが統合されているか外付けなのか、およびデバイスが複数の入力をサポートしているかどうかを示すビットフィールドを返します.次の表に、各フィールドのビットを示します.
ビット
8
7
6
5
4
3
2
1
値
スタック準備完了
マルチインプット
保持
保持
がいぶペン
統合ペン
外部タッチパネル
内蔵タッチパネル
特定の機能のコマンドで得られた結果をテストするには、ビット&演算子とテスト中の特定のビットを使用します.たとえば、Windows Touchをテストするには、7番目のシーケンスビットが設定されているかどうかをテストします(16進数表示形式は0 x 40).次のコードの例では、これらの値をテストする方法を示します.
#include
// test for touch
int value = GetSystemMetrics(SM_DIGITIZER);
if (value & NID_READY){ /* stack ready */}
if (value & NID_MULTI_INPUT){
/* digitizer is multitouch */
MessageBoxW(hWnd, L"Multitouch found", L"IsMulti!", MB_OK);
}
if (value & NID_INTEGRATED_TOUCH){ /* Integrated touch */}
次の表にwindowsを示します.hで定義された定数であり、入力デジタル化器のタッチ機能をテストするために使用される.
名前
値
説明
TABLET_CONFIG_NONE
0x00000000
入力デジタル化器にはタッチ機能がありません.
NID_INTEGRATED_TOUCH
0x00000001
統合タッチデジタルを使用して入力します.
NID_EXTERNAL_TOUCH
0x00000002
外部タッチデジタルを使用して入力します.
NID_INTEGRATED_PEN
0x00000004
統合ペンデジタイザを使用して入力します.
NID_EXTERNAL_PEN
0x00000008
外部ペンデジタイザを使用して入力します.
NID_MULTI_INPUT
0x00000040
複数の入力をサポートする入力デジタルを使用して入力します.
NID_READY
0x00000080
入力ディジタルは入力の準備ができています.この値が設定されていない場合は、Tabletサービスが停止しているか、デジタルドライバがサポートされていないか、またはデジタルドライバがインストールされていないことを意味します.
NID_*の確認値は、タッチ入力、ペン入力、またはTablet以外のアプリケーション入力を構成するためにユーザコンピュータの機能をチェックするのに役立ちます.たとえば、ダイナミックユーザインタフェース(UI)があり、コンテンツの一部を自動的に構成する必要がある場合は、NID_を確認します.INTEGRATED_TOUCH、NID_MULTITOUCHは、ユーザが初めてアプリケーションを実行したときの最大タッチ回数を取得することができる.
注意SM_GETSYSTEMMETRICSにはいくつかの内在的な制限があります.たとえば、プラグアンドプレイはサポートされていません.したがって、この関数を永続的な構成方法として使用する場合は、慎重に使用してください.
Windows Touch入力の受信として登録
Windows Touch入力を受信する前に、アプリケーションはWindows Touch入力を受信するように登録する必要があります.アプリケーションウィンドウを登録することで、アプリケーションはタッチと互換性があることを示します.アプリケーションがウィンドウを登録した後、そのウィンドウに入力すると、Windows Touchドライバからの通知がアプリケーションに転送されます.アプリケーションが閉じると、ウィンドウがログアウトされ、通知が無効になります.
注意WM_TOUCHニュースは現在「貪欲」だ.1つのウィンドウで最初のタッチメッセージを受信すると、他のウィンドウがフォーカスを受信するまで、すべてのタッチメッセージがウィンドウに送信されます.
注意デフォルトでは、WM_を受信します.WM_ではなくGESTUREメッセージTOUCHメッセージ.RegisterTouchWindowを呼び出すと、WM_の受信が停止します.GESTUREメッセージ.
次のコードは、Win 32アプリケーションのWindows Touchメッセージを受信するためにアプリケーションがどのように登録されているかを示します.
RegisterTouchWindow(hWnd, 0);
Windows Touchメッセージの処理
アプリケーションからのWindows Touchメッセージは、Windowsオペレーティングシステムでさまざまな方法で処理できます.GUIアプリケーションをプログラミングしている場合は、WndProc関数にコードを追加して、興味のあるメッセージを処理できます.Microsoftベースクラス(MFC)または管理アプリケーションをプログラミングしている場合は、興味のあるメッセージにハンドラを追加できます.次のコード例では、WindowsベースのアプリケーションでWndProcからタッチメッセージを処理する方法を示します.
LRESULT OnTouch(HWND hWnd, WPARAM wParam, LPARAM lParam ){
BOOL bHandled = FALSE;
UINT cInputs = LOWORD(wParam);
PTOUCHINPUT pInputs = new TOUCHINPUT[cInputs];
if (pInputs){
if (GetTouchInputInfo((HTOUCHINPUT)lParam, cInputs, pInputs, sizeof(TOUCHINPUT))){
for (UINT i=0; i < cInputs; i++){
TOUCHINPUT ti = pInputs[i];
//do something with each touch input entry
}
bHandled = TRUE;
}else{
/* handle the error here */
}
delete [] pInputs;
}else{
/* handle the error here, probably out of memory */
}
if (bHandled){
// if you handled the message, close the touch input handle and return
CloseTouchInputHandle((HTOUCHINPUT)lParam);
return 0;
}else{
// if you didn't handle the message, let DefWindowProc handle it
return DefWindowProc(hWnd, WM_TOUCH, wParam, lParam);
}
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
// pass touch messages to the touch handler
case WM_TOUCH:
OnTouch(hWnd, wParam, lParam);
break;
次のコードでは、メッセージ・マッピングとメッセージ・ハンドラの実装方法を示します.メッセージのプロセッサは、メッセージマッピングでメッセージを宣言してから実装する必要があります.例えば、MFCアプリケーションでは、このような宣言をダイアログコードで行うことができる.また、ダイアログウィンドウのOnInitDialog関数には、
RegisterTouchWindow(m_hWnd, 0)
などのRegisterTouchWindowへの呼び出しが含まれている必要があります. // Class implementations within a dialog
LRESULT TestDlg::OnTouch( WPARAM wParam, LPARAM lParam ){
//Insert handler code here to do something with the message or uncomment the following line to test
//MessageBox(L"touch!", L"touch!", MB_OK);
return 0;
}
// The message map
BEGIN_MESSAGE_MAP()
ON_WM_CREATE()
... ... ...
ON_MESSAGE(WM_TOUCH, OnTouch)
END_MESSAGE_MAP()
BOOL TestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
RegisterTouchWindow(m_hWnd, 0);
... ... ...
}
このウィンドウをタッチすると、ポップアップウィンドウからのタッチが表示されます.
タッチメッセージの受信を開始すると、これらのメッセージをタッチ入力構造に変換し、より多くの必要な操作を実行できます.次のコードは、メッセージを変換する方法を示します.
LRESULT OnTouchHandled(HWND hWnd, WPARAM wParam, LPARAM lParam ){
BOOL bHandled = FALSE;
UINT cInputs = LOWORD(wParam);
PTOUCHINPUT pInputs = new TOUCHINPUT[cInputs];
if (pInputs){
if (GetTouchInputInfo((HTOUCHINPUT)lParam, cInputs, pInputs, sizeof(TOUCHINPUT))){
for (UINT i=0; i < cInputs; i++){
TOUCHINPUT ti = pInputs[i];
//do something with each touch input entry
}
}else{
/* handle the error here */
}
delete [] pInputs;
}else{
/* handle the error here, probably out of memory */
}
if (bHandled){
// if you handled the message, close the touch input handle and return
CloseTouchInputHandle((HTOUCHINPUT)lParam);
return 0;
}else{
// if you didn't handle the message, let DefWindowProc handle it
return DefWindowProc(hWnd, WM_TOUCH, wParam, lParam);
}
}