C ++注册单个鼠标单击

时间:2013-11-20 17:59:23

标签: c++ mouseevent

我有一个关于在热点上注册鼠标点击的问题 - 它给了我各种各样的问题,我似乎无法在我的任何书籍或谷歌上找到答案。我只是在编程几个月,所以忍受我。

我设法创建了一个(尽管是原始的而不是非常优雅的)热箱,其中某人翻过按钮并且他们的图标发生了变化。如果他们点击按钮,它会在另一个屏幕上填充一个矢量并播放声音。那一切都很好。但是,我正在使用的代码计算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类中的代码(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 );

如果有人有任何关于如何编码的例子,以便上面的雇用功能计算在这些坐标内的单击(而不是鼠标按下),我将非常感激。请记住,热点的坐标对于游戏中的每个按钮都是不同的。

谢谢!

1 个答案:

答案 0 :(得分:0)

通常,“点击”涉及向下操作和向上操作,实际上有些人在确定点击时只考虑向上事件。你可能会尝试什么: 1.按下按钮,记录位置,以便知道用户按下屏幕的位置。更具体地说,记录“被击中”的项目。 2.直到事件发生之前什么都不做。那时,检查鼠标位置是否仍在最初命中的项目上。如果是这样,请考虑成功点击该项目并执行您需要的任何处理。

相关问题