前のページ次のページ上に戻るホーム SophiaFramework UNIVERSE 5.3

5.4. コントロール

5.4.1. ボタン

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

図 5.4. ボタン

ボタン

例 5.14. ボタンの作成

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 UNIVERSE では、ポインタ型は Ptr で表します。SFRButtonControlPtr は SFRButtonControl* と同じ意味です。

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

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

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

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

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

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

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

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

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

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

// ボタン 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));
}

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

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

図 5.5. 実行結果

実行結果

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

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

5.4.3. チェックボックス

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

図 5.7. チェックボックス

チェックボックス

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

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

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

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

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

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

例 5.21. ボタン 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 を押すと チェックボックスの状態を取得します。

例 5.22. ボタン 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");
    }
}

例 5.23. ボタン 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");
}

図 5.8. 実行結果

実行結果

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

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

5.4.5. ラジオボタン

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

図 5.10. ラジオボタン

ラジオボタン

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

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

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

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 関数で状態取得できます。

5.4.6. コンボボックス

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

図 5.11. コンボボックス

コンボボックス

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

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

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

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

}

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

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

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

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

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

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

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

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

}

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

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

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

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

5.4.8. 無効化と非表示

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

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

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

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

例 5.31. ボタン 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)

};

例 5.32. ボタン 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)));
    }

}

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

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

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

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

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

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

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

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

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

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

図 5.16. テキストボックス

テキストボックス

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

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)

};

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

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 UNIVERSE が用意しているセレクトキー用のハンドラ )
    if (static_try()) {
        static_throw(
            RegisterHandler(SFEVT_KEY, 
                            AVK_SELECT, 
                            HANDLER_AFTER,
                            HANDLER_FUNCTION(SelectHandler)));
    }
}

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

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

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

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

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

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

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

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

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

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

図 5.17. 実行結果

実行結果

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

図 5.18. デバック画面

デバック画面