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

5.3. ウィンドウ

5.3.1. ウィンドウの定義と実装

SophiaFramework UNIVERSE AppWizard が生成した HelloWorld アプリのコードをカスタマイズします。

図 5.1. ウィンドウ内に文字列 " HelloWorld " を表示する HelloWorld アプリ

ウィンドウ内に文字列 " HelloWorld " を表示する HelloWorld アプリ

例 5.9. タイトルウィンドウ MyWindow の定義

// SFRTitleWindow を継承する
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)
};

"Hello Window" 文字列の描画とセレクトキーの処理についてのハンドラを実装します。

例 5.10. タイトルウィンドウ MyWindow の実装

// コンストラクタ
// 座標 : (20, 20)、幅 : 200、高さ : 250
// タイトル : "my window"
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)));
    }

    return;
}

// デストラクタ
MyWindow::~MyWindow(Void)
{
    return;
}

// ウィンドウの描画ハンドラ
HANDLER_IMPLEMENT_VOIDRENDER(MyWindow, OnRenderContent, graphics)
{
    // 描画領域を白色で塗りつぶす
    // GetContentWorld() : ウィンドウ内の描画領域( 矩形 )
    // SFXRGBColor(0xFF, 0xFF, 0xFF, 0x00) : 白色
    graphics->FillRectangle(GetContentWorld(), 
                               SFXRGBColor(0xFF, 0xFF, 0xFF, 0x00));

    // 文字列 "Hello Window" を描画する
    // SFXRGBColor(0x00, 0x00, 0x00, 0x00) : 黒色
    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;
}

5.3.2. ウィンドウの作成

1 キーを押すとウィンドウが表示されるようにキーハンドラをカスタマイズします。

例 5.11. ウィンドウの作成 : キーハンドラのカスタマイズ

HANDLER_IMPLEMENT_BOOLEVENT(HelloWorld, OnKey, event)
{

    // キーハンドラの処理
    switch (event.GetP16()) {
        case AVK_SELECT: // セレクトキーのキーイベントを受信したとき
            Terminate(); // アプリを終了する
            return true;

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

        case AVK_1: // 1 キーのキーイベントを受信したとき

            // new 演算子でウィンドウを作成する 
            new MyWindow();

            // キーイベントを処理したので true を返す
            return true;
    }
    return false;  // キーイベントを処理しなかったときは false を返す
}

背景が白く塗りつぶされるように描画ハンドラをカスタマイズします。

例 5.12. 描画ハンドラのカスタマイズ

// HelloWorld の描画ハンドラ
HANDLER_IMPLEMENT_VOIDRENDER(HelloWorld, OnRenderContent, graphics)
{
    // *** 太字が追加部分

    // 描画領域を白色で塗りつぶす
    // GetContentWorld() : ウィンドウの中の描画領域( 矩形 )
    // SFXRGBColor(0xFF, 0xFF, 0xFF, 0x00) : 白色
    graphics->FillRectangle(GetContentWorld(), 
                               SFXRGBColor(0xFF, 0xFF, 0xFF, 0x00));

    // *** 以下が修正部分

    // 文字列 "Hello World" を描画する
    // SFXRGBColor(0x00, 0x00, 0x00, 0x00) : 黒色  
    graphics->DrawText("Hello World", 
                          GetContentWorld(), 
                          SFXRGBColor(0x00, 0x00, 0x00, 0x00));
    return;
}

5.3.3. ウィンドウの破棄

作成した ウィンドウを破棄するには Invoke 関数を使用して SFXEvent(SREVT_RESPONDER_TERMINATE, SRP16_TERMINATE_INVOKE, true) イベントを送信します。

例 5.13. ウィンドウの破棄

// ウィンドウを破棄する
Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE, SRP16_TERMINATE_INVOKE, true));
[Warning] 警告

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

5.3.4. シミュレータでの実行

  1. 1 キーを押すと、ウィンドウが表示されます。
  2. 更に 1 キーを押すと、デバッグウィンドウに "1-key" が表示されます。
  3. クリアーキーを押すと、ウィンドウは閉じます。

図 5.2. 実行結果

実行結果

図 5.3. デバッグウィンドウ

デバッグウィンドウ
[Note] 注意
デバッグウィンドウは、メニューから [ 表示 ] - [ 出力ウィンドウ ] を選ぶと表示されます。