0

マルチタッチメッセージを処理するダイアログベースのピアノアプリケーションを作成しました。私は2つのクラスを持っています.1つはCMIDIKeyboardで、タッチダウンメッセージを次のように処理しています

LRESULT CMIDIKeyboard::OnTouchMessage( WPARAM wParam, LPARAM lParam ){
//Insert handler code here to do something with the message or uncomment the following    line to test
 //-------------------saurabh code------------------------------------------------------------------
       UINT  cInputs  = (int) wParam;      // Number of actual per-contact messages
        TOUCHINPUT* pInputs = new TOUCHINPUT[cInputs]; // Allocate the storage for the   parameters of the per-contact messages
        if (pInputs == NULL)
        {

            return 0;
        }
        // Unpack message parameters into the array of TOUCHINPUT structures, each
        // representing a message for one single contact.
        if (GetTouchInputInfo((HTOUCHINPUT)lParam, cInputs, pInputs, sizeof(TOUCHINPUT)))
        {
            // For each contact, dispatch the message to the appropriate message
            // handler.
            for (unsigned int i = 0; i < cInputs; i++)
            {
        if (pInputs[i].dwFlags & TOUCHEVENTF_DOWN)
        {
         CPoint point;
             CRect rect;
         GetClientRect(&rect);
         point=CPoint(pInputs[i].x-rect.left,pInputs[i].y-rect.top);
         m_CurrKey= CPianoCtrl::FindKey(point); 
         m_Keys[m_CurrKey]->NoteOn(m_NoteOnColor,rect);
         NotifyNoteOn(m_LowNote+m_CurrKey);  
                     findchords(m_LowNote+m_CurrKey);
                 InvalidateRect(&rect);
             CWnd::OnTouchMessage(wParam,lParam);

                 }
                else if (pInputs[i].dwFlags & TOUCHEVENTF_UP)
                {
                 //MessageBox("touchup!", "touchup!", MB_OK);
         // g_pIManipProc->ProcessUp(pInputs[i].dwID, (FLOAT)pInputs[i].x, (FLOAT)pInputs[i].y);
                } 

                 else if (pInputs[i].dwFlags & TOUCHEVENTF_MOVE)
                {
        //MessageBox("touchmove!", "touchmove!", MB_OK);
                //g_pIManipProc->ProcessMove(pInputs[i].dwID, (FLOAT)pInputs[i].x, (FLOAT)pInputs[i].y);
                }

            }
        }
        else
        {
            // error handling, presumably out of memory
            ASSERT(FALSE && L"Error: failed to execute GetTouchInputInfo");
            delete [] pInputs;
    return 0;
            //break;
        }
        if (!CloseTouchInputHandle((HTOUCHINPUT)lParam))
        {
            // error handling, presumably out of memory
            ASSERT(FALSE && L"Error: failed to execute CloseTouchInputHandle");
            delete [] pInputs;
    return 0;
            //break;
        }
        delete [] pInputs; 
   //--------------------------------------------------------saurabh code ends-----------------
//MessageBox("touch!", "touch!", MB_OK);
return 0;} 

しかし、ピアノの鍵盤を弾くときは最初のタッチが適切に再生されますが、ピアノの鍵盤で複数のタッチが再生され、タッチ位置に関係なく右側の最後のキーが有効になります。

  //                  ----------------------
  //                  | | || | | | || || | |
  //                  | |_||_| | |_||_||_| |
  //                  |  |  |  |  |  |  |  |
  //                  ----------------------
  //                          ^           ^
                              |           | 
                        one point    More than 
                          touch      one touch

誰でも私を導くか、私を修正してください。

4

1 に答える 1

0

TOUCHINFOドキュメントには次のように記載されています。

x    タッチ入力の x 座標 (水平点)。このメンバーは、物理画面座標の 100 分の 1 ピクセルで示されます。

この値からピクセル全体 ( rect.left) で測定された値を差し引いても、結果が意味を成すと期待することはできません。

于 2013-10-01T07:47:43.477 に答える