2

に問題がありWM_SIZEます。PeekMessage(ではなく)を使用してキャプチャしたいWndProcPeekMessageを受信することはないWM_SIZEので、次のようにキャプチャするために追加のユーザーメッセージをウィンドウに投稿しますPeekMessage(からのコードWnProc):

case WM_SIZE:
  PostMessageW(hwnd, WM_USER + 1, wParam, lParam);
  break;

問題は、ウィンドウが最大化または復元されたときにのみWM_USER + 1使用して受け取ることです。PeekMessageウィンドウが太いフレームでサイズ変更されてもメッセージは表示されません(ただし、受信WM_SIZEWndProcます)。

4

2 に答える 2

5

PeekMessage()は、メッセージキューに投稿されたメッセージのみを表示できます。これはWM_SIZEを除外し、送信され、投稿されません。つまり、SendMessage()によって配信され、ウィンドウプロシージャを直接呼び出して、メッセージキューをバイパスします。そうです、PostMessageを使用してメッセージを再投稿すると、コードが機能し始めます。メッセージキューに入れられ、PeekMessageがメッセージを確認できるようになります。

ユーザーがウィンドウのサイズを変更すると、何か別のことが起こります。これは、別のメッセージWM_SIZINGによって報告されます。これは、Windowsがモーダルメッセージループを開始してサイズ変更操作を実装すると、かなり高い割合で生成されます。これを通知します。モーダルループの開始時(ユーザーがウィンドウコーナーをクリック)にWM_ENTERSIZEMOVEを取得し、完了したとき(ユーザーがボタンを離したとき)にWM_EXITSIZEMOVEを取得します。ウィンドウプロシージャに送信される一連のWM_SIZINGメッセージを受け取ります。投稿されていません。そして、1つのWM_SIZEで最終的なサイズを指定します。これらのメッセージのこれらの反映されたバージョンを表示しない1つの方法は、独自のメッセージループでPeekMessage()を呼び出す場合です。Windowsのモーダルサイズ変更ループがアクティブな場合は呼び出されません。

より良いアドバイスを与えるのは難しいですが、なぜあなたがこれをしているのかは本当に不明確です。「医者、それは痛い、それならやらないでください」医学的答えは関連性が高い可能性が高いです。WM_SIZINGメッセージも反映したいと思うかもしれません。最大の問題は、キューからこれらのメッセージを取得するまでに、ウィンドウサイズがすでに変更されており、通知が古くなっていることです。これが、メッセージが送信され、投稿されない理由です。

于 2012-06-11T17:31:36.797 に答える
1

私はこれが当てはまると信じています:

PeekMessageがメッセージを取得していませんか?

クラスポインタをCreateWindowExの呼び出しの最後のパラメータに渡す必要があります。次に、WM_CREATEのLPARAMで渡されたLPCREATESTRUCTからそのポインタを取得します。クラスポインタは、構造体のlpCreateParmasフィールドにあります。クラスポインタをウィンドウのGWLP_USERDATAに設定し、その他のメッセージ呼び出しでは、GetWindowsLongを呼び出し、クラスポインタを取得してから、メッセージ、wparam、およびlparamをすべて内部クラスメッセージハンドラに渡します。

http://msdn.microsoft.com/en-us/library/ff381400%28v=VS.85%29.aspx

于 2012-06-11T17:13:26.963 に答える