![]() ![]() ![]()
|
SophiaFramework 2.2 |
アプリケーションはレスポンダの一種でありすべてのレスポンダの 所有関係の頂点に存在します。また大半のトレーサはアプリケーションに登録 されています。
SophiaFramework を使用した、最も簡単なアプレットは以下のようになります。
SFMTYPEDEFCLASS(Demo)
class Demo : public SFRApplication {
public:
static inline SFCInvokerPtr Constructor(Void)
{
return(new Demo());
}
private:
inline Demo(Void)
{
return;
}
virtual inline ~Demo(Void)
{
return;
}
};
SFCInvokerSPP SFCApplet::Boot(AEECLSID id)
{
SFCInvokerSPP result = NULL;
switch (id) {
case AEECLSID_Demo:
result = Demo::Constructor;
break;
}
return(result);
}
Demo クラスがアプレットのメインとなるクラスです。 アプレットを起動すると SFCApplet::Boot 関数が実行されます。 SFCApplet::Boot 関数ではクラス ID と自分のクラス ID を比較し、 一致したときは次に実行する Demo::Constructor 関数ポインタを返します。 Demo::Constructor 関数内で Demo クラスを作成して返し、以降 Demo クラスが アプレットの核としてイベントの処理を行います。
SFCApplet::Boot の戻り値となる関数は次の型をもつ静的メンバ関数で なければいけません。
SFCInvokerPtr (*SFCInvokerSPP) (Void);
アプリケーションでイベントを受け取るにはイベント ハンドラを 登録します。アプリケーションには標準でいくつかのハンドラが 登録されています。例えば、SFEVT_SUSPEND や SFEVT_RESUME は 常に TRUE を返すハンドラが登録されており、SREVT_RESPONDER_RENDER の SRP16_RENDER_CONTENT イベントには全画面クリアを行うハンドラが 登録されています。
キー イベントを受け取れるようにするにはハンドラを 登録します。先ほどに示したアプレットで、キーイベントを受け取るためには、 以下のように修正します。
SFMTYPEDEFCLASS(Demo)
class Demo : public SFRApplication {
public:
static inline SFCInvokerPtr Constructor(Void)
{
return(new Demo());
}
private:
inline Demo(Void)
{
if (Exception() == NO_ERROR) {
Exception(RegisterHandler(SFEVT_KEY, HANDLER_AFTER, Key_static, this));
}
return;
}
virtual inline ~Demo(Void)
{
return;
}
static inline Bool Key_static(ConstSFUEventRef event, VoidPtr responder)
{
return(DemoPtr(responder)->Key_handler(event));
}
inline Bool Key_handler(ConstSFUEventRef event)
{
// something to do
return(TRUE);
}
};
SFCInvokerSPP SFCApplet::Boot(AEECLSID id)
{
SFCInvokerSPP result = NULL;
switch (id) {
case AEECLSID_Demo:
result = Demo::Constructor;
break;
}
return(result);
}
上記のように記述することで Key_handler 関数内で キー イベントを受け取ることができるようになります。
コンテント領域の描画を独自に行いたいときにもハンドラを 登録します。以下にコンテント領域の再描画イベントを受け 取れるように修正したアプリケーションすべてのサンプル コードを示します。
SFMTYPEDEFCLASS(Demo)
class Demo : public SFRApplication {
public:
static inline SFCInvokerPtr Constructor(Void)
{
return(new Demo());
}
private:
inline Demo(Void)
{
if (Exception() == NO_ERROR) {
Exception(RegisterHandler(SREVT_RESPONDER_RENDER, SRP16_RENDER_CONTENT, HANDLER_BEFORE, Update_static, this));
}
return;
}
virtual inline ~Demo(Void)
{
return;
}
static inline Bool Update_static(ConstSFUEventRef event, VoidPtr responder)
{
DemoPtr(responder)->Update_handler(SFUGraphicsPtr(event.p32()));
return(TRUE);
}
inline Void Update_handler(SFUGraphicsPtr graphic)
{
SFUBrewPtr<SFBBitmap> i;
SFRApplication::ContentHandler(graphic);
i = SFBShell::Instance()->LoadResBitmap("Demo.bar", 1000);
if (i != NULL) {
graphic->DrawBitmap(i, SFUPoint(0, 0));
}
return;
}
};
SFCInvokerSPP SFCApplet::Boot(AEECLSID id)
{
SFCInvokerSPP result = NULL;
switch (id) {
case AEECLSID_Demo:
result = Demo::Constructor;
break;
}
return(result);
}
上記コードでは、コンテント領域の再描画イベントを 受け取り、リソースから画像を取得してコンテント領域に描くという 動作を行っています。 Update_handler 関数内で描画を行っていますが、まず 全画面をクリアするために親クラスのコンテント アップデート用の ハンドラを手動で呼び出しています。 親クラスのハンドラを手動で呼び出している理由は、 標準で登録されていたハンドラはすでにオーバーライト されているためです。
アプレットを終了するには、 SFBShell クラスの CloseApplet 関数を使用します。 以下にサンプル コードを示します。
SFBShell::Instance()->CloseApplet(FALSE);
CloseApplet() 関数の引数の詳細については、BREW SDK のリファレンスを参照してください。 CloseApplet() 関数を呼び出すと、 SFEVT_APP_STOP イベントがやってきます。
| Copyright(C) 2003-2004 Sophia Cradle Inc., All Rights Reserved. |
![]() ![]() ![]()
|