![]() ![]() ![]()
|
BREW C++ ライブラリ & GUI フレームワーク : SophiaFramework 3.0 |
チェックボックス、ラジオボタン、コンボボックスを設置します。
図のようなチェックボックス、ラジオボタン、コンボボックスをMyWindow に設置します。前節で作成したコードに以下のコードを加えます。

宣言
SFMTYPEDEFCLASS(MyWindow) class MyWindow : public SFRTitleWindow { SFMSEALCOPY(MyWindow) public: MyWindow(Void) static_throws; virtual ~MyWindow(Void); HANDLER_DECLARE_VOIDRENDER(MyWindow, OnRenderContent) HANDLER_DECLARE_BOOLEVENT(MyWindow, OnKey) HANDLER_DECLARE_VOIDCONTROL(MyWindow, OnButtonControl1) HANDLER_DECLARE_VOIDCONTROL(MyWindow, OnButtonControl2) //*** 太字の部分を追加 private: // チェックボックスはメンバ関数から参照するため、 // ポインタをメンバ変数とします SFRCheckboxControlPtr _checkbox1; SFRCheckboxControlPtr _checkbox2; SFRRadiobuttonControlPtr _radiobutton1; SFRRadiobuttonControlPtr _radiobutton2; SFRComboboxControlPtr _combobox; };
コンストラクタ
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
// 描画ハンドラを登録 (エラー処理は省略)
RegisterHandler(SREVT_RESPONDER_RENDER, SRP16_RENDER_CONTENT,
HANDLER_BEFORE, HANDLER_FUNCTION(OnRenderContent)));
// キー ハンドラを登録
RegisterHandler(SFEVT_KEY, HANDLER_AFTER, HANDLER_FUNCTION(OnKey)));
// ボタンを作成
SFRButtonControlPtr button1 = new SFRButtonControl(
this, SFXRectangle(10, 10, 50, 25), "b1");
SFRButtonControlPtr button2 = new SFRButtonControl(
this, SFXRectangle(10, 45, 50, 25), "b2");
SFRButtonControlPtr button3 = new SFRButtonControl(
this, SFXRectangle(10, 80, 50, 25), "b3");
SFRButtonControlPtr button4 = new SFRButtonControl(
this, SFXRectangle(70, 10, 50, 25), "b4");
SFRButtonControlPtr button5 = new SFRButtonControl(
this, SFXRectangle(70, 45, 50, 25), "b5");
// button1を押したときのハンドラを登録
if (static_try()) {
static_throw(
button1->RegisterHandler(
SREVT_CONTROL, HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl1)));
}
// button2を押したときのハンドラを登録
if (static_try()) {
static_throw(
button2->RegisterHandler(
SREVT_CONTROL, HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl2)));
}
//*** 太字の部分を追加
// チェックボックス
_checkbox1 = new SFRCheckboxControl(
this, SFXRectangle(10, 115, 90, 20), "check1");
_checkbox2 = new SFRCheckboxControl(
this, SFXRectangle(105, 115, 90, 20), "check2");
// ラジオボタン
_radiobutton1 = new SFRRadiobuttonControl(
this, SFXRectangle(10, 140, 90, 20), "radio1");
_radiobutton2 = new SFRRadiobuttonControl(
this, SFXRectangle(105, 140, 90, 20), "radio2");
// ラジオボタンをグループ化(一方を選択すると、他方の選択が外れる)
_radiobutton2->Group(_radiobutton1);
// radiobutton1 を選択状態にする
_radiobutton1->SetStatusCheck(true);
// コンボボックス
SFXWideString item[] = {"item1", "item2", "item3"};
_combobox = new SFRComboboxControl(
this, SFXRectangle(10, 165, 90, 20), item, lengthof(item));
}
チェックボックスの状態を取得します。button3 にハンドラを設定し、このボタンを押すことで状態を取得するようにします。
// 宣言
HANDLER_DECLARE_VOIDCONTROL(MyWindow, OnButtonControl3)
// 定義 HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnButtonControl3, result, control) { if (_checkbox1->GetStatusCheck()) { // checkbox1 がチェックされているか TRACE("checkbox1: checked"); } else { TRACE("checkbox1: unchecked"); } if (_checkbox2->GetStatusCheck()) { TRACE("checkbox2: checked"); } else { TRACE("checkbox2: unchecked"); } if (_radiobutton1->GetStatusCheck()) { // radiobutton1 がチェックされているか TRACE("radiobutton1: checked"); } else { TRACE("radiobutton2: checked"); } TRACE("combobox: %d", _combobox->GetValue()); // combobox が選択しているアイテム }
// 登録(コンストラクタ内) MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(), SFXRectangle(20, 20, 200, 250), "my window") static_throws { ... // button3を押したときのハンドラを登録 if (static_try()) { static_throw( button3->RegisterHandler( SREVT_CONTROL, HANDLER_BEFORE, HANDLER_FUNCTION(OnButtonControl3))); } ... }
実行結果


コンボボックスには、項目が選択されたときに実行されるハンドラを設定できます。
// 宣言
HANDLER_DECLARE_VOIDCONTROL(MyWindow, OnComboboxControl)
// 定義 // Combobox の項目が選択されたときにこのハンドラが起動 HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnComboboxControl, result, control) { if (result == SRP16_ESCAPE) { // 項目が選択されずにキャンセルされたら // 何もしない } else { // result には選択した項目番号が入っている // control にはコンボボックスのポインタが入っている // GetTitle で選択項目の文字列を取得 SFXAnsiString string(static_cast<SFRComboboxControlPtr>(control)->GetTitle(result)); // デバッグ画面に文字列表示 // string.GetCString() はC言語文字列を取得 // (TRACE の引数はC言語文字列) TRACE("'%d: %s' is selected.", result, string.GetCString()); } }
// 登録(コンストラクタ内) MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(), SFXRectangle(20, 20, 200, 250), "my window") static_throws { ... // Combobox の項目が選択されたときのハンドラを登録 if (static_try()) { static_throw( _combobox->RegisterHandler( SREVT_CONTROL, HANDLER_BEFORE, HANDLER_FUNCTION(OnComboboxControl))); } ... }
コンボボックスでアイテムを選択している様子

コントロールは、選択できないように無効化したり、非表示にしたりできます。

button4 にハンドラを設定します。
// ボタン4 のハンドラの定義(宣言、登録は省略) HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnButtonControl4, result, control) { // チェックボックス2を無効化 _checkbox2->SetStatusEnable(false); // ラジオボタン1を無効化 _radiobutton1->SetStatusEnable(false); // ラジオボタン2を非表示 _radiobutton2->SetStatusVisible(false); }
ウィンドウ全体を無効化することもできます。下の図は無効化した状態です。

// ボタン4 のハンドラの定義(宣言、登録は省略) HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnButtonControl4, result, control) { // チェックボックス2を無効化 _checkbox2->SetStatusEnable(false); // ラジオボタン1を無効化 _radiobutton1->SetStatusEnable(false); // ラジオボタン2を非表示 _radiobutton2->SetStatusVisible(false); // ↓以下を追加 this->SetStatusEnable(false); }
|
Copyright (C) 2002 - 2009 Sophia Cradle, Inc. All Rights Reserved. |
![]() ![]() ![]()
|