開発環境はVisualStudio2005 WindowsXPでMFCを使用しています。
仕様はメニューバーからとあるメニューを実行したら、モーダルダイアログが表示され、そのモーダルダイアログのチェックボックスの状態を取得しようとしています。DDXは使用しません。
void Cxxx::OnExecMenu() //自作関数
{
CDialog dlgModal(IDD_xxx); //ダイアログリソースの読み出し
int iRet = dlgModal.DoModal(); //モーダルダイアログの表示
switch( iRet )
{
case -1:
AfxMessageBox( _T("modal dialog could not be created!!") );
break;
case IDOK:
UINT uiRet = IsDlgButtonChecked( IDC_xxx ); //チェックボックスリソースの読み出し(★問題箇所)
break;
}
該当チェックボックスにチェックを付けた状態で、モーダルダイアログのOKボタンを押下しても、
★のところでuiRetが必ず0になり、正常な状態を取得できません。
どのようにしたらよろしいでしょうか?
ご教授ください。
ダイアログをモーダルで表示して閉じてしまうと、
そのリソースはすべて消えてしまいます。
ですので、いくらチェックを入れてもなくなってしまうので、チェックされているか
どうかすら確認できなくなります。
IDでリソースにアクセスせずに、DDXのように一度(リソースではない)変数に入れてからそれを使うように
するしかないでしょう。
OnOKあたりでチェックの入っているリソースIDを配列に入れるやらフラグやらで保持する等
Blueさん、ありがとうございます。
該当クラスはCDialogを継承していないので、DDXのように出来ないのではと思っています。
すみませんが、具体的なソースコードでご教授いただけないでしょうか?
>CDialogを継承していない
ということは、前述通りダイアログ閉じた後では無理では?
グローバル変数で対象チェックボックスのステータスを格納する変数を用意したり、(一時)ファイルでステータスを保存したり、という方法はなしなのでしょうか?
的外れな内容だったらごめんなさい・・・>_<
継承しないので、そのファイルやグローバル変数に格納するタイミングがないわけで、
継承しなくてもたぶんできなくはないと思うけど(CDialogを使わないとか)、
素直に継承したほうがよっぽど簡単なコードになるしわかりやすいとおもう。
ありがとうございました。
CDialogを継承した新しいクラスを作って解決しました。
ツイート | ![]() |