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

9.8. アプリケーション

アプリケーションはレスポンダの一種でありすべてのレスポンダの 所有関係の頂点に存在します。また大半のトレーサはアプリケーションに登録 されています。

9.8.1. アプレットの開始

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);

9.8.2. イベントの処理

アプリケーションでイベントを受け取るにはイベント ハンドラを 登録します。アプリケーションには標準でいくつかのハンドラが 登録されています。例えば、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 関数内で描画を行っていますが、まず 全画面をクリアするために親クラスのコンテント アップデート用の ハンドラを手動で呼び出しています。 親クラスのハンドラを手動で呼び出している理由は、 標準で登録されていたハンドラはすでにオーバーライト されているためです。

9.8.3. アプレットの終了

アプレットを終了するには、 SFBShell クラスの CloseApplet 関数を使用します。 以下にサンプル コードを示します。

SFBShell::Instance()->CloseApplet(FALSE);

CloseApplet() 関数の引数の詳細については、BREW SDK のリファレンスを参照してください。 CloseApplet() 関数を呼び出すと、 SFEVT_APP_STOP イベントがやってきます。