カスタムダイアログ上に配置したスピンボタンやラジオボタンの情報をメインダイアログ上で取得するにはどうしたらよいのでしょうか?以下のコードでは強制終了されてしまいました。プログラムはMFCのダイアログベースで作成しています。よろしくお願いします。
if(m_dCustomDlg.DoModal() == IDOK) {
switch(m_dCustomDlg.m_SpinButton.GetPos()) {
case 0:
・・・・・
break;
case 1:
・・・・・
break;
default:
・・・・・
break;
}
}
メインダイアログから読みたいデータをカスタムダイアログのpublic変数にする。
早速のお返事ありがとうございます。すでにカスタムダイアログクラスCCustomDlgのpublicメンバ変数としてCSpinButtonCtrl型のm_SpinButtonを作成し実行済みですがエラーが出てしまいます。スピンボタンの位置を取得するGetPos()関数を使用するとエラーが出るような感じなのですが、ほかに原因があるのでしょうか?
いや、もう一段階クッションを置いて
カスタムダイアログが終了する前にスピンボタンの位置などを
自前の変数に入れておくのですよ。
カスタムダイアログがOKで消されたらそこに配置されていた
コントロールは実体を失うのでその後でGetPos関数なんて呼べませんから。
お返事ありがとうございます。何とかエラーは出なくなったのですが、また問題が生じてしまいました。カスタムダイアログ上のスピンボタンの範囲を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;
}
>そのポジションを得るためにUDN_DELTAPOSメッセージを使用しています。
UDN_DELTAPOSは値が変更される前に呼ばれるから
そこで値をいじるとおかしくなりますよ。
CSettingDlg::OnOK()でGetPos()とするか
連結したエディットボックスのEN_CHANGEメッセージを受けてGetPos()すればいいでしょう。
CSettingDlg::OnOK()でGetPos()することでスピンボタンの位置をちゃんと取得することができました。
tetuo様、ありがとうございました。
ツイート | ![]() |