前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework UNIVERSE 5.0

5.4. SFC アプレットの開発

GUI フレームワークを使わない SFC アプレットの場合、 アプリケーションクラスは SFCApplication を継承して定義します。

[Note] SFY アプレットの場合

SFY GUI フレームワークを使う SFY アプレットの場合、 アプリケーションクラスは SFYApplication を継承して定義します。

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

たとえば、キーハンドラ OnKey 関数は、通常の関数と同じように宣言します。

BREW 標準アプレット開発の場合と同じです。

例 5.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 //
[Tip] HandleEvent 関数

HandleEvent 関数は SFC アプレットのイベントハンドラです。 この関数は BREW 環境からイベントを受信したときに自動的に呼び出されます。

SFC アプレット開発では、 BREW 環境からイベントを受信したときの処理を記述する必要があります。 そのためのイベント処理は SFCApplication::HandleEvent 仮想関数をオーバーライドして記述します。

HandleEvent 関数は、BREW 環境からの受信したイベントを引数とし、 受信したイベントのタイプに応じて適切なハンドラ関数が呼び出されるようにイベントの分岐処理を記述します。

HelloWorld アプレットの HandleEvent 関数では、 キーイベントを受信すると、 キーハンドラ OnKey 関数を呼び出すようにSFCApplication::HandleEvent 仮想関数をオーバーライドしています。

[Tip] HandleRender 関数

HandleRender 関数は SFC アプレットの全画面再描画ハンドラです。 この関数はアプレット開始時、レジューム時、テキスト入力から戻ったときに自動的に呼び出されます。

SFC アプレット開発では、アプレット開始時、レジューム時、テキスト入力から戻ったときに全画面を再描画する必要があります。 そのための描画処理は SFCApplication::HandleRender 仮想関数をオーバーライドして記述します。

HelloWorld アプレットの場合、アプレット開始時またはレジューム時に画面を白色で塗り潰して "Hello World" 文字列を描画するように SFCApplication::HandleRender 仮想関数をオーバーライドしています。

[Note] 通常の描画処理

これ以外の通常の描画処理は、後述の Draw 関数のようにプログラム内の任意の場所に記述可能です。

BREW 標準アプレット開発の場合と同じです。

例 5.3. SophiaFramework UNIVERSE AppWizard が自動生成するイベントハンドラ HandleEvent 関数の実装

// イベントハンドラ
Bool HelloWorld::HandleEvent(SFXEventConstRef event)
{
    // ここに各種イベントの分岐処理を記述する

    switch (event.GetType()) {
        case SFEVT_KEY: // キーイベントのとき
            // キーハンドラ OnKey 関数を呼び出す
            result = OnKey(event.GetP16()); // OnKey 関数はキーイベントを処理した場合は true、しなかった場合は false を返す
    }
    return false; // キーイベントを処理していないので false を返す
}
[Note] HandleEvent 関数

HandleEvent 関数は、BREW 環境からイベントを受信したときに自動的に呼び出される関数です。

上の例では、BREW 環境からキーイベントを受信したとき OnKey 関数を呼び出す処理を HandleEvent 関数内に記述しています。

[Note] HandleEvent 関数の戻り値

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

例 5.4. SophiaFramework UNIVERSE AppWizard が自動生成する全画面描画ハンドラ HandleRender 関数の実装

// 全画面描画ハンドラ
Bool HelloWorld::HandleRender(SFXEventConstRef event)
{
    // ここにアプレット開始時、レジューム時、またはテキスト入力から戻ったときの全画面の描画処理を記述する

    SFXGraphicsPtr graphics;

    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));
            // GUI フレームワークを使わないアプレットでは必ず画面を更新する
            graphics->Update();
            return true; // 描画したので true を返す
        }
    }
    return false; // 描画していないので false を返す
}
[Note] HandleRender 関数

アプレット開始時、レジューム時やテキスト入力から戻ったときは全画面の再描画が必要です。 HandleRender 関数はそのタイミングで自動的に呼び出される関数です。

上の例では、アプレット開始時またはレジューム時に画面を白色で塗り潰して "Hello World" 文字列を描画する処理を HandleRender 関数内に記述しています。

[Note] HandleRender 関数の戻り値

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

[Caution] graphics->Update()

SFC アプレットの場合、graphics->Update() を記述しなければ画面は更新されません。

例 5.5. SophiaFramework UNIVERSE AppWizard が自動生成するキーハンドラ OnKey 関数

// キーハンドラ OnKey 関数
Bool HelloWorld::OnKey(UInt16 key)
{
    // ここに各種イベントの分岐を記述する

    // キーイベントの処理
    switch (key) {
        case AVK_SELECT: // セレクトキーが押されたとき
            Terminate(); // アプリを終了する
            return true; // キーイベントを処理したので true を返す
    }
    return false; // キーイベントを処理していないので false を返す
}
[Note] キーハンドラの戻り値

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

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

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

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

[Caution] return 文

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

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