私は本質的に、WindowsプログラムのWM_QUIT、WM_CLOSE、およびWM_DESTROYメッセージの違いを疑問に思っていました:本質的には、それらはいつ送信され、プログラムによって定義されたもの以外に自動効果がありますか?
それらはまったく違います。
WM_CLOSE
は、ウィンドウメニューから[X]を押すか、[閉じる]を選択すると、ウィンドウに送信されます。このメッセージをキャッチした場合、これをどのように処理するかを呼び出します。無視するか、実際にウィンドウを閉じます。デフォルトでは、WM_CLOSE
がDefWindowProc
に渡されると、ウィンドウが破棄されます。ウィンドウが破棄されると、WM_DESTROY
メッセージが送信されます。この段階では、toWM_CLOSE
に反対して、プロセスを停止することはできず、必要なクリーンアップのみを行うことができます。ただし、すべての子ウィンドウが既に破棄される直前にWM_DESTROY
をキャッチすることを忘れないでください。 WM_NCDESTROY
は、すべての子ウィンドウが破棄された直後に送信されます。
WM_QUIT
メッセージはどのウィンドウにも関連していません(hwnd
から取得したGetMessage
はNULLであり、ウィンドウプロシージャは呼び出されません)。このメッセージは、メッセージループを停止し、アプリケーションを閉じる必要があることを示しています。 GetMessage
がWM_QUIT
を読み取るとき、それを示すために0を返します。 標準的なメッセージループスニペット を見てください-GetMessage
がゼロ以外を返す間、ループが継続されます。 WM_QUIT
は、PostQuitMessage
関数によって送信できます。この関数は通常、メインウィンドウがWM_DESTROY
を受け取ったときに呼び出されます( typical window procedure snippet を参照)。
まず、 WM_CLOSE および WM_DESTROY メッセージは特定のウィンドウに関連付けられていますが、 WM_QUIT メッセージはアプリケーション全体(スレッド)に適用されます。メッセージはウィンドウプロシージャ(WndProc
ルーチン)を介して受信されることはなく、GetMessage
またはPeekMessage
関数を介してのみ受信されます。
WndProc
ルーチンでは、DefWindowProc
関数がこれらのメッセージのデフォルトの動作を処理します。 WM_CLOSE メッセージは、アプリケーションを閉じることを要求します。これに対するデフォルトの動作は、DestroyWindow
関数を呼び出すことです。このDestroyWindow
関数が呼び出されると、 WM_DESTROY メッセージが送信されます。 WM_CLOSE は、閉じることを要求するメッセージにすぎないことに注意してください( WM_QUIT など)-実際に終了/終了する必要はありません。ただし、 WM_DESTROY メッセージは、ウィンドウ[〜#〜] [〜#〜](〜#〜]が閉じられて破棄されていることを示していますリソース、ハンドルなどをクリーンアップする必要があります。
ちょうどそれがコメントで迷子にならないように... _WM_CANCEL
_を忘れないでください。 MFCダイアログの閉じる(x)ボタンをクリックすると、確実に_WM_CLOSE
_が送信されます。デフォルトのOnClose()
関数は、デフォルト(ベースクラス)OnCancel()
関数を呼び出します。
ただし、単にESC
キーを入力すると、ダイアログが閉じられますが、(私が知る限り)_WM_CLOSE
_イベントを生成せずに-WM_CANCEL/OnCancel()
メカニズム。
コミュニティにこれについて詳しく説明するか、その詳細を受け入れられた答えに編集するよう、ここに招待します。
まず、WM_QUIT-これはウィンドウに関連付けられていない別のメッセージとの違いについて説明しましょう。アプリケーションで使用されます。たとえば、これは非表示のスタンドアロンOLE server(.exeですが、.dllとしてのインプロセスではありません)で処理できます)
WM_CLOSE-msdnごと: "ウィンドウを破棄する前に、アプリケーションはユーザーに確認を求めることができます"-閉じようとする意図に関する通知として使用されます(この意図を拒否できます)。
WM_DESTROY-ウィンドウが閉じており、すべてのリソースの割り当てを解除する必要がある(!)という事実です。