第13回 壊れかけのRadio

今回はラジオボタンです。
ラジオボタンとは基本的にチェックボックスと同じですが、
複数のボタンから一つしかチェックされた状態に出来ないものです。
今回はかなりシンプルなコードになったので、解説個所も多くないです。


今回のサンプルです。

// sample11.cpp

#include <Application.h>        // BApplicationを使うために必要
#include <Window.h>             // BWindowを使うために必要
#include <View.h>               // BViewを使うために必要
#include <Alert.h>			  // BAlertを使うために必要
#include <Button.h>             // BButtonを使うために必要
#include <RadioButton.h>		 // BRadioButtonを使うために必要
#include <Box.h>			 // BBoxを使うために必要

// クラスの前方宣言
class MyApp;
class MyWindow;
class MyView;

// メッセージ定数
const uint32 BUTTON_CLICKED = 'bucl';
const uint32 RADIO1_CLICKED = 'rcl1';
const uint32 RADIO2_CLICKED = 'rcl2';
const uint32 RADIO3_CLICKED = 'rcl3';

class MyApp : public BApplication
{
public:
	MyApp();
private:
	MyWindow* m_win;
};

class MyWindow : public BWindow
{
public:
	MyWindow(BRect frame,const char* title,window_type type,uint32 flags);
	virtual bool QuitRequested();	// 終了が要求されたときに呼ばれる関数
private:
	MyView* m_view;
};
 
class MyView : public BView
{
public:
	MyView(BRect frame,const char *name,uint32 resizingMode,uint32 flags);
	~MyView();
	virtual void AttachedToWindow();	// ビューがウィンドウに取り付けられたとき(子供として登録された後)呼ばれる関数
	virtual void MessageReceived(BMessage* message);
private:
	BBox* m_box;				// ラジオボタンをまとめるBBox
	BRadioButton* m_radiobutton1; // ラジオボタン1
	BRadioButton* m_radiobutton2; // ラジオボタン2
	BRadioButton* m_radiobutton3; // ラジオボタン3
	BButton*      m_button;		//  ボタン
};

MyApp::MyApp()
      :BApplication("application/x-vnd.big56-MyApp")
{
	m_win = new MyWindow(BRect(100,100,250,270),"ラジオボタン",B_TITLED_WINDOW,B_ASYNCHRONOUS_CONTROLS);
	m_win->Show();
}

MyWindow::MyWindow(BRect frame,const char* title,window_type type,uint32 flags)
		:BWindow(frame,title,type,flags)
{
	frame.OffsetTo(0,0);  // 与えられたBRectの左上が(0,0)になるようにする

	m_view = new MyView(frame,"theView",B_FOLLOW_ALL_SIDES,B_WILL_DRAW);
	AddChild(m_view);	
}

bool MyWindow::QuitRequested()
{
// アプリケーションを終了する
	be_app->Quit();
	return true;
}

MyView::MyView(BRect frame,const char* title,uint32 resizingMode,uint32 flags)
	  :BView(frame,title,resizingMode,flags)
{
	m_box = new BBox(BRect(10,10,140,120));
	m_box->SetLabel("ラジオボタン一覧");

	m_radiobutton1 = new BRadioButton(BRect(10,20,120,40),"theRadioButton1",
								"ラジオボタン1",new BMessage(RADIO1_CLICKED));
	m_radiobutton2 = new BRadioButton(BRect(10,50,120,70),"theRadioButton2",
								"ラジオボタン2",new BMessage(RADIO2_CLICKED));
	m_radiobutton3 = new BRadioButton(BRect(10,80,120,100),"theRadioButton3",
								"ラジオボタン3",new BMessage(RADIO3_CLICKED));
	
	m_button = new BButton(BRect(90,140,140,160),"theButton",
						"判定",new BMessage(BUTTON_CLICKED));

	m_radiobutton1->SetValue(B_CONTROL_ON); // ラジオボタン1をデフォルトに

	AddChild(m_box);
	m_box->AddChild(m_radiobutton1); // ラジオボタンはボックスの子として登録する
	m_box->AddChild(m_radiobutton2);
	m_box->AddChild(m_radiobutton3);

	AddChild(m_button);

	SetViewColor(200,200,200); // 背景の色の変更

}

MyView::~MyView()
{
}

// ラジオボタンとボタンのターゲット変更
void MyView::AttachedToWindow()
{
	m_radiobutton1->SetTarget(this);
	m_radiobutton2->SetTarget(this);
	m_radiobutton3->SetTarget(this);
	m_button->SetTarget(this);
}

// メッセージ処理
void MyView::MessageReceived(BMessage* message)
{
	switch(message->what)
	{
	case RADIO1_CLICKED:  // ラジオボタン1が押されたとき
		(new BAlert("Test","ラジオボタン1が押されました","OK"))->Go();
		break;
	case RADIO2_CLICKED:  // ラジオボタン2が押されたとき
		(new BAlert("Test","ラジオボタン2が押されました","OK"))->Go();
		break;
	case RADIO3_CLICKED:  // ラジオボタン3が押されたとき
		(new BAlert("Test","ラジオボタン3が押されました","OK"))->Go();
		break;
	case BUTTON_CLICKED:  // ボタンが押されたとき
		if(m_radiobutton1->Value() == B_CONTROL_ON)
		{
			(new BAlert("Test","押されているのはラジオボタン1","OK"))->Go();
		}
		else	if(m_radiobutton2->Value() == B_CONTROL_ON)
		{
			(new BAlert("Test","押されているのはラジオボタン2","OK"))->Go();
		}
		else	if(m_radiobutton3->Value() == B_CONTROL_ON)
		{
			(new BAlert("Test","押されているのはラジオボタン3","OK"))->Go();
		}
		break;
	default: 
		BView::MessageReceived(message);
		break;
	}
}

int main(int argc,char** argv)
{
 	MyApp app;
	app.Run();
	return 0;
}

実行結果は次のようになります。
実行結果初期画面
今回はラジオボタン3つとボタンがあるだけです。
例えば、「ラジオボタン1」とかかれてあるラジオボタンをクリックすると
アラートその1
と表示され、「判定」ボタンを押すと、
アラートその2
といったように、現在どのボタンが押されているかが表示されます。


今回出てくる新しいクラスは、BBoxとBRadioButtonですが、
BBoxはBRadioButtonのとりまとめ役として機能し、どのラジオボタンを押しても
確実にそのラジオボタンだけがチェックされるようにします。
BRadioButtonはBButtonと使い方の上で変わるところはなんらありません。
ただ、BRadioButtonはBBoxの子供として登録されている所に違いがあります。

まず、最初にMyViewのコンストラクタを見てみましょう。

m_box = new BBox(BRect(10,10,140,120));
	m_box->SetLabel("ラジオボタン一覧");

	m_radiobutton1 = new BRadioButton(BRect(10,20,120,40),"theRadioButton1",
								"ラジオボタン1",new BMessage(RADIO1_CLICKED));
	m_radiobutton2 = new BRadioButton(BRect(10,50,120,70),"theRadioButton2",
								"ラジオボタン2",new BMessage(RADIO2_CLICKED));
	m_radiobutton3 = new BRadioButton(BRect(10,80,120,100),"theRadioButton3",
								"ラジオボタン3",new BMessage(RADIO3_CLICKED));
	
	m_button = new BButton(BRect(90,140,140,160),"theButton",
						"判定",new BMessage(BUTTON_CLICKED));

	m_radiobutton1->SetValue(B_CONTROL_ON); // ラジオボタン1をデフォルトに

	AddChild(m_box);
	m_box->AddChild(m_radiobutton1); // ラジオボタンはボックスの子として登録する
	m_box->AddChild(m_radiobutton2);
	m_box->AddChild(m_radiobutton3);

	AddChild(m_button);

	SetViewColor(200,200,200); // 背景の色の変更

まず、最初にBBoxを構築しています。
視覚的には、BBoxはラジオボタンの周りにある枠線を表示する役目を持っています。
BBoxのコンストラクタは次の様になっています。

BBox(BRect bounds,
	const char *name = NULL,
	uint32 resizeFlags = B_FOLLOW_LEFT | B_FOLLOW_TOP,
	uint32 flags = B_WILL_DRAW | B_FRAME_EVENTS |
			B_NAVIGABLE_JUMP,
	border_style border = B_FANCY_BORDER);

コンストラクタで指定するものは、

border以外は、第3回を見ていただくとして、
線の種類は次の3つを指定することが出来ます。

定数画像
B_FANCY_BORDERB_FANCY_BORDERの画像
B_PLAIN_BORDERB_PLAIN_BORDERの画像
B_NO_BORDERB_NO_BORDERの画像

これらは、コンストラクタで指定する以外にも、SetBorder()関数で指定出来たりもします。
なお現在の線の種類を取得するにはBorder()関数で取得が可能です。

次に、SetLabel()関数で、BBoxの表題とも言うべき文字列を設定しています。

m_box->SetLabel("ラジオボタン一覧");

コンストラクタのnameはあくまでビューの名前であり、表示される文字列ではないことに注意してください。

次にBRadioButtonの構築です。

m_radiobutton1 = new BRadioButton(BRect(10,20,120,40),"theRadioButton1",
		"ラジオボタン1",new BMessage(RADIO1_CLICKED));
m_radiobutton2 = new BRadioButton(BRect(10,50,120,70),"theRadioButton2",
		"ラジオボタン2",new BMessage(RADIO2_CLICKED));
m_radiobutton3 = new BRadioButton(BRect(10,80,120,100),"theRadioButton3",
		"ラジオボタン3",new BMessage(RADIO3_CLICKED));

BRadioButtonのコンストラクタは次の様になっています。

BRadioButton(BRect frame,
	const char *name,
	const char *label,
	BMessage *message,
	uint32 resizeMode = B_FOLLOW_LEFT | B_FOLLOW_TOP,
	uint32 flags = B_WILL_DRAW | B_NAVIGABLE); 

指定するものは、

これは、第6回で説明したBButtonのコンストラクタと全く同じです。
解説は省略させていただきます。ご了承ください。

そして、ラジオボタン1をデフォルトにしています。

m_radiobutton1->SetValue(B_CONTROL_ON); // ラジオボタン1をデフォルトに

これで、ラジオボタン1がチェックされた状態になります。
ちなみに、同じグループに属する別のラジオボタンにSetValue(B_CONTROL_ON)を呼び出しても、
両方ともチェックされることに注意してください。
アプリケーションを使っている側が、ラジオボタンをクリックしたら、一つだけがチェックされますが、
プログラム的に、ラジオボタンをチェックしても一つだけのチェックにはなりません。

そして、各種コントロールをビューの子供として登録するわけですが、
先程言ったようにBBoxはBRadioButtonを取りまとめる役目を果たしています。
そのため、BRadioButtonはBBoxの子供として登録する必要があります。

AddChild(m_box);
m_box->AddChild(m_radiobutton1); // ラジオボタンはボックスの子として登録する
m_box->AddChild(m_radiobutton2);
m_box->AddChild(m_radiobutton3);

さて、これでコントロールの配置はすべて終わったのですが、実際の処理部分が残っています。
MyView::MessageReceived()関数にそれは凝縮されているわけですが、ラジオボタンが押されたときの処理は
単純にBAlertを使ったものなので、第2回かまたは第11回を参考にしてください。

「判定」ボタンを押したときの処理については少々捕捉します。

case BUTTON_CLICKED:  // ボタンが押されたとき
	if(m_radiobutton1->Value() == B_CONTROL_ON)
	{
		(new BAlert("Test","押されているのはラジオボタン1","OK"))->Go();
	}
	else	if(m_radiobutton2->Value() == B_CONTROL_ON)
	{
		(new BAlert("Test","押されているのはラジオボタン2","OK"))->Go();
	}
	else	if(m_radiobutton3->Value() == B_CONTROL_ON)
	{
		(new BAlert("Test","押されているのはラジオボタン3","OK"))->Go();
	}
	break;

このコードではそれぞれのラジオボタンの値を調べて、対応するラジオボタンがチェックされていたら、
「押されているのはラジオボタン?」と表示するようにしています。
BRadioButtonというのは、結局一つ一つが独立したボタンなので、
一つ一つ値を調べる必要があります。


BRadioButtonの解説をしてきたわけですが、当然BRadioButtonはBBoxとセットで使う必要はなく、
直接BViewの子供として登録しても大丈夫です。
しかし、一つのビュー内に複数のグループのBRadioButtonを作りたい場合BBoxが便利です。

[<<前へ] [次へ>>] [戻る]

big56 big56@anet.ne.jp
そろそろ結婚適齢期??? 生命保険の切り替えはココ あなたの悩み解決します
[PR] | ヒーリング会社案内 作成se 転職川口栃木荻窪池袋中国SEO対策消費者金融車 買取テンプレート沖縄旅行免許合宿二輪引越しプレゼントゴルフ会員権留学レーシックマッサージFXアフィリエイトFXホームページ制作デイトレードハワイ旅行タイバンコクハワイ レンタカーベスト ハワイ ホテル レーツバリ島Hawaii hotelsHawaii Activitiesbhhrハワイホテルテキスト広告
【運営会社「パラダイムシフト」サービス】 ハワイ現地オプショナルツアーリラックマ) - ビジネスクラス航空券 - 格安航空券(1) - 格安航空券(2) - 海外ホテル - 韓国旅行 - タイムシェア - ホテル 予約
無料ホームページ - 携帯ホームページ - 無料ホームページ作成 - レンタルサーバー - ブログ - ヴィラ - ハワイ コンドミニアム - バリ島 ホテル - プーケット ホテル - 旅行 口コミ - 旅行情報 - 国際電話 - ホノルルマラソン - 掲示板監視 - 風評被害 - ホテル比較 - ノースウェスト航空 - ファイナルチェッカー