目前我正在开发一款可以放大和缩小的游戏编辑器。我可以做的问题是向上或向下滚动鼠标滚轮。我无法实现两种滚动,即如果我在编辑器类中调用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;
}
}
答案 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;
使用鼠标滚轮滚动的示例,简单明了。