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

4.3. ボタン

ボタンを設置してみます。

4.3.1. ボタンの設置

図のようなボタンをMyWindow に設置します。前節で作成したコードに以下のコードを加えます。

// コンストラクタ
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");

    return;
}
[Note] 注意

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

設置したボタンはセレクトキーで押すことができます。

フォーカスを移動させるには、キーハンドラに以下のコードを加えます。

// キー ハンドラ
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;
}

ここまでのコードを実行してみると、上下左右キーを押すことでフォーカスの移動が確認できます。

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

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

ハンドラの宣言

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

ハンドラの定義

HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnButtonControl1, result, control) {
    TRACE("Hello Button"); // デバッグ画面に "Hello Button" を表示
}

HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnButtonControl2, result, control) {
    // ウィンドウを閉じる
    Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE, SRP16_TERMINATE_INVOKE, true));
}

ハンドラをコンストラクタで登録します。

// コンストラクタ
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)));
    }
}

セレクトキーでボタンを押すことができます。