17

私のデモアプリで

case WM_CLOSE:
    DestroyWindow(hndl);
    return 0;

case WM_CLOSE:
    PostQuitMessage(0);
    return 0;

同じことをする。それぞれを呼び出すときのカーテンの後ろの違いは何ですか? PostQuitMessage が false を返す getmessage ループを通過する必要がある場合、DestroyWindow はより直接的ですか?

4

3 に答える 3

21

DestroyWindowウィンドウを破棄し (驚き) 、メッセージ キューにa WM_DESTROY(また、 a も取得します) を投稿します。WM_NCDESTROYこれは のデフォルトの動作ですWM_CLOSE。ただし、ウィンドウが破棄されたからといって、メッセージ ループが終了するわけではありません。これは、閉じたときにアプリケーションを終了する特定のウィンドウと、閉じたときにアプリケーションに何もしない他のウィンドウ (オプション ページなど) を持つ場合に当てはまります。

PostQuitMessageをメッセージ キューにポストしWM_QUIT、多くの場合、メッセージ ループを終了させます。たとえば、GetMessagea を抜くと 0 を返しますWM_QUIT。これは通常WM_DESTROY、メイン ウィンドウのハンドラで呼び出されます。これはデフォルトの動作ではありません。あなたはそれを自分でしなければなりません。

于 2013-05-25T11:46:44.400 に答える
17

どちらのスニペットも正しくありません。最初のウィンドウ プロシージャは、WM_CLOSE メッセージを処理するときに既定のウィンドウ プロシージャが既に行っていることを行うため、不要です。ただし、それ以外の場合はアプリケーションを終了させません。アプリケーションは実行を継続する必要があり、通常は、Debug + Stop Debugging でデバッガーを強制的に停止する必要があります。デバッガーなしで実行すると、プロセスは実行されたままになりますが、ウィンドウが表示されないため、まだ実行中であることがわかりません。Taskmgr.exe の [プロセス] タブを使用して、これらのゾンビ プロセスを確認します。

2 番目のスニペットはアプリを終了しますが、既定のウィンドウ プロシージャに WM_CLOSE メッセージを渡さないため、適切にクリーンアップされません。ウィンドウは破壊されません。オペレーティングシステムがクリーンアップしてくれるとはいえ、エレガンスのボーナスポイントがないだけで、すべてがうまくいきます.

これを行う適切な方法は、メイン ウィンドウが破棄されたときに終了することです。それが発生したときに送信される WM_DESTROY 通知から、それについて知ることができます。

case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
于 2013-05-25T12:04:53.703 に答える
0

PostQuitMessage doesn't necessarily mean the end of application. It simply posts WM_QUIT to the message loop and allows you to exit from the message loop, so in most cases, this means the end of the application. However, in a multithread application, if you have the message loop for each thread created, PostQuitMessage only closes that thread.

As a side note, if you ever need more lines of code to execute after the message loop (such as further clean-up), PostQuitMessage is a better way to go, because DestroyWindow destroys the window without going through the message loop, ignoring whatever clean-up codes remaining after the message loop. Some may call it a not-so-good coding practice, but sometimes you can't avoid situations like that.

于 2016-06-25T03:31:56.583 に答える