環境は、 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.自分のやり方はかなり苦しいことをやってると思うのですが、通常このようなこと
をやりたい場合、みなさんならどのように制御しますか?
宜しくお願いします。
> 1.モードレスダイアログCDebugDlgのバツボタンを押してもOnDestoryに飛んでこな
い。なぜ?
モードレスダイアログを閉じた場合、ダイアログは破棄されず、
非表示になるだけだからです。
方法1)
OnClose() で DestroyWindow() を呼び出し、
閉じたら破棄するようにする。
方法2)
「破棄されていたら再作成」というロジックをやめて、
「非表示なら再表示」というロジックにする。
MSDNの「CDialog 概要」より引用
モードレス ダイアログ ボックスをインプリメントするときは、必ず OnCancel メンバ関
数をオーバーライドし、その中から DestroyWindow を呼び出します。基本クラスの
CDialog::OnCancel を呼び出さないでください。この関数は EndDialog を呼び出すの
で、ダイアログ ボックスは破棄されず、非表示になるだけです。モードレス ダイアロ
グ ボックスは通常 new を使って割り当てられるので、this を消去するようにモードレ
ス ダイアログ ボックスの PostNcDestroy もオーバーライドする必要があります。
ありがとうございます。
イメージ的には、
ダイアログを閉じたら破棄されてるほうが
自然かなと思います。