ラジオボタンの動的切り替えをするには?

解決


ほんちゃん  2005-10-27 23:43:12  No: 59372

次の機能を組み込みたいのですが、うまくいきません。
VC.NET2003, MFC, SDI, FormView です。
1.ラジオボタン2個(「左」と「右」。1グループ。デフォルトは「左」)を設けます。
2.「右」をクリックしたとき、「切り替えますか?」というYES/NOダイアログを出し、「いいえ」であれば「左」ボタンに戻る。

次のコードにすると、見掛けは「左」ボタンに戻りますが、ウィンドウを最小化してまた最大化すると、「右」ボタンをクリックした動作をします。

CMyFormViewView::OnBnClickedRadioMigi()
{
    if (AfxMessageBox(_T("切り替えますか?"), MB_YESNO) == IDNO)
        {
            m_nSayu = 0;
            Updatedata(FALSE);
            return;
        }
    他の処理・・・
}

つまり、これだけでは「いいえ」を押しても「右」ボタンをクリックした履歴が生きていて、最小化→最大化によって「右」ボタンの動作を行うように思えます。
正しい方法を、教えてください。お願いします。


助っ人  2005-10-28 21:36:56  No: 59373

ちょっと説明が足らないかと。
このイベントの戻り値はvoidでよろしいのでしょうか?
m_nSayuってなんのことですか?

私流のやり方では、右・左のラジオボタンをコントロール変数として
宣言し、 m_left...左ラジオ  m_right...右ラジオ

void …OnBnClickedRadioHidari()
{
   m_left.SetCheck( 1 );
   m_right.SetCheck( 0 );
}

void …OnBnClickedRadioMigi()
{
    if( AfxMessageBox(_T("***"), MB_YESNO )==IDNO ){
         m_left.SetCheck( 0 );
         m_right.SetCheck( 1 );
    } else {
         m_left.SetCheck( 1 );
         m_right.SetCheck( 0 );
         他の処理??
    }
    他の処理??
}

かなり、無駄なものもありますが、動くと思いますが(~ ~;)


ほんちゃん  2005-10-29 01:48:30  No: 59374

コメント、有り難うございました。
ご教示の通りのコードでやってみました。
「右」をクリック→「いいえ」で見掛けは「左」に戻りますが、その直後に最小化して元のサイズに戻すと、YES/NOダイアログが再び出ます。(つまり「右」をクリックしたような動作をします。)

なお、m_nSayu は、「左」と「右」のラジオボタングループに割り当てた値です。(左が 0、右が 1 です。)


愚暗  2005-10-30 01:30:57  No: 59375

> 「右」をクリック→「いいえ」で見掛けは「左」に戻りますが、
> その直後に最小化して元のサイズに戻すと、YES/NOダイアログが再び出ます。
> (つまり「右」をクリックしたような動作をします。)
(改行変更しました)

実験してみました。
確かにメッセージボックスが繰り返し出ますね。
他に、方向キーで操作した場合も同様の動作でした。
フォーカスが当たっているだけで BN_CLICKED を発生させるなんて、
ラジオボタンって変な仕様なんですね。

更に試したところ、選択を切り替えたのかどうかを確認して、
本当に選択を切り替えたときだけメッセージボックスを出すようにすれば
回避できそうです。

CMyFormViewView::OnBnClickedRadioHidari()
{ UpdateData(TRUE); }

CMyFormViewView::OnBnClickedRadioMigi()
{
    // 選択が変更されていないなら何もしない。
    int nOld = m_nSayu;
    UpdateData(TRUE);
    if (nOld == m_nSayu)
        return;

    if (AfxMessageBox(_T("切り替えますか?"), MB_YESNO) == IDNO)
    {
        m_nSayu = nOld;
        Updatedata(FALSE);
        return;
    }
    // 他の処理・・・
}


ほんちゃん  2005-10-30 04:49:00  No: 59376

愚暗さま、有り難うございました。
解決です。
BN_CLICKED が発生しても、ラジオボタングループの値(m_nSayu)は変化しないんですね。
もう一歩踏み込んで考えなければなりませんでした。
さすが先輩!  助かりました。


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

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






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