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 クラスの存在意義は、コンストラクタやオペレータでのエラー値を外部に搬出する、一般的な規約を制定する点にあります。



















