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

9.12. コンテナ(応用編)

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

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

コンテナのスクロールとスクロールバーコントロールを連携させることができます。

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

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

例 9.56. 宣言

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

    // ...(省略)...
private:
    SFCError Make(Void);
};

例 9.57. 実装

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) {

            // コンテナの背景色を薄赤色に設定する
            // ※コンテナの背景は SFYWidget::OnRenderRequest ハンドラによって描画される
            _container->SetBackgroundColor(SFXRGBColor(0xFF, 0xCC, 0xCC, 0x00));

            // コンテナの実領域を設定する
            // ※ルートのローカル領域を (10, 10) だけ Deflate し、
            //   スクロールバーの幅の分だけ右側を小さくした領域に設定する
            rectangle.Set(GetLocalBound().Deflate(10, 10));
            rectangle.SubWidth(9);
            _container->SetRealBound(rectangle);

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

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

            // コンテナ専用スクロールバーコントロールを作成する
            if ((_bar = SFZContainerScrollBarControl::NewInstance(&error)) != null) {

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

                    _bar->SetState(true, true, false, false);

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

                    // スクロールバーコントロールをコンテナに関連付ける
                    _bar->Bind(_container);
                }
            }
        }
    }

    return error;
}