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

9.10. ウィンドウ(基礎編)

ウィンドウは、ルート内に配置されるように設計されたレスポンダです。

すべてのウィンドウは SFZWindow クラスを継承し、実領域よりも大きく設定された仮想領域のスクロール機能とフォーカスの移動機能を提供します。

コントロールを利用するすべてのアプレットは、コントロールを配置するためのコンテナとしてウィンドウを利用します。

また、コントロールを利用するしないにかかわらず、具体的なユーザーインターフェースはアプリケーションクラスに直接記述せずにウィンドウに記述します。

具象ウィンドウはアプレット開発ですぐに使うことができる部品であり、抽象ウィンドウはカスタマイズされたユーザー定義ウィンドウを作成するための起点となります。

表 9.11. 具象ウィンドウの種類

クラス名 解説
SFZWindow コントロールやコンテナなどを配置する汎用ウィンドウです。
SFZDialog コントロールやコンテナなどを配置する汎用ダイアログです。

表 9.12. 抽象ウィンドウの種類

クラス名 解説
SFZWindow ウィンドウを表す抽象クラスです。
SFZDialog ダイアログを表す抽象クラスです。
[Important] 重要

すべてのウィンドウにおいて、SFYResponder::SetParent 関数、SFYResponder::SetState 関数、SFYResponder::SetRealBound 関数の呼び出しは必須です。

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

9.10.1. コントロールやコンテナなどを配置する汎用ウィンドウ [SFZWindow]

図 9.30. 動作例

動作例

SFZWindow クラスは、 各種コントロールやコンテナを配置するための汎用的なウィンドウとして機能します。

コントロールやコンテナが配置されている場合、上下キーでフォーカスの移動機能を利用できます。

仮想領域が実領域よりも大きく設定されている場合、フォーカスの移動機能と連動した、仮想領域の上下方向へのスクロール機能を利用できます。

例 9.46. 宣言

SFMTYPEDEFCLASS(USRApplication)
class USRApplication : public SFYApplication {
    SFMSEALCOPY(USRApplication)
private:
    SFZWindowSmp _window;

    ...
private:
    SFCError Make(Void);
};

例 9.47. 実装

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

    // ウィンドウを作成する
    if ((_window = SFZWindow::NewInstance(&error)) != null) 

        // ウィンドウの親レスポンダを USRApplication に設定する
        error = _window->SetParent(GetThis());
        if (error == SFERR_NO_ERROR) {

            // ウィンドウの背景色を薄緑色に設定する
            // 背景色の描画は SFYWidget クラスが自動的に行ってくれる
            _window->SetBackgroundColor(SFXRGBColor(0xCC, 0xFF, 0xCC, 0x00));

            // ウィンドウの実領域を計算して設定する
            _window->SetRealBound(_window->GetSuitableBound(GetLocalBound().Deflate(10, 10)));

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

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

9.10.2. ウィンドウを表す抽象クラスとしての汎用ウィンドウ [SFZWindow]

SFZWindow クラスは、 各種ウィンドウを実装するための起点となります。

このクラスは、いくつかの仮想関数のデフォルトの動作を実装します。

複雑な機能を持ったウィンドウを作成する場合、汎用ウィンドウを継承して利用する方が開発が容易になることがあります。

表 9.13. 仮想関数名とデフォルトの動作

仮想関数名 デフォルトの動作 オーバーライド
SFYContainer::HandleScrollUpKey 仮想領域を上方向にスクロール※1 任意
SFYContainer::HandleScrollDownKey 仮想領域を下方向にスクロール※2 任意
SFYContainer::HandlePageUpKey 仮想領域を上方向に1ページ分スクロール※3 任意
SFYContainer::HandlePageDownKey 仮想領域を下方向に1ページ分スクロール※4 任意
SFYContainer::HandleSnapUpKey 仮想領域を上端までスクロール※5 任意
SFYContainer::HandleSnapDownKey 仮想領域を下端までスクロール※6 任意
SFYWidget::HandleBoundRequest 推奨
SFYWidget::HandleBoundOptimize 推奨
SFYWidget::HandleBoundReal 任意
SFYWidget::HandleBoundVirtual 任意
SFYWidget::HandleBoundGlobal 任意
SFYWidget::HandleRenderRequest 任意
[Note] 注釈

※1.ScrollUp() を実行します。

※2.ScrollDown() を実行します。

※3.PageUp() を実行します。

※4.PageDown() を実行します。

※5.SnapUp() を実行します。

※6.SnapDown() を実行します。

以下にユーザー定義ウィンドウを作成するときに最低限必要なコードを示します。

例 9.48. 宣言

SFMTYPEDEFRESPONDER(USRWindow)
class USRWindow : public SFZWindow {
    SFMSEALRESPONDER(USRWindow)
    SFMRESPONDERINSTANTIATEFOUR(USRWindow, SFZWindow, SFYContainer, SFYWidget, SFYResponder)
public:

    // レスポンダのタイプを定義する
    // 小文字と記号のみからなるタイプは予約されているので使えない
    enum CodeEnum {
        CODE_TYPE = four_char_code('U', 'W', 'N', 'D')
    };
    SFMTYPEDEFTYPE(CodeEnum)

public:
    static USRWindowSmp NewInstance(SFCErrorPtr exception = null);
protected:
    explicit USRWindow(Void) static_throws;
    virtual ~USRWindow(Void);

    // 親クラスで定義されている仮想関数のうち、実装が推奨される仮想関数
    virtual Void HandleBoundRequest(SFXRectanglePtr rectangle) const;
    virtual Void HandleBoundOptimize(SFXRectanglePtr rectangle) const;
    virtual Void HandleBoundReal(Void);
    virtual Void HandleBoundVirtual(Void);
    virtual Void HandleRenderRequest(SFXGraphicsPtr graphics) const;
};

例 9.49. 実装

// コンストラクタ
USRWindow::USRWindow(Void) static_throws
{
    if (static_try()) {

        // レスポンダのタイプを設定する
        SetType(CODE_TYPE);

        // 初期化処理を記述する
    }
}

// デストラクタ
USRWindow::~USRWindow(Void)
{
    // 終了処理を記述する
}

// スマートポインタで管理されるインスタンスを生成する関数
USRWindowSmp USRWindow::NewInstance(SFCErrorPtr exception)
{
    return static_pointer_cast<USRWindow>(Factory(::new USRWindow, exception));
}

Void USRWindow::HandleBoundRequest(SFXRectanglePtr rectangle) const
{
    // ウィンドウに最適な大きさを計算して rectangle パラメータに設定する
    // 原点は変更せず、サイズだけを設定することを推奨

    return;
}

Void USRWindow::HandleBoundOptimize(SFXRectanglePtr rectangle) const
{
    // ウィンドウに最適な大きさを rectangle パラメータ内の大きさに
    // 収まるように計算し、rectangle パラメータに設定する
    // 原点は変更せず、サイズだけを設定することを推奨

    return;
}

Void USRWindow::HandleBoundReal(Void)
{
    // 実領域が変更された場合に再計算が必要なものがあれば、ここに記述する
    return;
}

Void USRWindow::HandleBoundVirtual(Void)
{
    // 仮想領域が変更された場合に再計算が必要なものがあれば、ここに記述する
    return;
}

Void USRWindow::HandleRenderRequest(SFXGraphicsPtr graphics) const
{
    // ウィンドウを描画する
    return;
}