2013-11-20 86 views
1

我有一個關於在熱點上註冊單擊鼠標的問題 - 它給我提供了各種各樣的問題,我似乎無法在這裏,在我的任何書籍中找到答案,或者谷歌。我只在編程幾個月,所以請耐心等待。C++註冊單個鼠標單擊

我已經設法創建了一個(儘管是原始的,不是非常優雅的)hotbox,其中有人翻轉按鈕並且他們的圖標發生了變化。如果他們點擊該按鈕,它會在另一個屏幕上填充矢量並播放聲音。這很好。但是,我使用的代碼計算了MouseLButton向下動作 - 這意味着,由於循環,MouseLButton向下不斷註冊。我將如何讓這段代碼算上行動作爲一個單一的點擊,什麼也不做之後,直到用戶再次點擊:

OfficeManager.cpp:

void Hire::hireScreenNavigation() 
{ 
if ((input->getMouseLButton()) && (input->getMouseX() > 900 && input->getMouseX() < 940) && (input->getMouseY() > 154 && input->getMouseY() < 174)) 
{ 
    audio->playCue (CLICK_EXPAND); 
    hire = true; 
    Office.push_back (HireRecruitmentPool[0]); 
    --officeCapacity; 
} 

if ((hireScreenSwitch==true) && (input->getMouseX() > 900 && input->getMouseX() < 940) && (input->getMouseY() > 154 && input->getMouseY() < 174)) 
{ 
    SetCursor(LoadCursor(NULL,IDC_HAND)); 
} 

}

這是遊戲的代碼類以上(Game.cpp):

if(initialized) 
{ 
    switch(msg) 
    { 
     case WM_DESTROY: 
      PostQuitMessage(0); 
      return 0; 
     case WM_KEYDOWN: case WM_SYSKEYDOWN: 
      input->keyDown(wParam); 
      return 0; 
     case WM_KEYUP: case WM_SYSKEYUP: 
      input->keyUp(wParam); 
      return 0; 
     case WM_CHAR: 
      input->keyIn(wParam); 
      return 0; 
     case WM_MOUSEMOVE: 
      input->mouseIn(lParam); 
      return 0; 
     case WM_INPUT: 
      input->mouseRawIn(lParam); 
      return 0; 
     case WM_LBUTTONDOWN: 
      input->setMouseLButton(true); 
      input->mouseIn(lParam); 
      clicked = true; 
      return 0; 
     case WM_LBUTTONUP: 
      input->setMouseLButton(false); 
      input->mouseIn(lParam); 
      return 0; 
     case WM_MBUTTONDOWN: 
      input->setMouseMButton(true); 
      input->mouseIn(lParam); 
      return 0; 
     case WM_MBUTTONUP: 
      input->setMouseMButton(false); 
      input->mouseIn(lParam); 
      return 0; 
     case WM_RBUTTONDOWN: 
      input->setMouseRButton(true); 
      input->mouseIn(lParam); 
      return 0; 
     case WM_RBUTTONUP: 
      input->setMouseRButton(false); 
      input->mouseIn(lParam); 
      return 0; 
    } 
} 
return DefWindowProc(hwnd, msg, wParam, lParam); 

如果任何人有關於如何使上述租賃功能計算這些座標內一個單一的點擊代碼的任何實例(而不是老鼠下來),我會非常感激。請記住,遊戲中每個按鈕的熱點座標都不相同。

謝謝!

回答

0

通常,「點擊」既涉及向下動作又涉及向上動作,實際上有些人在確定點擊時只考慮向上事件。您可能會嘗試的方法: 1.在按下按鈕時,記下位置,以便您知道用戶按下了屏幕上的哪個位置。更具體地說,記錄被「擊中」的項目。 2.不做任何事情,直到事件發生。那時,檢查鼠標位置是否仍然在最初被擊中的項目上。如果是這樣,請考慮成功點擊該項目並執行所需的任何處理。

+0

感謝您的答覆 - 非常感謝。我想知道用於測試語義的語義。我似乎沒有缺乏方法來測試鼠標下降(輸入 - > getMouseLButton)或((GetKeyState(VK_LBUTTON)&0x8000) 但是,當我試圖對左鼠標測試,沒有任何反應。使用(WM_LBUTTONUP)時,我這樣做 - 沒有效果,我懷疑我正在利用這個不正確的,雖然... – DJames

+0

首先是確認您在switch語句中按下按鈕的情況下,如果是,那麼可能有如果你可以發佈代碼,我可以嘗試提供更多的幫助,如果案件沒有受到打擊,那麼其他事情就會出現問題,但我現在還在對此進行打擊。它受到打擊? – MikeD