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

9.8. アプリケーション

アプリケーションはレスポンダの一種でありすべてのレスポンダの 頂点に存在します。そのため大半のトレーサもアプリケーションに登録 されています。また、アプリケーションは SophiaFramework を用いた アプレット開発のメインとなる根幹部分です。

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_UPDATE の SRP16_UPDATE_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 e,VoidPtr r)

    {

      return(DemoPtr(r)->Key_handler(e));

    }

	

    inline Bool Key_handler(ConstSFUEventRef e)

    {

      // 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_UPDATE,SRP16_UPDATE_CONTENT,HANDLER_BEFORE,Update_static,this));

      }

      return;

    }

	

    virtual inline ~Demo(Void)

    {

      return;

    }

	

    static inline Bool Update_static(ConstSFUEventRef e,VoidPtr r)

    {

      DemoPtr(r)->Update_handler(SFUGraphicsPtr(e.P32()));

      return(TRUE);

    }

	

    inline Void Update_handler(SFUGraphicsPtr g)

    {

      SFUBrewPtr<SFBBitmap>  i;



      SFRApplication::ContentHandler(g);

      i = SFBShell::Instance()->LoadResBitmap("Demo.bar",1000);

      if (i != NULL) {

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