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

9.7. ルート(基礎編)

ルート(SFZRoot)は、複数のレスポンダの木構造からなるレスポンダツリーの頂点に配置されるように設計されたレスポンダです。

SFYDistributer クラスや SFYRenderer クラスと協調し、 レスポンダツリーを構成する機能を提供します。

通常、1つのアプレットには1つのルートが含まれますが、 明示的に新しいレスポンダツリーを構築することで複数のルートを含むこともできます。

SFYApplication クラスを継承してアプレットを作成する場合、 SFYApplication クラスがデフォルトのルートを1つ保持します。

[Caution] 具象ルート: SFZRoot クラス

具象ルート(SFZRoot)はアプレット開発ですぐに使うことができる部品です。 SFZRoot を継承して利用する必要はありません。

表 9.7. 具象ルートの種類

クラス名 解説
SFZRoot ウィンドウ、ダイアログやメニューなどを配置する汎用ルートです。
[Important] 重要

すべてのルートにおいて、SFYResponder::SetDistributer 関数、SFYResponder::SetRenderer 関数、SFYResponder::SetState 関数、SFYResponder::SetRealBound 関数の呼び出しは必須です。

その他の関数は必要に応じて呼び出します。省略することも可能です。

9.7.1. ウィンドウ、ダイアログやメニューなどを配置する汎用ルート[SFZRoot]

図 9.27. 動作例

動作例

SFZRoot クラスは、 各種ウィンドウ、ダイアログやメニューを配置するための汎用的なルートとして機能します。

SFYApplication クラスを継承してアプレットを作成する場合、 SFYApplication クラスがデフォルトのルートを保持しているため、 明示的にルートを作成して操作する必要はありません。

SFCApplication クラスを継承してアプレットを作成する場合や 複数のレスポンダツリーを扱いたい場合は明示的にルートを操作する必要があります。

例 9.37. 宣言

SFMTYPEDEFCLASS(USRApplication)
class USRApplication : public SFCApplication {
    SFMSEALCOPY(USRApplication)
private:
    SFYDistributer _distributer;
    SFYRenderer _renderer;
    SFZRootSmp _root;

    ...
private:
    SFCError Make(Void);
    Bool Do(SFXEventConstRef event);
    Void Dispose(Void);
};

例 9.38. 実装 1

SFCError USRApplication::Make(Void)
{
    SFCError error(SFERR_NO_ERROR);

    // 配信エンジンを作成する
    error = _distributer.Initialize();
    if (error == SFERR_NO_ERROR) {

        // 描画エンジンを作成する
        // 引数 : レスポンダ空間(ここでは携帯電話の画面全体を指定している)
        error = _renderer.Initialize(SFXGraphics::GetDeviceRectangle());
        if (error == SFERR_NO_ERROR) {

            // ルートを作成する
            if ((_root = SFZRoot::NewInstance(&error)) != null) {

                // ルートに配信エンジンを登録する
                _root->SetDistributer(&_distributer);

                // ルートに描画エンジンを登録する
                _root->SetRenderer(&_renderer);

                // レスポンダ空間上にルートの実領域を設定する
                _root->SetRealBound(_root->GetSuitableBound());

                // ルートの状態を「可視+活性+操作可能+フォーカス」にまとめて設定する
                _root->SetState(true, true, true, true);
            }
        }
    }
    return error;
}

Bool USRApplication::Do(SFXEventConstRef event)
{
    SFCError error;
    Bool result(false);

    // レスポンダツリーにイベントを配信する
    error = _root->Distribute(event, &result);
    if (error == SFERR_NO_ERROR) {
        if (result) {
            if (IsRenderable()) {

                // レスポンダツリーを描画する
                error = _root->Render();
            }
        }
    }
    if (error != SFERR_NO_ERROR) {

        // イベント配信の失敗や描画の失敗など、
        // 致命的なエラーが発生したときの処理を記述する
    }
    return result;
}

Void USRApplication::Dispose(Void)
{
    // レスポンダツリー、描画エンジン、配信エンジンの順で終了処理を行い、リソースを解放する
    _root.Release();
    _renderer.Terminate();
    _distributer.Terminate();
    return;
}
[Note] レスポンダ空間

レスポンダ空間とは、 描画エンジンに関連付けられたレスポンダツリーを描画する画面上の矩形領域のことです。

SFYRenderer::Initialize 関数を利用して描画エンジンを初期化するときに設定します。

多くの場合、レスポンダ空間として画面の全領域を設定します。

大抵の場合は、上のコード例に出てくる USRApplication::Make 関数、USRApplication::Do 関数、USRApplication::Dispose 関数は、 それぞれ下記のコンストラクタ、イベントハンドラ、デストラクタから呼び出します。あるいは同等の記述を行います。

例 9.39. 実装 2

// コンストラクタ
USRApplication::USRApplication(Void)
{
    if (static_try()) {
 
        static_throw(Make());
 
        // その他の処理を記述する
 
    }
}

// イベントハンドラ
Bool USRApplication::HandleEvent(SFXEventConstRef event)
{
    SFCError    error;
    Bool        result(false);

    result = Do(event);
 
    // その他の処理を記述する
 
    return result;
}

// デストラクタ
USRApplication::~USRApplication(Void)
{
    Dispose();
 
    // その他の処理を記述する

}