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

4.4. SFC アプリの開発

SFC アプリのアプリケーションクラスは、 SFCApplication クラスを継承します。

[Note] SFY アプリ

SFY アプリのアプリケーションクラスは、SFYApplication を継承します。 SFYApplication クラスでは、 SFY レスポンダシステムの利用に必要な設定がデフォルトで実装されています。

SFC アプリでは、 ハンドラ関数の宣言に XANDLER_DECLARE_..... マクロを使いません。

例えば、キーハンドラ(以下の OnKey 関数)の宣言は、 BREW 標準アプリの関数と同じです。

例 4.2. helloworld アプリケーションクラスの定義

////  helloworld.hpp//

#ifndef __HELLOWORLD_HPP
#define __HELLOWORLD_HPP

#include <SophiaFramework.hpp>
#include "helloworld.bid"

//
//  helloworld アプリケーションクラス
//

SFMTYPEDEFCLASS(helloworld)  //  便利な型を生成するためのマクロ

class helloworld : public SFCApplication {

    SFMSEALCOPY(helloworld)  // インスタンスのコピーを禁止するためのマクロ

public:

    static SFCInvokerPtr Factory(Void);  // ファクトリ関数

private:

    helloworld(Void);
    virtual ~helloworld(Void);

    virtual Bool HandleEvent(SFXEventConstRef event);  // イベントハンドラ
    virtual Bool HandleRender(SFXEventConstRef event); // 全画面再描画ハンドラ
    Bool OnKey(UInt16 key);                            // キーハンドラ
};

#endif // __HELLOWORLD_HPP //
[Note] HandleEvent 関数

HandleEvent 関数は SFC アプリのイベントハンドラです。 この関数は BREW 環境からイベント(BREW イベント) を受信したときに最初に呼び出されます。

BREW イベントの処理は、 SFCApplication::HandleEvent 仮想関数をオーバーライドして記述します。

HandleEvent 関数は、 BREW イベントを引数に持ちます。 この関数の実装では、 受信したイベントのタイプに応じて適切なハンドラ関数を呼び出す処理を記述します。

helloworld アプリの実装では、 キーイベントを受信すると、 OnKey 関数(キーハンドラ)を呼び出す処理を記述しています。

詳細は、SFCApplication::HandleEvent 関数の解説を参照してください。

[Note] HandleRender 関数

HandleRender 関数は、 アプリ開始時とレジューム時に自動的に呼び出される、 全画面再描画ハンドラです。

アプリ開始時とレジューム時の全画面再描画の処理は、 SFCApplication::HandleRender 仮想関数をオーバーライドして記述します。

helloworld アプリの実装では、 画面を白色で塗り潰して、 文字列 "Hello World" を黒色で描画する処理を記述しています。

詳細は、SFCApplication::HandleRender 関数の解説を参照してください。

[Note] 通常の描画処理

アプリ開始時とレジューム時の全画面再描画を除く通常の描画処理は、 BREW 標準アプリ開発の場合と同様、プログラム内の任意の場所に記述できます。

(例)後述の Draw 関数。

HandleEvent 関数(イベントハンドラ)の実装

HandleEvent 関数(イベントハンドラ)の雛形は、 AppWizardによって自動的に生成されます。

例 4.3. HandleEvent 関数の実装

// イベントハンドラ
Bool helloworld::HandleEvent(SFXEventConstRef event)
{
    // ここに BREW 環境から受信したイベントの分岐処理を記述する

    Bool result(false);

    switch (event.GetType()) {

        case SFEVT_KEY: // キーイベントのとき

            // キーハンドラ OnKey 関数を呼び出す
            result = OnKey(event.GetP16()); // OnKey 関数はキーイベントを処理した場合は true、しなかった場合は false を返す
    }

    return result; // イベントを処理したときは true を返し, そうでないときは false を返す
}
[Note] HandleEvent 関数

HandleEvent 関数(イベントハンドラ)は、 BREW 環境からイベントを受信したときに自動的に呼び出される関数です。 この関数には、受信したイベントの処理を記述します。

上の例では、 キーイベントを引数にして OnKey 関数(キーハンドラ)を呼び出す処理を記述しています。

[Note] HandleEvent 関数の戻り値

HandleEvent 関数(イベントハンドラ)は、 イベントを処理した場合は true、処理しなかった場合は false を返します。

HandleRender 関数(全画面再描画ハンドラ)の実装

HandleEvent 関数(全画面再描画ハンドラ)の雛形は、 AppWizardによって自動的に生成されます。

例 4.4. HandleRender 関数の実装

// 全画面再描画ハンドラ
Bool helloworld::HandleRender(SFXEventConstRef event)
{
    // ここにアプリ開始時とレジューム時の全画面の再描画処理を記述する

    SFXGraphicsPtr graphics;
    Bool           result(false);

    if (IsRenderable()) {  // 再描画可能なら(=『優先的イベントハンドラ』が登録されていないなら)

        // SFXGraphics インスタンスを取得する
        graphics = SFXGraphics::GetInstance();
        if (graphics != null) {

            // 画面を白色で塗りつぶす
            // SFXGraphics::GetDeviceRectangle() で画面領域を取得する
            // SFXRGBColor(0xFF, 0xFF, 0xFF, 0x00) は白色を表す( 左から R、G、B、アルファ値 )
            graphics->ClearRectangle(graphics->GetDeviceRectangle(), SFXRGBColor(0xFF, 0xFF, 0xFF, 0x00));

            // 文字列 "Hello World" を黒色で描画する
            graphics->DrawSingleText("Hello World", graphics->GetDeviceRectangle(), SFXRGBColor(0x00, 0x00, 0x00, 0x00));

            // 最後に SFXGraphics::Update() を呼び出して再描画する
            // ※この一行を記述しなければ、画面は更新されない
            graphics->Update();

            result = true;  // 再描画したので result に true を設定する
        }
    }

    return result;  // 再描画した場合は true、そうでない場合は false を返す
}

参照: SFXGraphics | SFXGraphics::GetInstance | SFXGraphics::GetDeviceRectangle | SFXGraphics::ClearRectangle | SFXGraphics::Update | SFCApplication::IsRenderable | SFCApplication::HandleError | SFYApplication::HandleRender

[Note] HandleRender 関数

SFCApplication::HandleRender 関数は、 アプリ開始時とレジューム時に自動的に呼び出される仮想関数です。

SFCApplication を継承するアプリケーションクラスでは、 全画面再描画の処理は、 HandleRender 関数にオーバーライドして実装します。

上の例では、 画面を白色で塗り潰してから、 文字列 "Hello World" を黒色で描画する処理を実装しています。

[Note] HandleRender 関数の戻り値

HandleRender 関数は、 再描画を行った場合は true、行わなかった場合は false を返します。

[Note] IsRenderable 関数

ネイティブテキスト入力コントロール ( BREW API ITextCtl)のように UI を表示する BREW インターフェースでは、 UI 表示中は優先的イベントハンドラが登録されています。

優先的イベントハンドラが登録されている間は、 画面を描画してはいけません。

SFCApplication::IsRenderable 関数は、 優先的イベントハンドラを判定するための関数です。

優先的イベントハンドラの詳細は、 SFXEventBypass クラスの解説を参照してください。

[Caution] 画面の更新

HandleRender 関数の実装では、 SFXGraphics::Update 関数を呼び出して画面を更新する必要があります。

上の例では、下記のコードにより、画面は再描画されます。

graphics->Update();

OnKey 関数(キーハンドラ)の実装

OnKey 関数(キーハンドラ)の雛形は、 AppWizardによって自動的に生成されます。

例 4.5. OnKey 関数の実装

// キーハンドラ
Bool helloworld::OnKey(UInt16 key)
{
    // ここに BREW 環境から受信したキーイベントの分岐処理を記述する

    // キーイベントの処理
    switch (key) {

        case AVK_SELECT: // セレクトキーのキーイベントを受信したとき

            Terminate(); // アプリを終了する

            return true; // キーイベントを処理したので true を返す
    }

    return false; // キーイベントを処理していないので false を返す
}
[Note] キーハンドラの戻り値

キーハンドラは、キーイベントを処理した場合は true、処理しなかった場合は false を返します。

例 4.6. コンストラクタの定義

helloworld::helloworld(Void) static_throws
{
    // return;  ← NG(×) コンストラクタでは return 文を記述してはいけない
}
[Note] イベントハンドラの登録

SFC アプリではイベントハンドラを独自に実装するので、 コンストラクタではハンドラ関数を登録しません。

[Caution] return 文

C++ ではコンストラクタやデストラクタでは return 文を記述しません。

GCC を使う場合、コンストラクタやデストラクタ内で return 文を記述すると、 特定の継承関係になっているときにコンパイラがフリーズするバグが確認されています。