カスタムダイアログに配置したコントロールの情報を得るには?

解決


phootarou  2003-10-27 08:19:19  No: 52332

カスタムダイアログ上に配置したスピンボタンやラジオボタンの情報をメインダイアログ上で取得するにはどうしたらよいのでしょうか?以下のコードでは強制終了されてしまいました。プログラムはMFCのダイアログベースで作成しています。よろしくお願いします。

if(m_dCustomDlg.DoModal() == IDOK) {
   switch(m_dCustomDlg.m_SpinButton.GetPos()) {  
   case 0:
     ・・・・・
     break;
   case 1:
     ・・・・・
     break;
   default:
     ・・・・・
     break;
   }
}


tetuo  2003-10-28 06:23:22  No: 52333

メインダイアログから読みたいデータをカスタムダイアログのpublic変数にする。


phootarou  2003-10-28 08:00:35  No: 52334

早速のお返事ありがとうございます。すでにカスタムダイアログクラスCCustomDlgのpublicメンバ変数としてCSpinButtonCtrl型のm_SpinButtonを作成し実行済みですがエラーが出てしまいます。スピンボタンの位置を取得するGetPos()関数を使用するとエラーが出るような感じなのですが、ほかに原因があるのでしょうか?


tetuo  2003-10-29 06:31:05  No: 52335

いや、もう一段階クッションを置いて
カスタムダイアログが終了する前にスピンボタンの位置などを
自前の変数に入れておくのですよ。

カスタムダイアログがOKで消されたらそこに配置されていた
コントロールは実体を失うのでその後でGetPos関数なんて呼べませんから。


phootarou  2003-10-30 04:40:05  No: 52336

お返事ありがとうございます。何とかエラーは出なくなったのですが、また問題が生じてしまいました。カスタムダイアログ上のスピンボタンの範囲を1〜8、初期値を8に設定しているのですが、そのポジションを得るためにUDN_DELTAPOSメッセージを使用しています。メッセージ関数内でGetPos()によりスピンボタンが押されるたびにポジションを取得しているのですが、ちゃんとしたポジションが取得できません。スピンボタンに連結したエディットボックスの数値が7なのに、得られるポジションが下ボタンを押した場合は7で、上ボタンを押した場合は4になったりします。なぜでしょうか?以下にコードの一部を記載します。よろしくお願いします。

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

  //******************************ここから追加******************************//

  if(m_dSettingDlg.DoModal() == IDOK) {
            switch(m_dSettingDlg.m_CustomSpinPos) {
    case 0:
      break;
    case 1:
      break;
}
  //******************************ここまで追加******************************//

カスタムダイアログクラスのコード
// CSettingDlg メッセージ ハンドラ
BOOL CSettingDlg::OnInitDialog() 
{
  CDialog::OnInitDialog();
  
  // TODO: この位置に初期化の補足処理を追加してください

  //******************************ここから追加******************************//

  m_CustomSpin.SetRange(1,8);
  m_CustomSpin.SetPos(m_CustomSpinPos);
                                  ↑
                                    初期値は8にしています
  //******************************ここまで追加******************************//
  
  return TRUE;  // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります
                // 例外: OCX プロパティ ページの戻り値は FALSE となります
}

void CSettingDlg::OnDeltaposCamPowerSpin(NMHDR* pNMHDR, LRESULT* pResult) 
{
  NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
  // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください

  //******************************ここから追加******************************//

  m_CustomSpinPos = m_CustomSpin.GetPos();

  //******************************ここまで追加******************************//
  
  *pResult = 0;
}


tetuo  2003-10-30 07:32:27  No: 52337

>そのポジションを得るためにUDN_DELTAPOSメッセージを使用しています。

UDN_DELTAPOSは値が変更される前に呼ばれるから
そこで値をいじるとおかしくなりますよ。

CSettingDlg::OnOK()でGetPos()とするか
連結したエディットボックスのEN_CHANGEメッセージを受けてGetPos()すればいいでしょう。


phootarou  2003-10-31 06:37:16  No: 52338

CSettingDlg::OnOK()でGetPos()することでスピンボタンの位置をちゃんと取得することができました。
tetuo様、ありがとうございました。


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

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






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