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

9.9. コンテナ(応用編)

コンテナとスクロールバーコントロールの連携などについて解説します。

9.9.1. コンテナとスクロールバーコントロールを連携させる

図 9.29. 動作例(左:スクロール前、右:スクロール後)

動作例(左:スクロール前、右:スクロール後)

コンテナ内部の仮想領域のスクロール量と外部のスクロールバーコントロールなどを連携させることができます。

例 9.44. 宣言

SFMTYPEDEFRESPONDER(USRWindow)
class USRWindow : public SFZWindow {
    SFMSEALRESPONDER(USRWindow)
    SFMRESPONDERINSTANTIATEFOUR(USRWindow, SFZWindow, SFYContainer, SFYWidget, SFYResponder)
private:
    SFZContainerSmp _container;
    SFZScrollBarControlSmp _scrollbar;

    ...
private:
    SFCError Make(Void);

    // コンテナ用の実領域変更時のハンドラ
    XANDLER_DECLARE_VOIDBOUND(OnBoundReal)

    // コンテナ用の仮想領域変更時のハンドラ
    XANDLER_DECLARE_VOIDBOUND(OnBoundVirtual)
};

例 9.45. 実装

SFCError USRWindow::Make(Void)
{
    SFXRectangle rectangle;
    SFCError error(SFERR_NO_ERROR);

    // コンテナを作成する
    if ((_container = SFZContainer::NewInstance(&error)) != null) {

        // コンテナの親レスポンダを USRWindow に設定する
        error = _container->SetParent(GetThis());
        if (error == SFERR_NO_ERROR) {

            // コンテナに実領域変更時のハンドラを登録する
            error = _container->RegisterHandler(
                SFXEventRange(SFEVT_RESPONDER_BOUND, SFEVT_RESPONDER_BOUND, SFP16_BOUND_REAL, SFP16_BOUND_REAL),
                XANDLER_INTERNAL(OnBoundReal)
            );
            if (error == SFERR_NO_ERROR) {

                // コンテナに仮想領域変更時のハンドラを登録する
                error = _container->RegisterHandler(
                    SFXEventRange(SFEVT_RESPONDER_BOUND, SFEVT_RESPONDER_BOUND, SFP16_BOUND_VIRTUAL, SFP16_BOUND_VIRTUAL),
                    XANDLER_INTERNAL(OnBoundVirtual)
                );
                if (error == SFERR_NO_ERROR) {
                    // コンテナの背景色を薄赤色に設定する
                    // 背景色の描画は SFYWidget クラスが自動的に行ってくれる
                    _container->SetBackgroundColor(SFXRGBColor(0xFF, 0xCC, 0xCC, 0x00));

                    // コンテナの実領域を計算して設定する(スクロールバーの幅の分だけ右側を小さくしている)
                    rectangle.Set(GetLocalBound().Deflate(10, 10, 19, 10));
                    _container->SetRealBound(_container->GetSuitableBound(rectangle));

                    // コンテナの仮想領域を下に 100 ピクセルだけ拡張して設定する
                    _container->SetVirtualBound(SFXRectangle(_container->GetVirtualBound()).AddBottom(100));

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

                    // スクロールバーコントロールを作成する
                    if ((_scrollbar = SFZScrollBarControl::NewInstance(&error)) != null) {

                        // スクロールバーコントロールの親レスポンダを USRWindow に設定する
                        error = _scrollbar->SetParent(GetThis());
                        if (error == SFERR_NO_ERROR) {
                            _scrollbar->SetState(true, true, false, false);

                            // スクロールバーコントロールの実領域を計算して設定する
                            rectangle.Set(_container->GetRealBound());
                            rectangle.SetLeft(rectangle.GetRight());
                            rectangle.SetWidth(9);
                            _scrollbar->SetRealBound(_scrollbar->GetSuitableBound(rectangle));

                            // スクロールバーコントロールをコンテナに結びつける
                            _scrollbar->Bind(_container);
                        }
                    }
                }
            }
        }
    }
    return error;
}