1

I'm writing a Win32 OpenGL application for painting where it is critical that all mouse movement is handled. As it happens, sometimes the painting operation in my program is not able to perform in real time -- which is fine for me, as long as all mouse events are queued and can be handled later. Now I would have thought that this would simply be a matter of calling PeekMessage making sure to process all events, but when I do this, it is apparent that the mouse movements my application receives are not of the same fidelity that as those being displayed by Windows.

Is this a feature of Windows? Are mouse event dropped when the application is labor intensive? Or am I missing something? In either case, what can I do to remedy this situation? I would like to avoid multi-threading, part of the reason being that, as I understand, Win32 requires the message callback to be in the main thread and I'm not sure about separating the OpenGL-stuff to a different context.

And as for code example, I am essentially using the template code in the link below. The message I'm checking for is WM_MOUSEMOVE.

http://nehe.gamedev.net/tutorial/creating_an_opengl_window_(win32)/13001/

4

2 に答える 2

6

これは Windows の機能ですか? アプリケーションが労働集約的である場合、マウス イベントは削除されますか?

はい、これは機能です。WM_MOUSEMOVE メッセージは破棄されず、合成されます。つまり、実際にはメッセージ キューにポストされません。これは実際にはあまりうまく機能しません。プログラムがビジー状態の場合、ユーザーは 1 秒間に非常に多くのマウス操作を生成し、メッセージ キューを急速にいっぱいにしてしまう可能性があります。

最後に GetMessage() を呼び出してからマウスが移動すると、WM_MOUSEMOVE メッセージが表示されます。そして、あなたは最後の既知の位置を取得します。したがって、それらを取得する速度とそれらの間のピクセル数は、GetMessage() を呼び出す頻度に直接依存します。

別の方法はraw inputを使用することです。

于 2013-07-07T14:57:19.577 に答える