Ily*_*tov 0 windows directx winapi mouseevent c++14
我正在研究 Direct3D 游戏引擎,我从之前的项目中获得了鼠标和键盘设置,但最近遇到了问题:
问题是,我的引擎是针对射击/砍杀游戏的,因此它需要直接输入,这是在之前的项目中使用 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;
}
Run Code Online (Sandbox Code Playgroud)
问题是,该代码仅返回鼠标的相对移动,它在设置相机查找时很有用,但是当涉及到由鼠标(按钮等...)控制的菜单或基本 GUI 时,事情就会变糟:GUI 和其他控件需要相对于客户端矩形计算光标位置。
我在 WinAPI 中找到的最接近答案是GetCursorPos()与 结合使用GetWindowRect(),但是如果窗口有标题栏相对偏移量,则它不算在内,并且 (0,0) 坐标设置在标题栏的顶部,但不在客户端区域上。
如何在不丢失相对鼠标移动的情况下解决该问题?
- 我应该尝试用 WM_INPUT 解析 WM_MOUSEMOVE 消息吗?
我一直在寻找一种流行的游戏引擎输入解决方案,但没有找到任何特定的解决方案。
附加信息:
当您需要绝对鼠标位置时,最好的选择是使用标准WM_MOUSE*消息,并且仅用于WM_INPUT相对鼠标位置。通常,在调出 UI 或其他一些方面以进入/退出相对“外观”模式时,您会进行模式转换。
WM_INPUT在大多数情况下仅提供相对信息,如果您尝试模仿绝对的自己,您将错过很多指针弹道,这会让您感觉非常糟糕。
请注意,如果您希望游戏支持通过远程桌面使用(通常用于测试),那么您需要处理从绝对位置模拟相对输入,因为在虚拟桌面的情况下,您永远不会从
WM_INPUT. 这由 表示MOUSE_VIRTUAL_DESKTOP。
您可能想看看DirectX Tool Kit中的Mouse类实现。
| 归档时间: |
|
| 查看次数: |
2499 次 |
| 最近记录: |