鼠标滚轮只能向上或向下滚动

mouse wheel only can scroll either up or down

本文关键字:滚动 鼠标      更新时间:2023-10-16

目前我正在开发一个可以放大和缩小的游戏编辑器。有一个问题,我可以向上或向下滚动鼠标滚轮。我无法同时实现滚动,即如果我在编辑器类中调用input->mouseWheelUp(),我只能向上滚动。向下滚动不再有效。如何解决此问题?

获取鼠标滚轮测量

LRESULT Game::messageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    if (initialized)    // do not process messages if not initialized
    {
        switch (msg)
        {
         case WM_MOUSEWHEEL:                            
                input->mouseWheelIn(wParam);
            return 0;
        }
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);    // let Windows handle it
}

输入类

void Input::mouseWheelIn(WPARAM wParam)
{
    mouseWheel = GET_WHEEL_DELTA_WPARAM(wParam);
}
bool mouseWheelUp()
{
    int wheel = mouseWheel;
    mouseWheel = 0;
    return wheel > 0;
}
bool mouseWheelDown()
{
    int wheel = mouseWheel;
    mouseWheel = 0;
    return wheel < 0;
}

编辑器类

void Editor::update()
{
    if ( input->mouseWheelUp() )
    {
        zoom += 0.1f;
    }
    if (input->mouseWheelDown())
    {
        zoom -= 0.1f;
    }
}

查看编辑器的update方法,您的第一个调用是 mouseWheelUp ,这会将内部缓存的鼠标滚轮事件值重置为 0。在第二次调用 mouseWheelDown 时,该值将为 0,因此该方法的返回结果始终为 false。

您应该以不同的方式处理该问题。例如,您可以引入某种映射到表示鼠标滚轮向上或向下事件的常量或枚举。或者,您可以在更新方法中处理原始传入事件值。这可能是更好的方法,因为它显然是一个增量值,可能或多或少地大,具体取决于您旋转鼠标滚轮的程度。在对缩放值进行更大或更小的更改时,应考虑增量。

case WM_MOUSEWHEEL:
        if ((short)HIWORD(msg.wParam) < 0)
        {
            zoom-=3;
        }
        else
        {
            zoom+=3;
        }
        break;

使用鼠标滚轮滚动的示例,简单流畅。