プロパティーシートを利用するには?


phootarou  2003-11-05 06:11:14  No: 52401

プロパティーシートについて質問があります(開発環境はVC++6.0 MFC ダイアログベースです)。
メインダイアログに配置したプッシュボタンを押すとプロパティーシートが表示されるようにしたいのですが、プロパティーページに配置したコントロール(ラジオボタンやチェックボックスなど)を初期化するためにプロパティーページクラスのファイルにInitDialog()を追加し、その関数内部でUpdateData(FALSE)を呼び出しています。しかし、コントロールメンバ変数の値がプロパティーページのコントロールには反映されません。また、プロパティーシートのOKボタンを押してもコントロールメンバ変数に反映されません。プロパティーシートの代わりにカスタムダイアログを利用した場合はうまくいったのですが原因がわかりません。どなたか教えていただけないでしょうか。いかにコードの一部を記載します。よろしくお願いします。

(メインダイアログクラス)
BOOL CTestDlg::OnInitDialog()
{
  CDialog::OnInitDialog();

  ・・・・・・・・・・・・・・
  
  // TODO: 特別な初期化を行う時はこの場所に追加してください。

  m_pSettingProppage.m_Check = TRUE;
  m_pSettingProppage.m_Radio = 0;
  m_pSettingProppage.m_Edit = 8;

  return TRUE;  // TRUE を返すとコントロールに設定したフォーカスは失われません。
}

void CCleaningRobotDlg::OnSettingButton() 
{
  // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください

  CSettingPropsheet SettingPropsheet("各種設定");  // タイトルバー設定
  if(SettingPropsheet.DoModal() == IDOK) {
    ・・・・・・・・・
  }
  else if(ret == IDCANCEL) {
    ・・・・・・・・・
  }  
}

(プロパティーシートクラス)
CSettingPropsheet::CSettingPropsheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
  :CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{
  MyAddPage();
}

CSettingPropsheet::CSettingPropsheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
  :CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
  MyAddPage();
}

CSettingPropsheet::~CSettingPropsheet()
{
}

void CSettingPropsheet::MyAddPage()
{
  // プロパティシートにページを登録する
  AddPage(&m_SettingProppage);
}

(プロパティーページクラス)
BOOL CSettingProppage::OnInitDialog() 
{
  CPropertyPage::OnInitDialog();
  
  // TODO: この位置に初期化の補足処理を追加してください

  UpdateData(FALSE);
  
  return TRUE;  // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります
                // 例外: OCX プロパティ ページの戻り値は FALSE となります
}


JUN2  2003-11-05 23:38:09  No: 52402

う〜ん、なんでだろ?
書いてあるソースをみる限りあってそうなんだけど・・・
自分の環境ではOKなんだけどなぁ。ちなみにVC++ .NET


なーめ  2003-11-30 02:52:57  No: 52403

CPropertyPage::OnInitDialog();
の中から UpdateData(FALSE); がすでに
呼び出されているはずです。
だから、プロパティシート側(下)の UpdateData(FALSE); は無駄です。
DoDataExchange() にブレークポイントを貼って確認のこと。

    m_pSettingProppage.m_Check = TRUE;
    m_pSettingProppage.m_Radio = 0;
    m_pSettingProppage.m_Edit = 8;

ハンガリー記法がめちゃめちゃです。
m_p で始まるメンバは、はポインタでなければなりません。
m_Check は BOOL なら、m_bCheck でしょう。

以前グローバル変数に m_ つけてたばか者がいた(仕事で!)。
他人に見られうるコードを書く場合には特に気をつけなければなりません。
精進してください。
ちなみに、スマートポインタを知ってますか?
ポインタといいながら、
 m_spScrCtx.CoCreateInstance( L"ASP.ScriptingContext.1" );
などとやったりします。

それはさておき、
m_pSettingProppage  
ってメンバですよね。
DoModal() って同じインスタンスから何度も使うとおかしなことが
おきると記憶してますが、気のせいかな?
OnButtonXXX()で毎回インスタンス生成するようにするか、
モードレスダイアログにして ShowWindow( SH_SHOW/SH_HIDE ) するのが
よいと思われます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加