次の機能を組み込みたいのですが、うまくいきません。
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;
}
他の処理・・・
}
つまり、これだけでは「いいえ」を押しても「右」ボタンをクリックした履歴が生きていて、最小化→最大化によって「右」ボタンの動作を行うように思えます。
正しい方法を、教えてください。お願いします。
ちょっと説明が足らないかと。
このイベントの戻り値は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 );
他の処理??
}
他の処理??
}
かなり、無駄なものもありますが、動くと思いますが(~ ~;)
コメント、有り難うございました。
ご教示の通りのコードでやってみました。
「右」をクリック→「いいえ」で見掛けは「左」に戻りますが、その直後に最小化して元のサイズに戻すと、YES/NOダイアログが再び出ます。(つまり「右」をクリックしたような動作をします。)
なお、m_nSayu は、「左」と「右」のラジオボタングループに割り当てた値です。(左が 0、右が 1 です。)
> 「右」をクリック→「いいえ」で見掛けは「左」に戻りますが、
> その直後に最小化して元のサイズに戻すと、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;
}
// 他の処理・・・
}
愚暗さま、有り難うございました。
解決です。
BN_CLICKED が発生しても、ラジオボタングループの値(m_nSayu)は変化しないんですね。
もう一歩踏み込んで考えなければなりませんでした。
さすが先輩! 助かりました。
ツイート | ![]() |