Windows Touchメッセージ入門-中国語という理屈

7161 ワード

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);
        }
      }