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

4.2. ウィンドウを作る

以降の章では、サンプルコードを用いてGUI フレームワークを解説します。アプリウィザードで作成したコードにサンプルコードをコピー ペーストで追加し、エミュレータで実行させてみてください。

4.2.1. ウィンドウクラス

図のようなウィンドウを表示します。アプリウィザードで生成したコードに以下のコードを追加します。

宣言

// ウィンドウを表示するには、SFRTitleWindow を継承したクラスを作成する
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)
};

関数定義

// コンストラクタ(ウィンドウ生成時に実行)
// ウィンドウは 座標 (20, 20) に、幅200、高さ250 で作られる。
// タイトルは "my window"
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));

    return;
}

// デストラクタ(ウィンドウ破棄時に実行)
MyWindow::~MyWindow(Void)
{
    return;
}

// 描画ハンドラ(ウィンドウ内に描画)
HANDLER_IMPLEMENT_VOIDRENDER(MyWindow, OnRenderContent, graphics)
{
    // 画面を描画

    // 白く塗りつぶす
    // GetContentWorld() はウィンドウの中の描画領域を表す四角形(SFXRectangle)を返す
    // SFXRGBColor(0xFF, 0xFF, 0xFF, 0x00) は色を表す(左からR,G,B,アルファ値)。
    graphics->FillRectangle(GetContentWorld(), SFXRGBColor(0xFF, 0xFF, 0xFF, 0x00));

    // "Hello Window" 文字列表示
    graphics->DrawText("Hello Window", GetContentWorld(), SFXRGBColor(0x00, 0x00, 0x00, 0x00));
    return;
}

// キー ハンドラ(ウィンドウが前面にあるときにキーが押されると実行される)
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;
    }
    return false;
}

ハンドラの宣言や定義は HelloWorld クラスとほとんど同じです。

4.2.2. ウィンドウの生成

MyWindow を生成、表示します。HelloWorld のキーハンドラに太字の部分のコードを追加します(数字の1キーを押すとウィンドウ生成)。

// HelloWorld のキー ハンドラ
HANDLER_IMPLEMENT_BOOLEVENT(HelloWorld, OnKey, event)
{
    switch (event.GetP16()) {
        case AVK_SELECT: // セレクト キーが押されたら
            Terminate(); // アプリを終了する。
            return true;

        //*** 太字の部分を追加

        case AVK_1:

            // new 演算子でウィンドウ生成 (エラー処理は省略)
            new MyWindow();

            // キーを処理したなら true を返す
            return true;
    }
    return false;
}

このままでは背景が白く塗りつぶされないので、HelloWorld の描画ハンドラを修正します。

// HelloWorld の描画ハンドラ
HANDLER_IMPLEMENT_VOIDRENDER(HelloWorld, OnRenderContent, graphics)
{
    //*** ↓以下を追加

    // 白く塗りつぶす
    // GetContentWorld() はウィンドウの中の描画領域を表す四角形(SFXRectangle)を返す
    // SFXRGBColor(0xFF, 0xFF, 0xFF, 0x00) は色を表す(左からR,G,B,アルファ値)。
    graphics->FillRectangle(GetContentWorld(), SFXRGBColor(0xFF, 0xFF, 0xFF, 0x00));

    //*** ↓以下を修正

    graphics->DrawText("Hello World", GetContentWorld(), SFXRGBColor(0x00, 0x00, 0x00, 0x00));
    return;
}

4.2.3. 実行結果

ここまでのコードを実行してみると図のようになります。1 キーを押すとウィンドウが表示されます。もう一度 1 キーを押すとデバッグ ウィンドウに "1-key" が表示されます。クリアー キー (キーボードではBack Space) を押すとウィンドウが破棄されます。

デバッグ ウィンドウ

[Note] 注意

デバッグ ウィンドウが表示されていない場合は、メニューから [表示] - [出力ウィンドウ] を選ぶと表示されます。

4.2.4. ウィンドウの破棄

生成した MyWindow を破棄するには Invoke 関数でイベントを送信します。

[Warning] 警告

delete 演算子では破棄できません。

上記コードの (*) で破棄しています。

// ウィンドウの破棄 (閉じる) (*)
return Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE, SRP16_TERMINATE_INVOKE, true));