モードレスダイアログの作り方

MSDNより

  • 必ず OnCancel メンバ関数をオーバーライドし、その中から DestroyWindow を呼び出す。
  • 基本クラスの CDialog::OnCancel を呼び出さない。
  • この関数はEndDialogを呼び出すため、ダイアログボックスは破棄されず、非表示になるだけです。
    モードレス ダイアログ ボックスは通常 new を使って割り当てられるため、this を消去するように
    モードレスダイアログのPostNcDestroyもオーバーライドする。

CDialogから派生したモードレスダイアログ用のクラスを作成します。
OnCancelをオーバーライドし、DestroyWindowを呼び出すよう追加します。

void C***Dlg::OnCancel()
{
    DestroyWindow();
    //CDialog::OnCancel();
}

PostNcDestroyをオーバーライドし、delete thisを追加する。

void C***Dlg::PostNcDestroy()
{
    delete this;    //BBB追加  ダイアログの破棄
}

その他の方法

ダイアログクラスをメンバ変数として追加する。

C***Dlg m_dlg;

ダイアログボックスを構築、起動する。

m_dlg.Create(IDD_XXX, this);

ダイアログボックスを表示させる。
//必要に応じてダイアログデータの値を設定する処理

m_dlg.ShowWindow(SW_SHOW);
ダイアログボックスを非表示にする(必要なければ省略可)。

m_dlg.ShowWindow(SW_HIDE);

ダイアログボックスを破棄する。

m_dlg.DestroyWindow();