この:postncdestroyメンバー関数の使用について説明します。CWndの割り当てをカスタマイズしたい場合にこの関数を使用して-オブジェクトを派生。
このノートは、またいくつかの基本的な規則のための説明します。:
C++ ウィンドウ オブジェクトを破棄するには、DestroyWindow ない「削除」を使用。
これは重要です。以下のガイドラインに従うと、ほとんどのクリーンアップ問題 (削除/C++ メモリの解放を忘れる、 HWNDs などのシステム リソースの解放を忘れる何回もオブジェクトの解放など) 必要 あります。
問題
ウィンドウ オブジェクト ( CWndから派生したクラスのオブジェクト) は、(アプリケーションのヒープに割り当てられた)、C++ オブジェクトと HWND (システム リソースでは、ウィンドウ マネージャーによって割り当て) の両方を表します。ウィンドウ オブジェクトを破棄するには、いくつかの方法があります。 があるため、システム リソースまたはアプリケーションのメモリ リークが発生して、オブジェクトと Windows ハンドル複数回破棄規則のセットを提供する必要があります。
これ以上のメモリ管理の問題です。Windows のウィンドウのユーザー インターフェイスへの影響が: を画面上に描画するウィンドウそれが破棄されるとも、影響はシステム リソースです。アプリケーションのアドレス空間における C++ メモリ リークが発生してシステム リソースのリークほど重大ではないです。
Windows を破壊
Windows オブジェクトを破棄するには、2 つの許可の方法します。:
最初のケースは、これまでは、最も一般的です。この場合はDestroyWindowコードから直接呼び出されない場合でもに適用されます。ユーザーが直接 ( WM_CLOSEの既定の動作はDestroyWindowを呼び出す)、フレーム ウィンドウを閉じるときは、親ウィンドウが破棄されると、Windows はすべての子供のためDestroyWindowを呼び出す。
2 番目のケースでは、Windows オブジェクトは、削除演算子の使用非常にまれである必要があります、以下の場合にのみ。
自動クリーンアップ:postncdestroy の
Windows のウィンドウを破棄するときは、ウィンドウに送信された最後の Windows メッセージWM_NCDESTROYです。CWndの既定ハンドラー メッセージ (CWnd::OnNcDestroy) をPostNcDestroy仮想関数呼び出し、C++ オブジェクトからHWNDをデタッチします。いくつかのクラスは C++ オブジェクトを削除するには、この関数をオーバーライドします。
:Postncdestroyの既定の実装では、スタック フレーム上に割り当てまたは他のオブジェクトに埋め込まれたウィンドウ オブジェクトは何もしません。これは自分で (その他の C++ オブジェクトに埋め込まれていない)、ヒープ上に割り当てられるように設計されていますウィンドウ オブジェクトではありません。
自分では、ヒープに割り当てられるよう設計されているこれらのクラスは」「これを削除するには、 PostNcDestroyメンバー関数をオーバーライドします。このステートメントは、C++ オブジェクトに関連付けられた任意 C++ メモリを解放します。M_hWndが非 NULL の場合DestroyWindow既定CWndのデストラクターを呼び出しますが、戸建、NULL ハンドル、クリーンアップ フェーズ中にあるのでこの無限の再帰をリードしていません。
注特価;:Postncdestroy通常と呼ばれる、Windows 後WM_NCDESTROYメッセージ処理、ウィンドウの破棄の一部として、 HWNDと C++ ウィンドウ オブジェクトは、もはや添付されています。(下記参照の自動クリーンアップ規則) に障害が発生した場合:postncdestroyもほとんど作成呼び出しの実装では(&N)。
自動後処理クラス
次のクラスは、自動クリーンアップは設計されていません。彼ら通常他の C++ オブジェクトまたはスタック上に埋め込まれています。:
次のクラスは自動後処理用設計されています。彼ら通常自分自身によってヒープ上に割り当てです。:
これらのルールのいずれかを分割したい場合は、派生クラスで、 PostNcDestroyメンバー関数をオーバーライドする必要があります。自動クリーンアップをクラスに追加するには、単に基本クラスを呼び出すし、これを削除する操作を行います。自動後処理クラスから削除するには、 :postncdestroy直接ではなく、 PostNcDestroy内のメンバー、直接の基本クラスを呼び出す。
上記の最も一般的な使用がヒープに割り当てることができるモードレス ダイアログを作成するには。
呼び出し ' 削除時 '
Windows オブジェクトを破棄するための推奨方法DestroyWindow、いずれか、C++ メンバー関数またはグローバル呼び出しに:: DestroyWindow API。
グローバル呼び出さないでください:: DestroyWindow 、MDI 子ウィンドウを破棄する API が代わりに仮想メンバー関数CWnd::DestroyWindowを使用。
自動クリーンアップを実行しない C++ ウィンドウ オブジェクトには、削除するのではなくDestroyWindowを使用してDestroyWindowの電話をすることの問題を回避、 CWnd:: ~ CWndデストラクターを正しく派生クラスに、VTBL でポイントがないです。MFC のデバッグ (診断) バージョンを警告が表示されますのでこの微妙なバグにつながることができます。
警告: DestroyWindow 呼び出しで CWnd:: ~ CWnd特価;OnDestroy または PostNcDestroy 派生クラスでは呼び出されません(&N)
自動クリーンアップを行う C++ Windows オブジェクトの場合は、 DestroyWindowを呼び出す必要があります。直接使用するオペレーターを削除する場合は、MFC のメモリ診断アロケーターが 2 回 (最初の呼び出しを削除する) として、間接呼び出しを「削除」実装では、自動クリーンアップPostNcDestroyメモリを解放するいること警告します。
DestroyWindow非自動クリーンアップ オブジェクトでの呼び出し後、C++ オブジェクトまだ周りがm_hWndは NULL になります。DestroyWindow自動クリーンアップ オブジェクトを呼び出した後は、C++ オブジェクト実装では、自動クリーンアップPostNcDestroyの C++ の delete 演算子によって解放消えてになります..
番号順テクニカル ノート|nbsp;カテゴリ別テクニカル ノート(&N)