【问题标题】:mouse wheel only can scroll either up or down鼠标滚轮只能向上或向下滚动
【发布时间】:2014-02-15 14:48:50
【问题描述】:

目前我正在开发一个可以放大和缩小的游戏编辑器。有一个问题是我可以向上或向下滚动鼠标滚轮。我无法同时实现滚动,即如果我在编辑器类中调用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;
    }
}

【问题讨论】:

    标签: c++ scroll directx mouse mousewheel


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:
      case WM_MOUSEWHEEL:
              if ((short)HIWORD(msg.wParam) < 0)
              {
                  zoom-=3;
              }
              else
              {
                  zoom+=3;
              }
              break;
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-08
        相关资源
        最近更新 更多