MSのドキュメント(およびその他)には、「明確に」次のように記載されています。
... CDialog オブジェクトの通常の OnOk および OnCancel メンバー関数は EndDialog を呼び出すため、モードレス ダイアログ ボックスがこれらの関数を呼び出さず、代わりにオーバーライドすることを確認してください。
CDialog::OnOk
効果的に を呼び出すためCDialog::EndDialog
、そのメソッドは次のようになります。
void CDialog::EndDialog(int nResult)
{
ASSERT(::IsWindow(m_hWnd));
if (m_nFlags & (WF_MODALLOOP|WF_CONTINUEMODAL))
EndModalLoop(nResult);
::EndDialog(m_hWnd, nResult);
}
再び「明確に」状態のドキュメントを::EndDialog
確認することもできます。
DialogBox、DialogBoxParam、DialogBoxIndirect、および DialogBoxIndirectParam 関数によって作成されたダイアログ ボックスは、EndDialog 関数を使用して破棄する必要があります。アプリケーションは、ダイアログ ボックス プロシージャ内から EndDialog を呼び出します。この機能を他の目的に使用してはなりません。
それでも、CDialog
デフォルトの動作を持つ派生クラスがあります。非モーダル/モードレスで使用するOnOK
と、一見すべてが機能しているようです。
つまり: * (モードレス) ダイアログを閉じると、閉じられるか、ビューから削除されます。* アプリケーションにメモリ リークは見られません。(MFC デバッグ ビルド)
だから何?予防して自分自身EndDialog
を呼び出す必要がありますか?DestroyWindow
注: ドキュメントと「Web」の内容は知っています。なぜ違うことをする必要があるのか まだわかっていないだけで、この1つのクラスはモードレスモードとモーダルモードで使用できるはずなので、別のことをする必要がないのは便利かもしれません.