Я работаю на движке Direct3D Game, я получил настройки мыши и клавиатуры из моего предыдущего проекта, но недавно столкнулся с проблемой:
Дело в том, что мой движок предназначен для игры в шутер / слешер, поэтому он требует прямого ввода, который был задан в предыдущем проекте с использованием анализа сообщений RAWMOUSE и WM_INPUT.
case WM_INPUT:
if (wParam == RIM_INPUT)
{
dword dwSize = 48;
RAWINPUT raw;
if (GetRawInputData((HRAWINPUT)lParam, RID_INPUT, &raw, &dwSize,
sizeof(RAWINPUTHEADER)) != dwSize)
OutputDebugString(TEXT("GetRawInputData does not return correct size !\n"));
if (raw.header.dwType == RIM_TYPEMOUSE)
{
this->mouse.TranslateMouseInput(raw.data.mouse);
}
break;
}
Проблема в том, что код возвращает только относительное движение мыши, это полезно при настройке поиска камеры, но когда дело доходит до меню или базового графического интерфейса пользователя, которые управляются мышью (кнопками и т. Д.), Дела идут плохо: GUI и другие элементы управления требуют, чтобы позиция курсора была рассчитана относительно клиентского прямоугольника.
Ближайшая вещь, которую я нашел, чтобы ответить в WinAPI - это GetCursorPos()
в сочетании с GetWindowRect()
, но если у окна есть строка заголовка, относительное смещение не учитывается, и координата (0,0) устанавливается в верхней части заголовка бар, но не на клиентском регионе.
Как решить проблему, не теряя относительное движение мыши?
-Можно ли попытаться проанализировать сообщения WM_MOUSEMOVE с помощью WM_INPUT?
Я искал популярное решение для ввода игровых движков, но не нашел ни одного конкретного.
Дополнительная информация :