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

时间:2014-02-15 14:48:51

标签: c++ scroll directx mouse mousewheel

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

获取鼠标滚轮meesage

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;
    }
}

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

使用鼠标滚轮滚动的示例,简单明了。