1

私は WTL の仕組みを理解しようとしていますが、メッセージ ループが今私を混乱させています。

たとえば、次のコード フラグメント:リンク

最初にウィンドウが作成され、その後メッセージ ポンプが開始されます。なぜそれが機能するのですか?CreateEx、UpdateWindow などは、WM_CREATE/WM_PAINT/WM_NCPAINT のような独自の目に見えないメッセージを送信することになっていませんか? メッセージ ポンプが初期化されていない場合、メッセージはどこにスローされますか? ウィンドウを作成し、メッセージ ループを開始してからウィンドウを閉じた後、その場所に新しいウィンドウを作成したい場合はどうなるでしょうか。PostQuit はループを終了し、新しいものを作成する必要がありますか?

4

2 に答える 2

3

ここでは、メッセージの投稿 (PostMessage) とメッセージの送信 (SendMessage) の違いを理解することが重要です。Windows は、送信されたメッセージに対してウィンドウ プロシージャを直接呼び出します。メッセージ ループによってディスパッチされることはありません。これは、メッセージ ループが開始される前に WM_CREATE と WM_SHOWWINDOW を処理する方法です。WM_QUIT、WM_PAINT、WM_KEYDOWN、および WM_MOUSEMOVE は、ポストされるメッセージの例です。

于 2011-03-01T15:46:25.203 に答える
2

メッセージ送信に関しては、CreateWindowあたかもSendMessage使用されたかのように、メッセージを直接送信します。Windows プログラミングの経験が豊富であれば、この方法でメッセージをコントロールに直接送信し、メッセージ ポンプを実行しなくてもすぐに処理を実行したことがあるでしょう。Windowsもこれを自分で行います。

このPostQuitMessage問題に関しては、通常の戦術は、メッセージ ループで他のチェックを行って、アプリケーションを終了する必要があるかどうかを確認することです。たとえば、ウィンドウを閉じるときに終了メッセージを送信しWM_QUITてメッセージ ループで待機するのではなく、開いているウィンドウのカウンターを維持し、開いているウィンドウが 0 の場合に終了することができます。

を投稿して(etc.) 関数で簡単に確認WM_QUITできる便利な方法を除いて、について魔法は何もありません。それを使用せず、他の理由でプログラムを終了することは自由です。PostQuitMessageGetMessage

于 2011-03-01T15:04:49.657 に答える