3

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つのクラスはモードレスモードとモーダルモードで使用できるはずなので、別のことをする必要がないのは便利かもしれません.

4

1 に答える 1