モードレスダイアログの破棄

[戻る]
大三元 2006/07/05(水) 10:17:08
環境は、 XP VC6.0 ダイアログベースです。

メインダイアログCMainDlgのシステムメニューに【デバッグ】という項目を追加し、
【デバッグ】が押下されたら、
サイズ変更枠のモードレスダイアログ(CDebugDlg)を表示させます。
もし、すでに表示されていたら何もしません。

CDebugDlgのメンバにBOOL型のm_stateを定義し、CDebugDlg::OnInitDialog()でTRUEに
し、CDebugDlg::OnClose()でFALSEにします。

CMainDlg::OnSysCommand(UINT nID, LPARAM lParam)内if文に以下のelse if文を追加
します。

else if((nID & 0xFFF0) == IDM_DEBUG){

    // 【デバッグ】ダイアログ表示中ならリターン
    if( g_pCDebugDlg->m_state != FALSE ) return;

    // デバッグダイアログを破棄してるか判定
    if( m_DebugState == TRUE ){
        g_pCDebugDlg->DestroyWindow();
        m_DebugState = FALSE;
    }

    // モードレスダイアログ作成
    if( 0 != g_pCDebugDlg->Create(IDD_DEBUG, this) ){
        m_DebugState = TRUE;
    }
}

//変数意味(CDebugDlg* g_pCDebugDlg,  BOOL m_DebugState;)
上記のようにモードレスダイアログの制御をしてるのですが、
そこで質問があります。

1.モードレスダイアログCDebugDlgのバツボタンを押してもOnDestoryに飛んでこな
い。なぜ?

2.1で破棄されてないのでもう一回Createできないため、m_DebugStateなる変数を作
り2重に見ている。できればバツボタン押下で削除したい。

3.自分のやり方はかなり苦しいことをやってると思うのですが、通常このようなこと
をやりたい場合、みなさんならどのように制御しますか?

宜しくお願いします。

dairygoods 2006/07/05(水) 10:39:09
> 1.モードレスダイアログCDebugDlgのバツボタンを押してもOnDestoryに飛んでこな
い。なぜ?

モードレスダイアログを閉じた場合、ダイアログは破棄されず、
非表示になるだけだからです。

方法1) 
OnClose() で DestroyWindow() を呼び出し、
閉じたら破棄するようにする。

方法2) 
「破棄されていたら再作成」というロジックをやめて、
「非表示なら再表示」というロジックにする。

REE 2006/07/05(水) 10:45:11
MSDNの「CDialog 概要」より引用

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

大三元 2006/07/05(水) 11:49:36
[[解決]]
ありがとうございます。
イメージ的には、
ダイアログを閉じたら破棄されてるほうが
自然かなと思います。

古いスレッドには追加発言できません。