2014-02-21 37 views
0

所以,我用OpenGL在C++中制作游戏,我希望我的光标停留在屏幕中间。C++ WinAPI - 马虎鼠标输入

在每一帧的开始我叫

POINT pt; 
pt.x = 400; 
pt.y = 300; 
ClientToScreen(hWnd, &pt); 
SetCursorPos(pt.x, pt.y); 

然后,在WM_MOUSEMOVE事件我做

POINT p; 
GetCursorPos(&p); 
ScreenToClient(hWnd, &p); 
dx = p.x - 400; 
dy = p.y - 300; 

窗口是800×600,所以我就写了这些数字,这将明显改变后来。

它的工作原理,但它很马虎。就像一些帧会被丢弃一样。

+2

不要试图做到这一点。鼠标和它的光标是一个共享资源,它不适合单个应用程序重复移动它。如果你想要一个看起来像鼠标光标的东西出现在你的窗口中间,那么隐藏真实的光标并在你想要的位置绘制你想要的东西。 –

+0

我想在窗口中包含光标,所以我可以在第一人称摄像机中使用移动参数来移动摄像机 – RobeeZ

+0

您仍然可以执行将要说的操作。隐藏光标,但使用鼠标移动消息来操作相机。 – MikeD

回答

1

您可以使用ClipCursor()限制鼠标的移动。直到释放它,鼠标才能移动到指定矩形的外面。

+0

好吧,它的工作原理,但我应该如何处理,如果鼠标在边界?我想旋转,如果它在边缘。因为现在如果我向外移动客户端,并且它不会出去,所以没有三角洲,但我想旋转相机 – RobeeZ

+0

使剪辑矩形稍大于您的窗口,然后使用SetCapture()可以接收鼠标消息,如“WM_MOUSEMOVE”和“WM_LBUTTONUP”,即使鼠标位于窗口之外。或者,只需忘记'ClipCursor()'并自己使用'SetCapture()',这样用户就有更多的空间来自由移动。无论哪种方式,当左侧按钮按住窗口时捕获鼠标,然后释放按钮释放捕获。您可以根据消息之间的移动或鼠标消息坐标与窗口坐标之间的距离来计算增量值。 –

0

您可以尝试通过SetWindowsHookEx(通过WH_MOUSE或者甚至WH_MOUSE_LL)安装钩子,并在相应的窗口消息发送之前丢弃所有移动事件。