前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework 4.1

8.1. 基本構造と処理概要

HelloWorld アプリの基本的なプログラム構造と起動から終了までの処理手順を説明します。

図 8.1. HelloWorld アプリ

HelloWorld アプリ

例 8.1. Hello World アプリ : .hpp ファイル ( クラスの定義 )

//
//      HelloWorld.hpp
//
//      This source code was automatically
//      generated by SophiaFramework 4.1.
//

#ifndef __HELLOWORLD_HPP
#define __HELLOWORLD_HPP

#include <SophiaFramework.hpp>
#include "HelloWorld.bid"

SFMTYPEDEFCLASS(HelloWorld)
class HelloWorld : public SFRApplication {
    SFMSEALCOPY(HelloWorld)
public:
    static SFCInvokerPtr Factory(Void);
private:
    HelloWorld(Void) static_throws;
    virtual ~HelloWorld(Void);
    HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
};

#endif // __HELLOWORLD_HPP //

GUI フレームワークを使う HelloWorld アプリ クラスは SFRApplication を継承します。

[Note] 注意

GUI フレームワークを使わない場合は SFCApplication を継承します。

SFMTYPEDEFCLASSマクロはユーザー定義型に対する便利な型名を自動生成するマクロ関数です。

アプリ クラスのインスタンスはコピーできないので、 SFMSEALCOPY マクロ関数を使ってインスタンスのコピーを禁止します。

HelloWorld アプリ クラスには、ファクトリ関数、コンストラクタ、デストラクタ、描画ハンドラを定義します。

例 8.2. Hello World アプリ : .cpp ファイル ( ブート ローダとファクトリ関数の実装、ハンドラの実装と登録 )

//
//      HelloWorld.cpp
//
//      This source code was automatically
//      generated by SophiaFramework 4.1.
//

#include "HelloWorld.hpp"

// ブート ローダ
SFCApplet::FactorySPP SFCApplet::Boot(AEECLSID id, SFXAnsiStringPtr license)
{
    *license = "heap://";

    return (id == AEECLSID_HELLOWORLD) ? (&HelloWorld::Factory) : (null);
}

// ファクトリ関数
SFCInvokerPtr HelloWorld::Factory(Void)
{
    return ::new HelloWorld;
}

// コンストラクタ
HelloWorld::HelloWorld(Void) static_throws
{
    if (static_try()) {
        static_throw(RegisterHandler(SREVT_RESPONDER_RENDER, 
                                     SRP16_RENDER_CONTENT, 
                                     HANDLER_BEFORE, 
                                     HANDLER_FUNCTION(OnRenderContent)));
    }
    return;
}

// デストラクタ
HelloWorld::~HelloWorld(Void)
{
    return;
}

// 描画ハンドラ
HANDLER_IMPLEMENT_VOIDRENDER(HelloWorld, OnRenderContent, graphics)
{
    // 文字列 "Hello World" を画面に描画する
    graphics->DrawText("Hello World", GetContentWorld());
    return;
}

SophiaFramework アプリの実行は、「ブートローダ」と呼ばれる SFCApplet::Boot 関数から開始します。 この関数では、ライセンス コードの設定と起動 ClassID に応じたファクトリ関数を返します。 ファクトリ関数は HelloWorld アプリ クラスのインスタンスを生成します。

ヘッダコードにある HANDLER_DECLARE_VOIDRENDER(OnRenderContent) は、"Hello World" を描画するための描画ハンドラを宣言するマクロ関数です。

コンストラクタで、RegisterHandler 関数を使って描画イベントに描画ハンドラを登録します。 描画ハンドラは、HANDLER_IMPLEMENT_VOIDRENDER(HelloWorld, OnRenderContent, graphics) マクロ関数によって実装します。

描画ハンドラの中では DrawText 関数を用いて文字列 "Hello World" を描画します。 graphics 変数は SFXGraphics クラスへのポインターです。 あるイベントに対するハンドラを子クラスで実装すると、親クラスの同じイベントに対するハンドラは呼び出されなくなります。 このとき、親クラスのハンドラを呼び出すには以下のように記述します。

例 8.3. 子クラスで親クラスのハンドラを呼び出す方法

HANDLER_IMPLEMENT_VOIDRENDER(HelloWorld, OnRenderContent, graphics)
{
    // 親クラスの描画ハンドラを呼び出す
    SFRApplication::ContentHandler(graphics);

    // 画面に描画する
    graphics->DrawText("Hello World", 
                       GetContentWorld(), 
                       SFXRGBColor(0x00, 0x00, 0x00, 0x00));
    return;
}

上記コードでは、画面全体を白色に初期化する SFRApplicationクラス ( HelloWorld アプリ クラスの親クラス ) の描画ハンドラ ContentHandler(graphics) を呼び出してから、文字の色を黒に設定して、文字列 "Hello World" を描画しています。

コンストラクタで使用している static_try 関数や static_throw 関数は、 コンストラクタで発生したエラー値を検証するための関数とエラー値を設定するための関数です。 設定されたエラー値は static_catch 関数で取得します。 通常、static_catch 関数はエラー値を throw するクラスを利用する側で使います。

例 8.4. static_catch() の使い方

// エラー値をキャッチしてエラー処理するコード
helloworld = ::new HelloWorld();
switch( helloworld->static_catch() ){

        // エラー値に応じた処理をする

};

static_exception クラスはエラー値を管理する変数を持っています。 この変数はテンプレート型で通常 SFCError 型が利用されます。 static_exception クラスの存在意義は、コンストラクタやオペレータでのエラー値を外部に搬出する、一般的な規約を制定する点にあります。