こんな風にラジオボタンがある時
radioButton1をクリックしたら、そのチェックが消えてほしい。
という上司の要求にこたえるべく以下のように実装
まずラジオボタンがクリックされる直前の状態を記憶するメンバ変数を定義。
bool checkwhendown;
次にマウスダウンとクリックのイベントで呼び出す関数を以下に定義。
void RadioMouseDown(System::Object^ sender,System::Windows::Forms::MouseEventArgs^ e){ if (e->Button == System::Windows::Forms::MouseButtons::Left) { checkwhendown = dynamic_cast<RadioButton^>(sender)->Checked; } } void RadioMouseClick(System::Object^ sender,System::EventArgs^ e){ if (dynamic_cast<System::Windows::Forms::MouseEventArgs^>(e)->Button == System::Windows::Forms::MouseButtons::Left) { if( checkwhendown ) dynamic_cast<RadioButton^>(sender)->Checked = false; } }
各ラジオボタンの各メンバ関数から上記関数を呼び出す
_MouseDownがあったときに現在のラジオボタンの状態を保存。
その後「普通の」ラジオボタンの挙動が走ってしまい、クリックされたラジオボタンにチェックが入ってしまう。
そこでそのあとに飛んでくる_Clickイベントで保存していた状態を調べ、元々trueだったラジオボタンがクリックされていたら、falseをセットする
System::Void radioButton1_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { RadioMouseDown(sender,e); } System::Void radioButton2_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { RadioMouseDown(sender,e); } System::Void radioButton3_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { RadioMouseDown(sender,e); } System::Void radioButton4_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { RadioMouseDown(sender,e); } System::Void radioButton5_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { RadioMouseDown(sender,e); } System::Void radioButton1_Click(System::Object^ sender, System::EventArgs^ e) { RadioMouseClick(sender,e); } System::Void radioButton2_Click(System::Object^ sender, System::EventArgs^ e) { RadioMouseClick(sender,e); } System::Void radioButton3_Click(System::Object^ sender, System::EventArgs^ e) { RadioMouseClick(sender,e); } System::Void radioButton4_Click(System::Object^ sender, System::EventArgs^ e) { RadioMouseClick(sender,e); } System::Void radioButton5_Click(System::Object^ sender, System::EventArgs^ e) { RadioMouseClick(sender,e); }