前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク : SophiaFramework 3.0

4.4. チェックボックス、ラジオボタン

チェックボックス、ラジオボタン、コンボボックスを設置します。

4.4.1. チェックボックスの設置

図のようなチェックボックス、ラジオボタン、コンボボックスを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));
}

4.4.2. チェックボックスの状態取得

チェックボックスの状態を取得します。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)));
    }

    ...

}

実行結果

4.4.3. コンボボックスのハンドラ

コンボボックスには、項目が選択されたときに実行されるハンドラを設定できます。

// 宣言
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)));
    }

    ...

}

コンボボックスでアイテムを選択している様子

4.4.4. 無効化と非表示

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

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);
}