前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework 4.1

3.3. コントロール

3.3.1. ボタン

図のようにボタンを配置するコードを追加します。

図 3.4. ボタン

ボタン

例 3.13. ボタンの作成

MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
    SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
    // 描画ハンドラの登録
    if (static_try()) {
        static_throw(
            RegisterHandler(SREVT_RESPONDER_RENDER, 
                            SRP16_RENDER_CONTENT,
                            HANDLER_BEFORE, 
                            HANDLER_FUNCTION(OnRenderContent)));
    }
 
    // キー ハンドラの登録
    if (static_try()) {
        static_throw(
            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");

    return;
}
[Note] 注意

SophiaFramework では、ポインター型は Ptr で表します。SFRButtonControlPtr は SFRButtonControl* と同じ意味です。

セレクトキーでボタンを押します。

キー ハンドラにフォーカス移動のコードを追加します。

例 3.14. キー ハンドラの実装

HANDLER_IMPLEMENT_BOOLEVENT(MyWindow, OnKey, event)
{

    // キー イベントの処理
    switch (event.GetP16()) {
        case AVK_CLR: // クリアー キーが押されたとき

            // ウィンドウを破棄する
            return Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE, 
                                   SRP16_TERMINATE_INVOKE, 
                                   true));

        case AVK_1: // 1 キーが押されたとき

            // デバッグ文字列をシミュレータのデバッグ用画面に表示する
            TRACE("1-key");
            return true;

        // *** 太字が追加部分

        // フォーカスを移動する
        case AVK_UP:
            FocusUp();
            return true;
        case AVK_LEFT:
            FocusLeft();
            return true;
        case AVK_DOWN:
            FocusDown();
            return true;
        case AVK_RIGHT:
            FocusRight();
            return true;
    }
    return false;
}

方向キーを押すことでフォーカスの移動が確認できます。

3.3.2. ボタン ハンドラの登録

ボタンが押されたときに実行するコードを追加します。

例 3.15. ボタン ハンドラの宣言

SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void) static_throws;
    virtual ~MyWindow(Void);

private:
    HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
    HANDLER_DECLARE_BOOLEVENT(OnKey)
    
    // *** 太字が追加部分
   
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl1)
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl2)
};

例 3.16. ボタン ハンドラの実装

// ボタン OnButtonControl1 のハンドラの定義
HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnButtonControl1, result, control) {
    TRACE("Hello Button"); // デバッグ画面に "Hello Button" を表示する
}

// ボタン OnButtonControl2 のハンドラの定義
HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnButtonControl2, result, control) {
    // ウィンドウを閉じる
    Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE,
                    SRP16_TERMINATE_INVOKE,
                    true));
}

例 3.17. ボタン ハンドラの登録

MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
    SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
    // 描画ハンドラの登録
    if (static_try()) {
        static_throw(
            RegisterHandler(SREVT_RESPONDER_RENDER, 
                            SRP16_RENDER_CONTENT,
                            HANDLER_BEFORE, 
                            HANDLER_FUNCTION(OnRenderContent)));
    }
 
    // キー ハンドラの登録
    if (static_try()) {
        static_throw(
            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)));
    }
}

図 3.5. 実行結果

実行結果

図 3.6. ボタン button1 を押した後のデバッグ画面 ( "Hello Button" と表示されます )

ボタン button1 を押した後のデバッグ画面 ( "Hello Button" と表示されます )

3.3.3. チェック ボックス

図のようにチェック ボックスを配置するコードを追加します。

図 3.7. チェック ボックス

チェック ボックス

例 3.18. チェック ボックスの定義

SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void) static_throws;
    virtual ~MyWindow(Void);
    
// *** 太字が追加部分

private:
    // ポインター型のメンバ変数として定義する 
    SFRCheckboxControlPtr _checkbox1;
    SFRCheckboxControlPtr _checkbox2;
    
    HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
    HANDLER_DECLARE_BOOLEVENT(OnKey)
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl1)
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl2)
};

例 3.19. チェック ボックスの作成

MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
    SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
    // 描画ハンドラの登録
    if (static_try()) {
        static_throw(
            RegisterHandler(SREVT_RESPONDER_RENDER, 
                            SRP16_RENDER_CONTENT,
                            HANDLER_BEFORE, 
                            HANDLER_FUNCTION(OnRenderContent)));
    }
 
    // キー ハンドラの登録
    if (static_try()) {
        static_throw(
            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");
}

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

ボタン button3 を押すと、チェック ボックスの状態を取得するコードを追加します。

例 3.20. ボタン button3 のハンドラの宣言

SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void) static_throws;
    virtual ~MyWindow(Void);
 
private:
    // ポインター型のメンバ変数として定義する
    SFRCheckboxControlPtr _checkbox1;
    SFRCheckboxControlPtr _checkbox2;
 
    HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
    HANDLER_DECLARE_BOOLEVENT(OnKey)
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl1)
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl2)
 
    // *** 太字が追加部分
 
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl3)   
};

button3 を押すと チェック ボックスの状態を取得します。

例 3.21. ボタン button3 のハンドラの実装

HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnButtonControl3, result, control) {
    if (_checkbox1->GetStatusCheck()) {
        // checkbox1 がチェックされているとき
        TRACE("checkbox1: checked");
    } else {
        TRACE("checkbox1: unchecked");
    }
    if (_checkbox2->GetStatusCheck()) {
        // checkbox2 がチェックされているとき
        TRACE("checkbox2: checked");
    } else {
        TRACE("checkbox2: unchecked");
    }
}

例 3.22. ボタン button3 のハンドラの登録

MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
    SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
    // 描画ハンドラの登録
    if (static_try()) {
        static_throw(
            RegisterHandler(SREVT_RESPONDER_RENDER, 
                            SRP16_RENDER_CONTENT,
                            HANDLER_BEFORE, 
                            HANDLER_FUNCTION(OnRenderContent)));
    }
 
    // キー ハンドラの登録
    if (static_try()) {
        static_throw(
            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)));
    }
 
    // *** 太字が追加部分
 
    // button3 を押したときのハンドラの登録
    if (static_try()) {
        static_throw(
            button3->RegisterHandler(SREVT_CONTROL, 
                                     HANDLER_BEFORE,
                                     HANDLER_FUNCTION(OnButtonControl3)));
    }

    // チェック ボックスの作成
    _checkbox1 = new SFRCheckboxControl(this, 
                                        SFXRectangle(10, 115, 90, 20), 
                                        "check1");
    _checkbox2 = new SFRCheckboxControl(this, 
                                        SFXRectangle(105, 115, 90, 20), 
                                        "check2");
}

図 3.8. 実行結果

実行結果

図 3.9. ボタン button3 を押したときのデバッグ画面 ( チェック ボックスの状態が出力されます )

ボタン button3 を押したときのデバッグ画面 ( チェック ボックスの状態が出力されます )

3.3.5. ラジオ ボタン

図のようにラジオ ボタンを配置するコードを追加します。

図 3.10. ラジオ ボタン

ラジオ ボタン

例 3.23. ラジオ ボタンの定義

SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void) static_throws;
    virtual ~MyWindow(Void);
    
// *** 太字が追加部分

private:
    // ポインター型のメンバ変数として定義する
    SFRCheckboxControlPtr _checkbox1;
    SFRCheckboxControlPtr _checkbox2;
 
    SFRRadiobuttonControlPtr _radiobutton1;
    SFRRadiobuttonControlPtr _radiobutton2;
    
    HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
    HANDLER_DECLARE_BOOLEVENT(OnKey)
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl1)
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl2)
};

例 3.24. ラジオ ボタンの作成

MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
    SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
    // 描画ハンドラの登録
    if (static_try()) {
        static_throw(
            RegisterHandler(SREVT_RESPONDER_RENDER, 
                            SRP16_RENDER_CONTENT,
                            HANDLER_BEFORE, 
                            HANDLER_FUNCTION(OnRenderContent)));
    }
 
    // キー ハンドラの登録
    if (static_try()) {
        static_throw(
            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)));
    }

    if (static_try()) {
        static_throw(
            button3->RegisterHandler(SREVT_CONTROL, 
                                     HANDLER_BEFORE,
                                     HANDLER_FUNCTION(OnButtonControl3)));
    }
 
    // チェック ボックスの作成
    _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);

}

ラジオ ボタンは Group 関数を用いてグループ化します。

[Note] ラジオ ボタンの状態取得

ラジオ ボタンの状態取得も GetStatusCheck() 関数で状態取得できます。

3.3.6. コンボ ボックス

図のようにコンボ ボックスを配置するコードを追加します。

図 3.11. コンボ ボックス

コンボ ボックス

例 3.25. コンボ ボックスの定義

SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void) static_throws;
    virtual ~MyWindow(Void);
    
// *** 太字が追加部分

private:
    // ポインター型のメンバ変数として定義する
    SFRCheckboxControlPtr _checkbox1;
    SFRCheckboxControlPtr _checkbox2;
    SFRRadiobuttonControlPtr _radiobutton1;
    SFRRadiobuttonControlPtr _radiobutton2;

    SFRComboboxControlPtr _combobox;

    HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
    HANDLER_DECLARE_BOOLEVENT(OnKey)
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl1)
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl2)
};

例 3.26. コンボ ボックスの作成

MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
    SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
    // 描画ハンドラの登録
    if (static_try()) {
        static_throw(
            RegisterHandler(SREVT_RESPONDER_RENDER, 
                            SRP16_RENDER_CONTENT,
                            HANDLER_BEFORE, 
                            HANDLER_FUNCTION(OnRenderContent)));
    }
 
    // キー ハンドラの登録
    if (static_try()) {
        static_throw(
            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)));
    }

    if (static_try()) {
        static_throw(
            button3->RegisterHandler(SREVT_CONTROL, 
                                     HANDLER_BEFORE,
                                     HANDLER_FUNCTION(OnButtonControl3)));
    }
 
    // チェック ボックスの作成
    _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));

}

3.3.7. コンボ ボックス ハンドラの登録

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

例 3.27. コンボ ボックス ハンドラの宣言

SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void) static_throws;
    virtual ~MyWindow(Void);

// *** 太字が追加部分

private:
    // ポインター型のメンバ変数として定義する
    SFRCheckboxControlPtr _checkbox1;
    SFRCheckboxControlPtr _checkbox2;
    SFRRadiobuttonControlPtr _radiobutton1;
    SFRRadiobuttonControlPtr _radiobutton2;
    SFRComboboxControlPtr _combobox;
 
    HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
    HANDLER_DECLARE_BOOLEVENT(OnKey)
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl1)
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl2)
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl3)  
 
    HANDLER_DECLARE_VOIDCONTROL(OnComboboxControl)
};

例 3.28. コンボ ボックスのハンドラの実装

// 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.", _combobox->GetValue(), string.GetCString());
    }
}

例 3.29. コンボ ボックスのハンドラの登録

MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
    SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
    // 描画ハンドラの登録
    if (static_try()) {
        static_throw(
            RegisterHandler(SREVT_RESPONDER_RENDER, 
                            SRP16_RENDER_CONTENT,
                            HANDLER_BEFORE, 
                            HANDLER_FUNCTION(OnRenderContent)));
    }
 
    // キー ハンドラの登録
    if (static_try()) {
        static_throw(
            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)));
    } 
    // button3 を押したときのハンドラの登録
    if (static_try()) {
        static_throw(
            button3->RegisterHandler(SREVT_CONTROL, 
                                     HANDLER_BEFORE,
                                     HANDLER_FUNCTION(OnButtonControl3)));
    }

    // チェック ボックスの作成
    _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));
  
    // *** 太字が追加部分
 
    // コンボ ボックス の項目が選択されたときのハンドラの登録
    if (static_try()) {
        static_throw(
            _combobox->RegisterHandler(SREVT_CONTROL, 
                                       HANDLER_BEFORE,
                                       HANDLER_FUNCTION(OnComboboxControl)));
    }

}

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

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

図 3.13. コンボ ボックスでアイテムを選択した後のデバック画面

コンボ ボックスでアイテムを選択した後のデバック画面

3.3.8. 無効化と非表示

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

図 3.14. コントロールの無効化と非表示

コントロールの無効化と非表示

button4 を押したときにコントロールを無効 / 非表示 にします。

例 3.30. ボタン button4 のハンドラの宣言

SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void) static_throws;
    virtual ~MyWindow(Void);
 
// *** 太字が追加部分
 
private:  
    // ポインター型のメンバ変数として定義する
    SFRCheckboxControlPtr _checkbox1;
    SFRCheckboxControlPtr _checkbox2;
    SFRRadiobuttonControlPtr _radiobutton1;
    SFRRadiobuttonControlPtr _radiobutton2;
    SFRComboboxControlPtr _combobox;
  
    HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
    HANDLER_DECLARE_BOOLEVENT(OnKey)
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl1)
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl2)
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl3)   
 
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl4)

};

例 3.31. ボタン button4 のハンドラの登録

MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
    SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
    // 描画ハンドラの登録
    if (static_try()) {
        static_throw(
            RegisterHandler(SREVT_RESPONDER_RENDER, 
                            SRP16_RENDER_CONTENT,
                            HANDLER_BEFORE, 
                            HANDLER_FUNCTION(OnRenderContent)));
    }
 
    // キー ハンドラの登録
    if (static_try()) {
        static_throw(
            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)));
    } 
    // button3 を押したときのハンドラの登録
    if (static_try()) {
        static_throw(
            button3->RegisterHandler(SREVT_CONTROL, 
                                     HANDLER_BEFORE,
                                     HANDLER_FUNCTION(OnButtonControl3)));
    }
    
    // *** 太字が追加部分

    // button4 を押したときのハンドラの登録
    if (static_try()) {
        static_throw(
            button4->RegisterHandler(SREVT_CONTROL, 
                                     HANDLER_BEFORE,
                                     HANDLER_FUNCTION(OnButtonControl4)));
    }

    // チェック ボックスの作成
    _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));
  
    // コンボ ボックス の項目が選択されたときのハンドラの登録
    if (static_try()) {
        static_throw(
            _combobox->RegisterHandler(SREVT_CONTROL,
                                       HANDLER_BEFORE,
                                       HANDLER_FUNCTION(OnComboboxControl)));
    }

}

ボタンハンドラの定義でコントロールを無効 / 非表示にします。

例 3.32. ボタン4 のハンドラの実装

HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnButtonControl4, result, control) {
    
    // チェック ボックス 2 を無効にする
    _checkbox2->SetStatusEnable(false);
    
    // ラジオ ボタン 1 を無効にする
    _radiobutton1->SetStatusEnable(false);
    
    // ラジオ ボタン 2 を非表示にする
    _radiobutton2->SetStatusVisible(false);
}

ウィンドウ全体を無効にできます。

図 3.15. ウィンドウ全体を無効にした状態

ウィンドウ全体を無効にした状態

例 3.33. ウィンドウ全体を無効にするコード

HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnButtonControl4, result, control) {
    
    // チェック ボックス 2 を無効にする
    _checkbox2->SetStatusEnable(false);
    
    // ラジオ ボタン1を無効にする
    _radiobutton1->SetStatusEnable(false);
    
    // ラジオ ボタン2を非表示にする
    _radiobutton2->SetStatusVisible(false);
    
    // ↓以下を追加
    // ウィンドウ全体を無効にする
    this->SetStatusEnable(false);
}

3.3.9. テキスト ボックスの配置

図のようにテキスト ボックスを配置するコードを追加します。

図 3.16. テキスト ボックス

テキスト ボックス

例 3.34. テキスト ボックスの定義とそのハンドラの宣言

SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void) static_throws;
    virtual ~MyWindow(Void);
 
// *** 太字が追加部分
 
private:  
    // ポインター型のメンバ変数として定義する
    SFRCheckboxControlPtr _checkbox1;
    SFRCheckboxControlPtr _checkbox2;
    SFRRadiobuttonControlPtr _radiobutton1;
    SFRRadiobuttonControlPtr _radiobutton2;
    SFRComboboxControlPtr _combobox;
  
    SFREditboxControlPtr _editbox;
 
    HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
    HANDLER_DECLARE_BOOLEVENT(OnKey)
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl1)
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl2)
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl3)
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl4)
 
    HANDLER_DECLARE_VOIDCONTROL(OnEditboxControl)

};

例 3.35. テキスト ボックスの作成とそのハンドラの登録

MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
    SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
    // 描画ハンドラの登録
    if (static_try()) {
        static_throw(
            RegisterHandler(SREVT_RESPONDER_RENDER, 
                            SRP16_RENDER_CONTENT,
                            HANDLER_BEFORE, 
                            HANDLER_FUNCTION(OnRenderContent)));
    }
 
    // キー ハンドラの登録
    if (static_try()) {
        static_throw(
            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)));
    } 
    // button3 を押したときのハンドラの登録
    if (static_try()) {
        static_throw(
            button3->RegisterHandler(SREVT_CONTROL, 
                                     HANDLER_BEFORE,
                                     HANDLER_FUNCTION(OnButtonControl3)));
    }

    // button4 を押したときのハンドラの登録
    if (static_try()) {
        static_throw(
            button4->RegisterHandler(SREVT_CONTROL, 
                                     HANDLER_BEFORE,
                                     HANDLER_FUNCTION(OnButtonControl4)));
    }
    
    // チェック ボックスの作成
    _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));
  
    // コンボ ボックス の項目が選択されたときのハンドラの登録
    if (static_try()) {
        static_throw(
            _combobox->RegisterHandler(SREVT_CONTROL, 
                                       HANDLER_BEFORE,
                                       HANDLER_FUNCTION(OnComboboxControl)));
    }

    // *** 太字が追加部分

    // テキスト ボックスの作成
    // 初期値 : "hello textbox"   
    _editbox = new SFREditboxControl(this, 
                                     SFXRectangle(10, 190, 150, 28), 
                                     "hello textbox");

    // 最大文字数を設定する
    _editbox->SetMaxSize(255);

    // テキストの入力後やフォーカスが外れたときの
    // ハンドラの設定
    if (static_try()) {
        static_throw(
            _editbox->RegisterHandler(SREVT_CONTROL, 
                                      HANDLER_BEFORE,
                                      HANDLER_FUNCTION(OnEditboxControl)));
    }

    // テキスト ボックス上でセレクトキーを押したときに
    // 入力モードに移るようにセットする
    // ( SelectHandler は SophiaFramework が用意しているセレクトキー用のハンドラ )
    if (static_try()) {
        static_throw(
            RegisterHandler(SFEVT_KEY, 
                            AVK_SELECT, 
                            HANDLER_AFTER,
                            HANDLER_FUNCTION(SelectHandler)));
    }
}

例 3.36. テキスト ボックス ハンドラの実装

// テキストの入力後やフォーカスが外れたときのイベントハンドラ
HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnEditboxControl, result, control)
{
    // ターゲットを外す
    control->SetStatusTarget(false);

    if (result) {
        // テキストを入力した後のとき
        
        // フォーカスを次へ移動する
        FocusNext();

    } // フォーカスが外れたとき
    else {
        //...
    }
}

3.3.10. テキスト ボックスのテキスト取得

テキスト ボックスに入力されたテキストは GetText() 関数で取得します。

例 3.37. ボタン button3 のハンドラの実装

HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnButtonControl3, result, control)
{
    // *** 太字が追加部分

    // テキスト ボックスからテキストを取得する
    SFXAnsiString string = static_cast<SFXAnsiString>(_editbox->GetText());

    // テキストを表示する
    TRACE("_editbox: %s", string.GetCString());
}

図 3.17. 実行結果

実行結果

テキストコントロールに入力された文字列が、デバック画面に表示されます。

図 3.18. デバック画面

デバック画面