C++ C++;注册一次鼠标点击
我有一个关于在一个热点上注册一次鼠标点击的问题——它给了我各种各样的问题,我似乎在这里,在我的任何一本书中,或者在谷歌上都找不到答案。我只做了几个月的编程工作,所以请容忍我 我已经成功地创建了一个(虽然很原始,也不是很优雅)热盒,其中有人在按钮上滚动,他们的图标会发生变化。如果他们点击按钮,它会在另一个屏幕上填充一个向量并播放声音。没关系。然而,我正在使用的代码对MouseLButton down操作进行计数——这意味着,由于循环,MouseLButton down一直被注册。如何使此代码将操作计算为一次单击,然后在用户再次单击之前不执行任何操作: OfficeManager.cpp:C++ C++;注册一次鼠标点击,c++,mouseevent,C++,Mouseevent,我有一个关于在一个热点上注册一次鼠标点击的问题——它给了我各种各样的问题,我似乎在这里,在我的任何一本书中,或者在谷歌上都找不到答案。我只做了几个月的编程工作,所以请容忍我 我已经成功地创建了一个(虽然很原始,也不是很优雅)热盒,其中有人在按钮上滚动,他们的图标会发生变化。如果他们点击按钮,它会在另一个屏幕上填充一个向量并播放声音。没关系。然而,我正在使用的代码对MouseLButton down操作进行计数——这意味着,由于循环,MouseLButton down一直被注册。如何使此代码将操作
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));
}
如果有任何人有任何关于如何编码的例子,使上面的租用功能在这些坐标范围内计数一次点击(而不是鼠标按下),我将非常感激。请记住,游戏中每个按钮的热点坐标都是不同的
谢谢一般来说,“点击”既包括向下动作,也包括上升动作,事实上,有些人在确定点击时只考虑UP事件。您可以尝试什么:
1.按下按钮时,记录位置,以便知道用户在屏幕上按下的位置。更具体地说,记录“命中”的项目。
2.在启动事件之前不要做任何事情。此时,检查鼠标位置是否仍在最初命中的项目上方。如果是这样,请考虑成功点击该项目并进行您需要的任何处理。 谢谢你的回答,非常感谢。不过,我想知道针对这些语句进行测试的语义。我似乎不缺少针对鼠标按下(input->GetMouseButton)或((GetKeyState(VK_LBUTTON)&0x8000)进行测试的方法。但当我尝试针对左上鼠标进行测试时,什么都没有发生。我使用的是(WM_LBUTTONUP)当我这样做的时候-没有效果。我怀疑我没有正确地使用它…第一件事是确认switch语句中的button down case被击中了。如果是这样,那么可能在处理代码的某个地方有一个小错误。如果你能发布代码,我可以尝试提供更多帮助。如果这个case没有被击中,那么还有其他一些东西出了问题。但我现在打赌不是。你能证实它被击中了吗?
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 );