BREW HelloWorld アプレット 〜 SophiaFramework UNIVERSE の使い方 〜
ソースコード解説 : GUI フレームワークを使う SFR アプレット
アプレットの起動
SophiaFramework UNIVERSE のアプリは SFCApplet::Boot() 関数と Factory() 関数を実装する必要があります。
Boot() 関数は、アプレットで最初に実行される関数です。この関数では、最初に ライセンスコード(※)を設定します。それから、ClassID が AEECLSID_HELLOWORLD である HelloWorld アプリクラスのインスタンスを生成する Factory() 関数を返します。
Boot() 関数の次に実行されるのが Factory() 関数です。この関数では、HelloWorld アプリケーションクラスのインスタンスを生成するコンストラクタが呼び出されます。
※ ClassID に対応したライセンスコードでなければ、アプレットは実機では起動しません。シミュレータ上では、ライセンスコードを設定しなくてもアプレットは起動します。
// // HelloWorld.cpp // #include "HelloWorld.hpp" // ブート ローダ SFCApplet::FactorySPP SFCApplet::Boot(AEECLSID id, SFXAnsiStringPtr license) { *license = "heap://" "TIXDRQXNU5WHU8Y3Z9WOHWQR6Z3VPSDHDV5CR1S4XASPWLUHWAS7Z5Z2TGS3XMSAT3UPUQTLTAR" "CYPSFUEJZ6ROSJWGUQSEYKR6V2U4VESMTQLHKZ6X7Y2VKXHWIX3XBU0Z7VHWHXIZBSGT5SPU3XL" "X0Z1Y4R3TCU6WGT9WHWIVNYHYCUCR9T3SMTEWPRNVAX1Y4VPW2YCY9YQV5R7Z9UIVHT6SDUPU2S" "IW6VCRCWBR2S4WQUPYFWCYGT4VIT1WHXGYPTQSFYPWNV3ULRNWFW7RBRFVKUKS2YQSQYHW1TPUP" "XBZ6UEY2WOYKR7S3TAU4TQS6UHVFVEVLU3R5SDSKW7RPTNTPVQU2T4R8Z4VLUGEW3U98TLDR8/"; return (id == AEECLSID_HELLOWORLD) ? (&HelloWorld::Factory) : (null); } // ファクトリ関数 SFCInvokerPtr HelloWorld::Factory(Void) { return ::new HelloWorld; }
アプリケーションクラスの定義 :
GUI フレームワークを使う SFR アプレットでは、SFRApplication クラスを継承します。(※)
SFMTYPEDEFCLASS は HelloWorld アプリケーションクラスに関する便利なユーザー定義型を自動生成するマクロです。
SFMSEALCOPY はインスタンスのコピーを禁止するマクロです。SFRApplication を継承するクラスのインスタンスはコピーしてはいけません。
HANDLER_DECLARE_VOIDRENDER(OnRenderContent) で描画ハンドラ、HANDLER_DECLARE_BOOLEVENT(OnKey) でキーハンドラを宣言しています。
// // HelloWorld.hpp // #ifndef __HELLOWORLD_HPP #define __HELLOWORLD_HPP #include <SophiaFramework.hpp> #include "HelloWorld.bid" // // HelloWorld アプリケーション クラス // SFMTYPEDEFCLASS(HelloWorld) class HelloWorld : public SFRApplication { SFMSEALCOPY(HelloWorld) public: static SFCInvokerPtr Factory(Void); private: explicit HelloWorld(Void) static_throws; virtual ~HelloWorld(Void); HANDLER_DECLARE_VOIDRENDER(OnRenderContent) HANDLER_DECLARE_BOOLEVENT(OnKey) }; #endif // __HELLOWORLD_HPP //
※ GUI フレームワークを使用しない SFC アプレットでは、SFCApplication クラスを継承します。
SophiaFramework UNIVERSE リファレンス : SFRApplication / SFCApplication
コンストラクタの定義
アプリケーションクラスのコンストラクタでは、RegisterHandler() 関数を使ってイベントハンドラを登録するなどして、アプリケーションクラスのインスタンスを生成します。 RegisterHandler() 関数の引数として、イベントコード、イベントコードに付随するデータ、関数を呼び出すタイミング、関数ポインタを渡します。
// コンストラクタ HelloWorld::HelloWorld(Void) 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; }
デストラクタの定義
アプレットの終了時にはデストラクタが呼び出され、アプリケーションクラスのインスタンスが破棄されます。ウィンドウやコントロールなどの全ての UI コンポーネントは自動的に破棄されますので、 UI コンポーネントの破棄処理のコードは不要です。
// デストラクタ HelloWorld::~HelloWorld(Void) { return; }
イベントハンドラの定義
イベントハンドラはイベントが発生した時の処理を記述するための関数です。
描画イベントが発生した時の処理は描画ハンドラ HANDLER_IMPLEMENT_VOIDRENDER(HelloWorld, OnRenderContent, graphics) で定義します。
キー押下イベントが発生した時の処理はキーハンドラ HANDLER_IMPLEMENT_BOOLEVENT(HelloWorld, OnKey, event) で定義します。
描画ハンドラの定義
graphics->DrawText() 関数を使って、文字列"Hello World"を画面に表示します。
※ GUI フレームワークを利用するアプリでは、すべての描画処理は描画ハンドラ内で行わなければいけません。( 描画ハンドラの外で行われた描画に対しては開発者がすべての状態を管理する必要があります。)
// 描画ハンドラ HANDLER_IMPLEMENT_VOIDRENDER(HelloWorld, OnRenderContent, graphics) { // 黒色を表す定数 static SFXRGBColor::AtomRecConst black = { 0x00, 0x00, 0x00, 0x00 }; // 画面をクリアする SFRApplication::ContentHandler(graphics); // 画面に文字列 "Hello World" を描画する graphics->DrawText("Hello World", GetContentWorld(), black); return; }
キーハンドラの定義
セレクトキーが押されたらアプレットが終了するコードが記述されています。
// キー ハンドラ HANDLER_IMPLEMENT_BOOLEVENT(HelloWorld, OnKey, event) { switch (event.GetP16()) { case AVK_SELECT: // セレクト キーが押されたら Terminate(); // アプレットを終了する return true; } return false; }
※ Terminate() を呼び出すことで、デストラクタが呼び出されてアプレットは終了します。
エラー処理の機構
コンストラクタで使用している static_try() と static_throw() は、それぞれエラー値を検証するための関数とエラー値を設定するための関数です。
設定されたエラー値は static_catch() で取得できます。通常、static_catch() はエラー値を throw するクラスを利用する側で使います。
// エラー値をキャッチしエラー処理するためのコード helloworld = ::new HelloWorld(); switch( helloworld->static_catch() ){ // エラー値に応じてエラー処理をする ・・・ };
static_exception クラスはエラー値を管理する変数を持っています。この変数はテンプレート型で通常 SFCError 型が利用されます。
static_exception クラスの存在意義は、コンストラクタやオペレータでのエラー値を外部に搬出する、一般的な規約を制定する点にあります。