В настоящее время я работаю над редактором игр, который может увеличивать и уменьшать масштаб. Есть проблема, которую я могу сделать, прокручивая колесико мыши вверх или вниз. Я не могу добиться как прокрутки, т. Е. Если я позвоню 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, и поэтому возвращаемый результат этого метода всегда ложен.
Вы должны подойти к этой проблеме по-другому. Вы можете, например, ввести какое-то отображение для константы или перечисления, которое обозначает колесико мыши вверх или вниз. Или вы можете обработать в вашем методе обновления значение необработанного входящего события. Это, вероятно, лучший способ, так как это, очевидно, дельта-значение, которое может быть более или менее большим в зависимости от того, сколько вы вращаете колесо мыши. Вы должны принять во внимание дельту для внесения больших или меньших изменений в значение масштабирования.
case WM_MOUSEWHEEL:
if ((short)HIWORD(msg.wParam) < 0)
{
zoom-=3;
}
else
{
zoom+=3;
}
break;
Пример использования колесика мыши, простой и удобный.