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

9.1. レスポンダシステムの概要

9.1.1. レスポンダシステムとは

レスポンダシステムとは、 レスポンダと呼ぶ GUI コンポーネントから構成される GUI フレームワークのことです。

レスポンダシステムには、 レスポンダレスポンダツリー親レスポンダ子レスポンダ姉妹レスポンダレスポンダ空間実領域仮想領域ローカル領域グローバル領域イベントトレーサハンドラ配信エンジン描画エンジンタイプIDリファレンスなどの構成要素があります。

レスポンダには、 ウィンドウメニューダイアログコントロールテーブルビュールートフレームなどの種類があります。

レスポンダシステムを利用すれば、 イベント処理状態透過属性・メモリの管理、 描画処理などの煩雑な処理が自動化されます。

SophiaFramework UNIVERSE 標準提供レスポンダクラスでは、 レスポンダの領域や状態、デザイン、内容などを変更したときに必要となる再描画は自動的に行われるように実装されています。

以下は、主な SophiaFramework UNIVERSE 標準提供レスポンダクラスの表です。

表 9.1. 主な SophiaFramework UNIVERSE 標準提供レスポンダクラス

クラス名 解説
SFYApplication アプリの中核となるアプリケーションクラスの雛型です。 このクラスを継承するアプリケーションクラスを 1 アプリにつき 1 つ実装する必要があります。
SFYResponder GUI コンポーネントの共通機能を実装するクラスです。 すべてのレスポンダはこのクラスを継承します。
SFZRoot ルートレスポンダとして設計されたレスポンダです。 ルートと呼ばれます。 SFYApplication クラスは、内部に 1 つだけルートを保持しています。
SFZContainer コントロールやコンテナなどを配置する汎用コンテナです。
SFZWindow コントロールやコンテナなどを配置する汎用ウィンドウです。
SFZDialog コントロールやコンテナなどを配置する汎用ダイアログです。
SFZMessageDialog 通知メッセージを表示するダイアログです。
SFZQuestionDialog 選択メッセージを表示するダイアログです。
SFZGridMenu グリッドメニューです。
SFZTextMenu テキストメニューです。
SFZFlexListMenu フレックスリストメニューです。
SFZTableView テーブルモデルを表形式で操作するためのレスポンダです。
SFZSingleTextLabelControl 単一行の編集不可能なテキストを表示するラベルコントロールです。
SFZSingleEditLabelControl 単一行の編集可能なテキストを表示するラベルコントロールです。
SFZMultipleTextLabelControl 複数行の編集不可能なテキストを表示するラベルコントロールです。
SFZMultipleEditLabelControl 複数行の編集可能なテキストを表示するラベルコントロールです。
SFZImageLabelControl イメージを表示するラベルコントロールです。
SFZSingleTextBoxControl 単一行の編集不可能なテキストを表示するボックスコントロールです。
SFZSingleEditBoxControl 単一行の編集可能なテキストを表示するボックスコントロールです。
SFZMultipleTextBoxControl 複数行の編集不可能なテキストを表示するボックスコントロールです。
SFZMultipleEditBoxControl 複数行の編集可能なテキストを表示するボックスコントロールです。
SFZImageBoxControl イメージを表示するボックスコントロールです。
SFZTextButtonControl テキストを表示するボタンコントロールです。
SFZImageButtonControl イメージを表示するボタンコントロールです。
SFZComboBoxControl コンボボックスコントロールです。
SFZListBoxControl リストボックスコントロールです。
SFZFlexListBoxControl フレックスリストボックスコントロールです。
SFZCheckboxControl チェックボックスコントロールです。
SFZRadiobuttonControl ラジオボタンコントロールです。
SFZTabControl タブコントロールです。
SFZTabPage タブコントロールのタブページです。
SFZScrollBarControl スクロールバーコントロールです。
SFZContainerScrollBarControl コンテナ専用スクロールバーコントロールです。
SFZSoftKeyControl ソフトキー コントロールです。
SFZWebBrowserControl 簡易ウェブブラウザコントロールです。
SFZPlainFrame プレーンフレームです。
SFZFlatFrame フラットフレームです。
SFZBevelFrame ベベルフレームです。
SFZTitlePlainFrame タイトル付きプレーンフレームです。
SFZTitleFlatFrame タイトル付きフラットフレームです。
SFZTitleBevelFrame タイトル付きベベルフレームです。
SFYImageWidget イメージを表示するウィジェットです。
SFYSingleTextWidget 単一行の編集不可能なテキストを表示するウィジェットです。
SFYSingleEditWidget 単一行の編集可能なテキストを表示するウィジェットです。
SFYMultipleTextWidget 複数行の編集不可能なテキストを表示するウィジェットです。
SFYMultipleEditWidget 複数行の編集可能なテキストを表示するウィジェットです。
SFYWebBrowserWidget 簡易ウェブブラウズ機能を提供するウィジェットです。
[Note] 抽象レスポンダクラス

SophiaFramework UNIVERSE では、 SFZ で始まる名前の具象レスポンダクラス以外に、 ユーザー定義レスポンダを作成するときに起点となる、 SFY で始まる名前の各種抽象レスポンダクラスも標準提供されます。

ただし、SFYImageWidget / SFYSingleTextWidget / SFYSingleEditWidget / SFYMultipleTextWidget / SFYMultipleEditWidget / SFYWebBrowserWidget の各クラスの名前は SFY で始まりますが、これらは抽象レスポンダクラスではなく具象レスポンダクラスです。

参照: カテゴリ別クラスリファレンス: SFY レスポンダシステム

[Important] SFYApplication クラス

SFYApplication クラスは SFYResponder クラスを継承していませんが、 領域やハンドラの処理などのレスポンダ操作を行えます。 レスポンダ操作は SFYApplication クラスが内部に保持するルートSFZRoot)に委譲されて実行されます。

9.1.2. レスポンダシステムの使い方

レスポンダシステムを利用したアプリ開発では、 最初に SFYApplication クラスを継承したアプリケーションクラスを 1 つ定義します。

AppWizard を利用してプロジェクトを作成する場合、 GUI フレームワークの選択画面で『使用する(SFY バージョン)』オプションを選択すると、 SFYApplication クラスを継承したアプリケーションクラスが 1 つ生成されます。

[Caution] 大文字アルファベットを含むアプリケーションクラス名(BREW 4.0 から)

一般に、アプリケーションクラス名はアプリ本体と同じ名前にします。

BREW 4.0 からアプリの名前に大文字アルファベットが使えなくなりました。

"HelloWorld" や "USRApplication" などアプリケーションクラスの名前に大文字アルファベットを使う場合、 "helloworld" や "usrapplication" などのように大文字アルファベットを小文字アルファベットに変換してアプリ名にする必要があります。

アプリケーションクラス(ルート)内にウィンドウを作成するコードは以下の通りです。

例 9.1. ウィンドウの作成

SFCError USRApplication::MakeWindow(Void)
{
    SFZWindowSmp window;
    SFCError error(SFERR_NO_ERROR);

    // ...(省略)...

    // ウィンドウのインスタンスを生成する
    if ((window = SFZWindow::NewInstance(&error)) != null) {

        // ウィンドウの親レスポンダを USRApplication アプリケーションクラスが保持するルートに設定する
        // ※SFYApplication::GetThis() により USRApplication アプリケーションクラスが保持するルートを取得する
        error = window->SetParent(GetThis());
        if (error == SFERR_NO_ERROR) {

            // ウィンドウの実領域をルートのローカル領域から (10, 10) だけ Deflate した矩形に設定する
            // ※ルートのローカル領域はデフォルトでデバイス画面領域に初期化されている
            window->SetRealBound(GetLocalBound().Deflate(10, 10));

            // ウィンドウの状態を「可視+活性+操作可能+フォーカス」にまとめて設定する
            window->SetState(true, true, true, true);

            // ウィンドウを最前面に移動する
            window->ToFront();
        }
    }

    // ...(省略)...
}
[Tip] ウィンドウを作成する手順
  1. SFZWindow::NewInstance 関数を呼び出して SFZWindow のインスタンス(以下、ウィンドウ)を生成します。
  2. SFYResponder::SetParent 関数を呼び出して、 既に配置されているレスポンダまたはアプリケーションクラス[ルートSFZRoot)]をウィンドウの親レスポンダとして設定します。
  3. SFYResponder::SetRealBound 関数を呼び出して親レスポンダのローカル領域にウィンドウの実領域を設定します。
  4. SFYResponder::SetState 関数を呼び出してウィンドウの状態を設定します。
  5. SFYResponder::ToFront 関数を呼び出して子レスポンダと一緒にウィンドウを最前面に配置します。

参照: SFZWindow | SFYResponder::GetThis | SFYResponder::GetSuitableBound | SFYResponder::GetLocalBound | SFXRectangle::Deflate

ウィンドウ内にテキストボタンコントロールを作成するコードは以下の通りです。

例 9.2. テキストボタンコントロールの作成

SFCError USRApplication::MakeTextButtonControl(Void)
{
    SFZWindowSmp window;
    SFZTextButtonControlSmp button;
    SFCError error(SFERR_NO_ERROR);

    // ...(省略)...

    // テキストボタンコントロールのインスタンスを生成する
    if ((button = SFZTextButtonControl::NewInstance(&error)) != null) {

        // テキストボタンコントロールの親レスポンダをウィンドウに設定する
        error = button->SetParent(window);
        if (error == SFERR_NO_ERROR) {

            // テキストボタンコントロールのラベルを "hello world" に設定する
            error = button->SetText("hello world");
            if (error == SFERR_NO_ERROR) {

                // ウィンドウのローカル領域内にテキストボタンコントロールを表示するのに最適なサイズを確保し、開始点を(10, 10)に設定する
                button->SetRealBound(button->GetSuitableBound().SetOrigin(10, 10));

                // テキストボタンコントロールの状態を「可視+活性+操作可能+フォーカス」にまとめて設定する
                button->SetState(true, true, true, true);
            }
        }
    }

    // ...(省略)...
}
[Tip] テキストボタンコントロールの作成する手順
  1. SFZTextButtonControl::NewInstance 関数を呼び出して SFZTextButtonControl のインスタンス(以下、テキストボタンコントロール)を生成します。
  2. SFYResponder::SetParent 関数を呼び出して既に配置されているレスポンダをテキストボタンコントロールの親レスポンダとして設定します。
  3. SFZTextButtonControl::SetText 関数を呼び出してテキストボタンコントロールのラベル項目を設定します。
  4. SFYResponder::SetRealBound 関数を呼び出して親レスポンダのローカル領域にテキストボタンコントロールの実領域を設定します。
  5. SFYResponder::SetState 関数を呼び出してテキストボタンコントロールの状態を設定します。
[Important] ToFront 関数

コントロールは配置されるウィンドウやダイアログ、コンテナなどの親レスポンダが最前面に移動しない限り、 最前面に移動しません。

親レスポンダの SFYResponder::ToFront 関数を呼び出すと、 親レスポンダと一緒に子レスポンダであるコントロールも自動的に最前面に移動します。

参照: SFZWindow | SFZTextButtonControl | SFYResponder::GetSuitableBound | SFXRectangle::SetOrigin

テキストボタンコントロールを操作すると、 デバッグ出力に文字列を表示するコードは以下の通りです。

例 9.3. テキストボタンコントロールの使い方

SFZTextButtonControlSmp button;
SFCError error(SFERR_NO_ERROR);

// ...(省略)...

// テキストボタンコントロールに OnResult 結果ハンドラを登録する
error = button->RegisterHandler(
    SFXEventRange(SFEVT_RESPONDER_RESULT, SFEVT_RESPONDER_RESULT, SFP16_BEGIN, SFP16_END),
    XANDLER_INTERNAL(OnResult)
);

// ...(省略)...


// OnResult 結果ハンドラの実装
XANDLER_IMPLEMENT_VOIDRESULT(USRApplication, OnResult, invoker, reason, result)
{
    // デバッグウィンドウに "Text button control has been pushed." と表示する
    TRACE("Text button control has been pushed.");

    return;
}
[Note] 結果ハンドラの登録と実装

SFYResponder::RegisterHandler 関数を使用して結果イベントハンドラ(結果ハンドラ)をテキストボタンコントロールに登録します。

結果イベントを受信するハンドラ(結果ハンドラ)は XANDLER_IMPLEMENT_VOIDRESULT マクロを利用して実装します。

※操作されると、テキストボタンコントロールは結果イベントを受信します。

以上のように、 ウィンドウ内にテキストボタンコントロールなどのコントロールを作成し、 コントロールの結果ハンドラを実装・登録するだけで GUI アプリを作成できます。

9.1.3. レスポンダシステムの構造

SFYApplication クラスは、 ウィンドウダイアログメニューコントロールフレームなどのレスポンダから階層的に構成される、 レスポンダツリールートレスポンダとして、 デフォルトのルートSFZRoot)を 1 つ保持します。

SFY レスポンダシステムでは、 SFYApplication クラスが内部で保持するルートがウィンドウやダイアログ、メニューを管理し、 ウィンドウやダイアログがコントロールを管理するという階層構造になっています。

ウィンドウ、ダイアログ、メニューは同一階層に存在します。

コンテナはコントロールや 他のコンテナ(コンテナのみ)を管理したり、 コントロールや他のコンテナ(コンテナ・ウィンドウ・ダイアログ)に管理されることが可能な変則的な設計になっています。

[Important] フレーム

タイトルや余白、枠線を備えたフレームをウィンドウやダイアログ、 メニューに装着することが可能です。

図 9.1. 所有関係

所有関係
[Note] SFYApplication クラスが内部で保持するルート

SFYApplication::SFYApplication コンストラクタの処理により、 SFYApplication クラスが内部で保持するルートSFZRoot)には、 初期化された配信エンジン描画エンジンが自動的に関連付けれらます。

その結果、ルートを頂点とするレスポンダツリーを構築するだけで、 レスポンダツリーへのイベント配信と各レスポンダの再描画は自動的に行われます。

SFYApplication クラスを継承するアプリケーションクラスに対するレスポンダ操作は、 すべてルートに委譲されて実行されます。

※ アプリケーションクラスに複数のルートを保持させることも可能ですが、 一般的なアプリ開発ではその必要性はほとんどありません。

すべてのレスポンダのクラスは SFYResponder クラスを継承します。

図 9.2. 継承関係

継承関係