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

9.9. ルート(応用編)

9.9.1. レスポンダ空間をカスタマイズする方法(フルスクリーンモード)

レスポンダツリーを描画するための レスポンダ空間は、 描画エンジンをルート(SFZRoot)に接続する直前に呼び出す SFYRenderer::Initialize 関数の引数に指定します。

携帯電話の画面領域全体にレスポンダツリーを描画するには、 以下のサンプルコードのように SFBDisplay::SetPrefs 関数を使用してフルスクリーンモードの設定をしてから、 画面の矩形領域を引数に指定して SFYRenderer::Initialize 関数を呼び出します。

例 9.48. レスポンダ空間にフルスクリーン領域を設定する

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

    // テキスト入力コントロールエディタを作成する
    if ((_editor = ::new SFXEditor) != null) {

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

            // SFBDisplay インスタンスを取得する
            if ((graphics = SFXGraphics::GetInstance()) != null) {
                display = graphics->GetSFBDisplay();

                // 表示画面サイズを変更する (ピクト行:表示、画面の高さ:最大[フルスクリーン])
                if ((error = display->SetPrefs("a:1,w:*,h:*")) == SFERR_NO_ERROR) {

                    // SFBDisplay インスタンスのクリッピング矩形領域をリセットする
                    // ※クリッピング矩形領域外での描画処理は画面上に表示されない
                    display->ResetClipRect();

                    // 描画エンジンを初期化する
                    // ※1. 引数に指定した「携帯電話の画面領域(フルスクリーン領域)」をレスポンダ空間として設定している
                    // ※2. SFXGraphics::GetDeviceRectangle() は SFBDisplay::SetPrefs() で設定したフルスクリーン領域を返す
                    error = _renderer.Initialize(SFXGraphics::GetDeviceRectangle());
                    if (error == SFERR_NO_ERROR) {

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

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

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

                            // ルートの実領域をレスポンダ空間[携帯電話の画面領域(フルスクリーン領域)]に設定する
                            // ※1. 親レスポンダが存在しないルートはレスポンダ空間内に実領域を設定する
                            // ※2. _root->GetSuitableBound() はレスポンダ空間(=「携帯電話の画面領域(フルスクリーン領域)」)を返す
                            // ※3. ルートの実領域は「携帯電話の画面領域(フルスクリーン領域)」に設定される
                            _root->SetRealBound(_root->GetSuitableBound());

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

        error = SFERR_NO_MEMORY;
    }

    return error;
}

[Note] 注意

ウィンドウ、ダイアログ、メニューを配置する汎用ルート[SFZRoot]の実装コードと異なる点は太字の部分だけです。

[Note] レスポンダ空間

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

レスポンダ空間は、描画エンジンを初期化する SFYRenderer::Initialize 関数を使用して設定します。 この初期化の後、レスポンダ空間は動的に拡大したり、縮小することはできません。

デフォルトでは、レスポンダ空間は端末の全画面の矩形領域に設定されます。

[Important] mif ファイルの設定など

SFBDisplay::SetPrefs 関数を利用するには、 mif ファイルの AEEPRIVID_DISPSETTINGS 特権の設定が必要です。 この特権は、mif エディタで「依存ファイル」のタブを選択し、BREW SDK のインクルードファイルに含まれている外部クラス 「DISPSETTINGS (0x0103081D)」 を追加する必要があります。

なお、フルスクリーンモードはシミュレータでは対応していません(2010年1月14日現在)。動作確認は実機で行う必要があります。 また、フルスクリーンモードに対応していない機種も存在します。

全体のサンプルコードはこちら ( fullscreen.zip: 40.3kb ) にあります。

■SFYApplication を継承するアプリケーションクラスのフルスクリーン対応

SFYApplication がデフォルトで保持するルート(SFZRoot)のレスポンダ空間をフルスクリーン対応にするには、 以下のコードをアプリケーションクラスのコンストラクタに追加します。

全体のサンプルコードはこちら ( fullscreen_sfy.zip: 40.1kb ) にあります。

例 9.49. SFYApplication を継承するアプリケーションクラスのフルスクリーン対応

// アプリケーションクラスのコンストラクタ
USRApplication::USRApplication(Void) static_throws
{
    SFXGraphicsPtr  graphics;
    SFBDisplaySmp   display;
    SFBBitmapSmp    bitmap;
    AEEBitmapInfo   info = {0};
    SFYRendererPtr  _renderer;
    SFZRootSmp      _root;
    SFCError        error(SFERR_NO_ERROR);

    // レスポンダシステムの初期化

    // SFXGraphics インスタンスを取得する
    if ((graphics = SFXGraphics::GetInstance()) != null) {

        // SFBDisplay インスタンスを取得する
        display = graphics->GetSFBDisplay();

        // 表示画面サイズを変更する (ピクト行:表示、画面の高さ:最大[フルスクリーン])
        if ((error = display->SetPrefs("a:1,w:*,h:*")) == SFERR_NO_ERROR) {

            // SFBDisplay インスタンスのクリッピング矩形領域をリセットする
            // ※クリッピング矩形領域外での描画処理は画面上に表示されない
            display->ResetClipRect();

            // 携帯画面のビットマップを取得する
            if ((bitmap = display->GetDeviceBitmap()) != null) {

                // 携帯画面のビットマップのサイズを取得する
                bitmap->GetInfo(&info);

                // 描画エンジンを取得する
                if ((_renderer = GetRenderer()) != null) {

                    // 描画エンジンを初期化する
                    // ※引数に指定した「携帯電話の画面領域(フルスクリーン領域)」をレスポンダ空間として設定している
                    _renderer->Initialize(SFXRectangle(0, 0, static_cast<SInt16>(info.cx), static_cast<SInt16>(info.cy)));

                    // ルートを取得する
                    if ((_root = static_pointer_cast<SFZRoot>(GetRoot())) != null) {

                        // ルートの実領域をレスポンダ空間[携帯電話の画面領域(フルスクリーン領域)]に設定する
                        // ※1. 親レスポンダが存在しないルートはレスポンダ空間内に実領域を設定する
                        // ※2. _root->GetSuitableBound() はレスポンダ空間(=「携帯電話の画面領域(フルスクリーン領域)」)を返す
                        // ※3. ルートの実領域は「携帯電話の画面領域(フルスクリーン領域)」に設定される
                        _root->SetRealBound(_root->GetSuitableBound());
                    }
                }
            }
        }
    }

    // その他、初期化処理を記述する

    return error;
}