RadioButtonの使い方
今回のコントロールはラジオボタンです。このボタンは、複数の選択肢から1つを選択するときに使用します。お分かりの通り、ラジオボタンもCButtonクラスの一員なんですが、今回はラジオボタンをCButtonクラスの物とみなして操作していく方法と、どれ(何番のラジオボタン)を選択したかを返すだけの整数型のコントロールとして操作するかの2通りの方法で行います。

1. ダイアログリソースの編集から始めましょう
当然のことながら新規作成です。とりあえずダイアログベースで説明していきましょう。
1.プロジェクトでMFC AppWizard(exe)を選択し、プロジェクト名は、DlgRadioとしておく
2.「作成するアプリケーションの種類」はダイアログベースを選択
3.終了

それではまずリソースの変更からです。 ダイアログを編集します。
1.ワークスペースのリソースタブをクリック
2.DlgRadioリソースのDialogフォルダをダブルクリック
3.IDD_DLGRADIO_DIALOGを開く
4.以下の図のように編集する。
OKボタンは残しておいて、キャンセルボタンと”Todo:ダイアログのコントロールをここに配置”というスタティックは消す。RadioButtonとEditボックスを下の図のように配置します。
ID:IDC_RADIO1  キャプション:RadioButton1
ID:IDC_RADIO2  キャプション:RadioButton2
ID:IDC_RADIO3  キャプション:RadioButton3
ID:IDC_EDIT_STATE  
※エディットボックスは読み取り専用にしておくと便利です。(コントロールを右クリックしてプロパティを開けば分かります)
5.ビルド--実行を行う
実行結果も図にしておきました。まだラジオボタンを押しても何にもなりません。ここまでがリソース編集です。

2.ラジオボタンを動かそう
まずは、プログラム開始時に適当なラジオボタンを選択状態にしておく必要があります。といっても簡単な関数があるので便利です。先ほどラジオボタンをCButtonクラスのように振る舞えるようにしたのは、CButtonクラスに有る簡単な関数を使用したいからだったと行っても過言ではありません。さてさて、プログラムの開始時つまりダイアログが作られるっときにラジオボタンの1つを選択状態にしたいわけなんですけど、どこにコードを記述しておけばいいのでしょうか???となやむところですが、この場合は、OnInitDialog関数内に書込むのがベストです。さっそく次のコードを書込んでみましょう。
OnInitDialog関数内(DlgRadioDlg.cpp)
// TODO: 特別な初期化を行う時はこの場所に追加してください。
CButton* pBtn = (CButton*)GetDlgItem(IDC_RADIO1);
pBtn->SetCheck(1);

CEdit* pEdt = (CEdit*)GetDlgItem(IDC_EDIT_STATE);
pEdt->SetWindowText("1");
そして実行するとあら不思議!始めからRadioButton1が選択されています。上のコードの解説を簡単にしておきますね。
CButton* pBtn = (CButton*)GetDlgItem(IDC_RADIO1);
IDC_RADIO1というボタンコントロールにアクセスする変数(ポインタ)を設定します。変数名はpBtnとしておきます。
pBtn->SetCheck(1);
つまりpBtnはIDC_RADIO1を指しています。IDC_RADIO1にCheckを付けます(選択状態にします)。
CEdit* pEdt = (CEdit*)GetDlgItem(IDC_EDIT_STATE);
IDC_EDIT_STATEというエディットボックスにアクセスする変数(ポインタ)を設定します。変数名はpEdtとしておきます。
pEdt->SetWindowText("1");
つまりpEdtはIDC_EDIT_STATEを指しています。IDC_EDIT_STATEのボックスに文字列「1」を表示します。
なんとなくどんなソフトを作ろうとしているか分かってきましたか?どの(何番の)ラジオボタンを押しているかどうかEdiボックスに出力しているわけです。ということは、ユーザが各ラジオボタンをクリックして選択したとき、Editボックスに状態を反映する必要性があります。簡単に言ってしまうと、ボタンを押したときに関数を駆動させればいいのです。例えばRadioButton2を押したときに動く関数をOnRadioButton2とすると、この関数には、Editボックスに"2"を表示するコードを書いてしまえばいいのです。では実際に行ってみましょう。

それではClassWizardを使って、3つの関数を作成します。
IDC_RADIO1に対してメッセージBN_CLICKEDを選択し、関数の追加
このとき、関数名はなんでもいいんですけど、OnRadio1Clickでいいと思います。
同様にIDC_RADIO2、IDC_RADIO3に対しても同じことを行う。
OnRadio2ClickとOnRadio3Clickという関数名で作っておけば無難でしょう。
以下のコードを記述してみます。
DlgRadioDlg.cpp内
void CDlgRadioDlg::OnRadio1Click() 
{
	CEdit* pEdt = (CEdit*)GetDlgItem(IDC_EDIT_STATE);
	pEdt->SetWindowText("1");
}

void CDlgRadioDlg::OnRadio2Click() 
{
	CEdit* pEdt = (CEdit*)GetDlgItem(IDC_EDIT_STATE);
	pEdt->SetWindowText("2");
}



void CDlgRadioDlg::OnRadio3Click() 
{
	CEdit* pEdt = (CEdit*)GetDlgItem(IDC_EDIT_STATE);
	pEdt->SetWindowText("3");
}

実行してみると分かりますが、RadioButtonを選択するとEditBoxにその結果が反映されていることが分かります。コードを見るとすぐ分かりますが、超原始的なことをしているのに過ぎないのですね。どれかのRadioButtonを選択したらEditBoxのポインタを取得しアクセスできるようにして、SetWindowText関数でEditBoxに番号を表示しているだけです。
しかし・・・これでは通常のButtonを配置しても同じ動作ができるんじゃないの?と感じますね。まさにその通り。RadioButtonは単に使用するだけでは通常のボタンと変わりません。次はもっとRadioButtonチック?にしようと思います。

3.ラジオボタンを本格的に使用してみよう
とりあえず前に書いたコードが邪魔なので消してしまいます。具体的に言えば、RadioButtonを押したときに動作させた3つの関数を削除したいのですが、Ver6.0からは関数の削除が簡単になっているんですが、私はVer5,0なので少し面倒です。ではVer5.0のパターンでやってしまいましょう。
1.ClassWizardを開きます。
2.一番下に「メンバ関数」という欄があるはずですので、そちらに目をむけます。
3.先ほど作った関数OnRadio1Clickを探して、ハイライト(選択状態)にします
すると「関数の削除」ボタンが押せるようになるはずです。
4.関数の削除ボタンを押します。
インプリメントを手動で〜なんてメッセージが出てしまった場合も「はい」を押します。
5.全く同様にして残りの2つの関数を削除します。
この方法で削除した物は、先ほど書いた関数のコードじゃなくて、アプリケーション中でのメッセージの結び付けを削除しただけです。当然さっき書いた3つの関数ですが、あの部分は残っている(Ver6.0以降だとコメント分にされてしまうかもしれませんね)ので関数ごと消して下さい。
6.ビルド-実行します。
これでRadioButtonをおしてもEditBoxに何も反映されない状態まで戻りますね。

っと気を抜いては行けません。OnInitDialogにコードを記述しているのでしたね。あの部分もバサっと削除して置きます。

さて、気を取り直してリソースの編集を行います。ここからがRadioButtonを使うためのコツなんで要チェックです。
ここでグループボックスを使用します。今まで使用したことのある人はお分かりですが、見た目がよくなるようにこのグループボックスがあるんでしたよね。今回は、3つのRadioButtonをグループボックスで囲みます。
とりあえずは下の図のようにリソースを編集してみましょう。ID等も下のようにお願いします。

「チェックボタン」
ID:IDC_BTN_CHECK  キャプション:Check
「グループボックス」
ID:IDC_STATIC  キャプション:グループ
3つのRadioButtonはさっきのままで結構です。(調子に乗って削除してしまったら一番始めに戻って作り直して下さい)
実行してみましょう。あれれ・・・RadioButtonって始めは1つ選択されていなければいけないのに選択されてないや・・・と思いますが、それはあとでやるので今は気にしちゃだめです。ここで重要なことを1つしますので絶対に忘れないでくださいね。今から行うのは、3つのRadioButtonを一括操作するために必須の作業です。グループボックスでRadioButtonを囲んだ理由がこの作業を通して始めて意味のあるものになるんですが、それは以下の作業を行ってから解説することにします。
1.リソースの編集画面で、3つのRadioButtonの1番上のやつ(IDC_RADIO1)を右クリック
2.一般のタブをクリック
一般タブの中身はコントロールの表示・非表示を決める大事な場所です。スタイルタブと共によく使います。
3.グループをチェック
この作業がきちんとできたかどうかは実は簡単に調べることができます。ClassWizardを開きメンバ変数タブをクリックしてコントロールIDの中を見てみましょう。RadioButtonコントロールは3つあるはずに、IDC_RADIO1しか表示されていない場合、さきほどの作業は成功です。つまりこの作業を通して、3つのコントロールが、操作上1つに統合されているというわけです。
ついでにこのIDC_RADIO1に関してメンバ変数を設定します。変数の追加ボタンを押すとダイアログが開くため、以下の設定を施します。
メンバ変数名-->m_nRadio
カテゴリ-->値
「値」に設定しておくと、下の方に"ラジオボタングループ型転送"と出るはずですが、今回はこの機能を使うのです。
変数のタイプ-->int
まぁ、intしか選べないんですけどね(笑)、これはカテゴリを「値」にしているからです。
このメンバ変数の設定はアツイです。なぜなら、m_nRadio=0のとき一番上のボタンが選択状態になります。そしてm_nRadio=1のときに2番目のボタンが選択状態に・・・と上から番号で整理されるのです。つまり、m_nRadioの値を調べれば、どのボタンが選択されいたのかが一目瞭然となるわけです。言い換えれば、m_nRadioの値を変更すれば、どのRadioButtonも選択状態に設定できるのでアツイのです。
まず手はじめに、IDC_RADIO1(一番上のボタン)を選択状態にします。さきほども言いましたが、この作業はダイアログが表示される瞬間でいいわけですから、OnInitDialogで実行すべきですね。
OnInitDialog内で
// TODO: 特別な初期化を行う時はこの場所に追加してください。
m_nRadio = 0;//IDC_RADIO1を選択状態
UpdateData(false);
コードの最後にあるUpdateDataは、Dialogのコーナーでも紹介した便利関数です。m_nRadioなどのメンバ変数に値を代入するだけでは、ダイアログに反映されません。そのためにはメンバ変数の状況をダイアログに反映したり、もしくはダイアログの状況をメンバ変数に反映する関数が必要になります。このUpdateDataは引数によって、以下の動作をします。
false
メンバ変数に設定したことをダイアログに反映させます
true
ダイアログの状況をメンバ変数に書き込みます。
だから今回はメンバ変数→ダイアログですから、引数はfalseになるわけですね。さて、一旦実行してみましょう。一番上のRadioButtonが選択されていればOKです。

最後にRadioButtonの状況を読み取ってレスポンスを返すようにしてこのコーナーを終了しましょう。
1.ClassWizaedを開き、メッセージマップタブをクリック
2.以下の項目を選択する
クラス-->DlgRadio
オブジェクトID-->IDC_BTN_CHECK
メッセージ-->BN_CLICKED
3.関数の追加ボタンを押し、コードの編集ボタンを押す
関数名はディフォルトのOnBtnCheckで結構です。以下OnBtnCheckという関数名で進めていきます。
4.以下のコードを記述する
OnBtnCheck関数
void CDlgRadioDlg::OnBtnCheck() 
{
	UpdateData(true);
	switch(m_nRadio){
	case 0:
		AfxMessageBox("RadioButton1が選択されています");break;
	case 1:
		AfxMessageBox("RadioButton2が選択されています");break;
	case 2:
		AfxMessageBox("RadioButton3が選択されています");break;
	default:break;
	}
}

まずダイアログの選択状況をメンバ変数に書込む操作が必要ですが、これはUpdateData関数で引数をtrueにしてあげればいいですね。上記のコードはswitch-case文で行っています。分からない人はC/C++の参考書を読んで下さい。条件分岐の基本ですから。
実行してみれば分かりますが、適当にRadioButtonを選択して「チェック」ボタンを押すと、どのRadioButtonを選択しているのか表示しますよ。

Back to Index