モードレスダイアログの破棄 – プログラミング – Home

モードレスダイアログの破棄
 
通知
すべてクリア

[解決済] モードレスダイアログの破棄


大三元
 大三元
(@大三元)
ゲスト
結合: 18年前
投稿: 54
Topic starter  

環境は、 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
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

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

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

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

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


返信引用
REE
 REE
(@REE)
ゲスト
結合: 23年前
投稿: 240
 

MSDNの「CDialog 概要」より引用

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


返信引用
大三元
 大三元
(@大三元)
ゲスト
結合: 18年前
投稿: 54
Topic starter  

ありがとうございます。
イメージ的には、
ダイアログを閉じたら破棄されてるほうが
自然かなと思います。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました