私のデモアプリで
case WM_CLOSE:
DestroyWindow(hndl);
return 0;
と
case WM_CLOSE:
PostQuitMessage(0);
return 0;
同じことをする。それぞれを呼び出すときのカーテンの後ろの違いは何ですか? PostQuitMessage が false を返す getmessage ループを通過する必要がある場合、DestroyWindow はより直接的ですか?
DestroyWindow
ウィンドウを破棄し (驚き) 、メッセージ キューにa WM_DESTROY
(また、 a も取得します) を投稿します。WM_NCDESTROY
これは のデフォルトの動作ですWM_CLOSE
。ただし、ウィンドウが破棄されたからといって、メッセージ ループが終了するわけではありません。これは、閉じたときにアプリケーションを終了する特定のウィンドウと、閉じたときにアプリケーションに何もしない他のウィンドウ (オプション ページなど) を持つ場合に当てはまります。
PostQuitMessage
をメッセージ キューにポストしWM_QUIT
、多くの場合、メッセージ ループを終了させます。たとえば、GetMessage
a を抜くと 0 を返しますWM_QUIT
。これは通常WM_DESTROY
、メイン ウィンドウのハンドラで呼び出されます。これはデフォルトの動作ではありません。あなたはそれを自分でしなければなりません。
どちらのスニペットも正しくありません。最初のウィンドウ プロシージャは、WM_CLOSE メッセージを処理するときに既定のウィンドウ プロシージャが既に行っていることを行うため、不要です。ただし、それ以外の場合はアプリケーションを終了させません。アプリケーションは実行を継続する必要があり、通常は、Debug + Stop Debugging でデバッガーを強制的に停止する必要があります。デバッガーなしで実行すると、プロセスは実行されたままになりますが、ウィンドウが表示されないため、まだ実行中であることがわかりません。Taskmgr.exe の [プロセス] タブを使用して、これらのゾンビ プロセスを確認します。
2 番目のスニペットはアプリを終了しますが、既定のウィンドウ プロシージャに WM_CLOSE メッセージを渡さないため、適切にクリーンアップされません。ウィンドウは破壊されません。オペレーティングシステムがクリーンアップしてくれるとはいえ、エレガンスのボーナスポイントがないだけで、すべてがうまくいきます.
これを行う適切な方法は、メイン ウィンドウが破棄されたときに終了することです。それが発生したときに送信される WM_DESTROY 通知から、それについて知ることができます。
case WM_DESTROY:
PostQuitMessage(0);
return 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.