ダイアログベースでメイン画面を表示し、
// AppのInitInstance()で呼んでいる。
CDlgMain dlg();
m_pMainWnd = &dlg;
dlg.DoModal();
メインのダイアログからボタンを押されたときに
メンバであるダイアログベースの画面(検索画面)を表示しています。
void CDlgMain::OnButton()
{
m_DlgSearch.DoModal();
}
検索画面を表示すると、ラジオボタンやエディットボックスが
あります。ラジオボタンを押すと、エディットボックスが
操作不可になります。
ここでOKを押すと検索画面は、消えてしまいます。
もう一度ボタンを押して、検索画面を表示させると、
ラジオボタンやエディットボックスが初期状態に戻ってしまいます。
ラジオボタンやエディットボックスを検索画面のメンバにしてみても
元に戻ってしまいます。
初期状態に戻す処理は、OnInitDialog()で行っています。
検索画面の状態は、検索画面クラス(CDlgSearch)で持っておきたいのですが、
ボタンを押すたびにOnInitDialog()が呼ばれてしまいます。
DoModal()だと、ダイアログが破棄されてしまうのですか?
初期状態は、1度だけで、ボタンを何度押しても状態を保持しておきたいのですが、
いい方法があれば教えてください。
開発環境は、
VC++6.0
MFC,PlatFormSDK
Windows2000です。
OnInitDialog()は WM_INITDIALOG メッセージでよびだされます。
WM_INITDIALOG はダイアログが最初に表示されるときに呼び出されますので
DoModal()を呼ぶたびに呼び出されます。
何回、DoModal()をよんでも、
CDlgSearchクラスを破棄するまではデータは保持されるはずです。
保持するデータをOnInitDialog()で初期化せずコンストラクタで初期化するように
すればよいのではないでしょうか。
間違っていたらすみません
メンバ変数で状態を保持し、OnInitDialog内で保持した状態で表示すればよいのでは?
コンストラクタ内で
m_bState = TRUE;
OnInitDialog内で
m_Edit.EnableWindow(m_bState);
状態を変更する時に
m_bState = FALSE; ←状態を取得しての方がいいかもこれでは固定なので
などとすると
OnInitDialogが何回呼ばれようが前のままで表示されるはずです
みなさん、ありがとうございます。
やっぱり、OnInitDialogでメンバ変数の反映という形しかないようですね。
うー。簡単な方法があると思ったのですが。
モードレスダイアログを使って、
ダイアログを破棄せずに非表示にしておくこともできます。