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

3.7. ダイアログ

3.7.1. メッセージダイアログ

下図のメッセージダイアログ(SFZMessageDialog)を作成します。

図 3.28. メッセージダイアログ

メッセージダイアログ

ダイアログは、 テキストメニューの項目を操作した(実際に選択した)ときに表示されます。 選択した項目の配色がダイアログに適用されます。

ダイアログを作成するための関数を定義します。

例 3.49. ダイアログを作成するための関数の定義

// helloworld アプリケーションクラスの定義
SFMTYPEDEFCLASS(helloworld)  //  便利な型を生成するマクロ
class helloworld : public SFYApplication {

    SFMSEALCOPY(helloworld)  // インスタンスのコピーを禁止するマクロ
private:
    MyWindowSmp _myWindow;
    SFZTextMenuSmp _textMenu;
public:
    static SFCInvokerPtr Factory(Void);
private:
    explicit helloworld(Void) static_throws;
    virtual ~helloworld(Void);
    SFCError MakeMy(Void);
    SFCError MakeMenu(Void);
    Void SetMenuColors(UserColorConstRef color);

    // *** 太字が追加部分

    // メッセージダイアログを作成する関数
    SFCError MakeColorDialog(UserColorConstRef color);

    XANDLER_DECLARE_VOIDRENDER(OnRenderRequest)  // 描画ハンドラ
    XANDLER_DECLARE_BOOLEVENT(OnKey)             // キーハンドラ
    XANDLER_DECLARE_VOIDRESULT(OnMenuResult)     // 結果ハンドラ
};

// メッセージダイアログを作成する関数
SFCError helloworld::MakeColorDialog(UserColorConstRef color)
{
    SFZMessageDialogSmp dlg;
    SFCError error(SFERR_NO_ERROR);

    // メッセージダイアログを作成する
    if ((dlg = SFZMessageDialog::NewInstance(&error)) != null) {

        // メッセージダイアログの親をアプリケーションクラス(ルート)に設定する
        error = dlg->SetParent(GetThis());

        if (error == SFERR_NO_ERROR) {

            // メッセージダイアログのメッセージを "Color Changed." に設定する
            error = dlg->SetMessageText("Color Changed.");

            if (error == SFERR_NO_ERROR) {

                // メッセージダイアログのボタンコントロールのテキストラベルを "OK" に設定する
                error = dlg->SetButtonText("OK");

                if (error == SFERR_NO_ERROR) {

                    // 背景色を設定する
                    dlg->SetBackgroundColor(color.selBack);

                    // メッセージの色を設定する
                    dlg->GetMessage()->SetTextColor(color.selFore);

                    // メッセージを中央寄せする
                    dlg->GetMessage()->SetHorizontalAlign(SFZMultipleTextLabelControl::DEFAULT_HORIZONTAL);

                    // ボタンコントロールの色を設定する
                    dlg->GetButton()->SetButtonColor(SFXBevelColor(color.light, color.base, color.dark));

                    // ボタンコントロールのテキストラベルの色を設定する
                    dlg->GetButton()->SetTextColor(color.itemFore);

                    // 携帯電話画面を(10,10)だけ Deflate した矩形領域から
                    // メッセージダイアログに最適な領域のサイズを計算する
                    // ※ GetSuitableBound 関数の計算では、最適な領域の始点は計算されない
                    SFXRectangle rect(GetLocalBound().Deflate(10, 10));
                    rect.Set(dlg->GetSuitableBound(rect));

                    // メッセージダイアログに最適な領域を画面中央に移動する
                    rect.SnapCenterMiddle(GetLocalBound().GetCenterMiddle());

                    // メッセージダイアログの実領域を設定する
                    dlg->SetRealBound(rect);

                   // メッセージダイアログの状態を「可視+活性+操作可能+フォーカス」にまとめて設定する
                    dlg->SetState(true, true, true, true);

                    // メッセージダイアログを最前面に移動する
                    dlg->ToFront();

                    // 500 ミリ秒経過しても操作キー、ESCAPE キー、またはボタンが押下されなかった場合、
                    // HandleEscapeKey() を起動し、再描画するようにタイマーをスケジュールする
                    // ※HandleEscapeKey() のデフォルト実装: ダイアログを閉じる(終了する)
                    dlg->ScheduleTimer(500);
                }
            }
        }
    }
    return error;
}
[Tip] ダイアログの親レスポンダ

ダイアログの親レスポンダはアプリケーションクラス[SFYApplication がデフォルトで保持するルートSFZRoot)]にします。

ルートは、SFYApplication::GetThis 関数または SFYApplication::GetRoot 関数を呼び出して取得します。

[Note] メッセージダイアログの内部コントロール

SFZMessageDialog::GetMessage / SFZMessageDialog::GetButton 関数を使用して、 メッセージダイアログが内部で保持するテキストラベルコントロール(SFZMultipleTextLabelControl) / ボタンコントロール(SFZTextButtonControl)を取得できます。

[Note] ダイアログのタイマー処理

SFZDialog::ScheduleTimer 関数を使用してダイアログのタイマー処理を行えます。

具体的には、 SFZDialog::ScheduleTimer 関数で指定した時間が経過しても操作キー、 ESCAPE キー、またはボタンが押下されなければ、 SFZDialog::HandleEscapeKey 関数を呼び出して画面を再描画します。

SFZDialog::HandleEscapeKey 関数は結果イベント [SFXEvent(SFEVT_RESPONDER_RESULT, SFP16_RESULT_ESCAPE, 0)]をダイアログに送信します。

上の例の場合、

"dlg->ScheduleTimer(500);" 

を実行することにより、 500 ミリ秒経過しても操作キー、ESCAPE キー、またはボタンが押下されなかったとき、 ダイアログは結果イベント [SFXEvent(SFEVT_RESPONDER_RESULT, SFP16_RESULT_ESCAPE, 0)] を受信します。

ダイアログに結果ハンドラを登録していないので、 ダイアログを閉じる(終了する)処理だけを行うデフォルトの結果ハンドラが起動されます。

配色変更メニューの項目が選択されたとき、 メッセージダイアログが表示されるようにテキストメニューの結果ハンドラを変更します。

例 3.50. テキストメニューの結果ハンドラを変更する

// テキストメニューの結果ハンドラの実装
XANDLER_IMPLEMENT_VOIDRESULT(helloworld, OnMenuResult, invoker, reason, result)
{
    static UserColor::AtomRecConst color[] = {

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

    };

    switch (reason) {

        case SFP16_RESULT_OK:

            TRACE("'%S' is selected", _textMenu->GetItemText(static_cast<SInt16>(result)).GetCString());

            switch (result) {

                case 0:
                case 1:
                case 2:
                case 3:

                    SetMenuColors((color[result]));

                    // *** 太字が追加部分

                    // メッセージダイアログを作成する
                    MakeColorDialog((color[result]));

                    break;

                case 5:

                    _textMenu->SetMenuStyle(SFZTextMenu::SCROLLABLE_STYLE);

                    break;

                case 6:

                    _textMenu->SetMenuStyle(SFZTextMenu::PAGE_STYLE);

                    break;
            }

            break;

        case SFP16_RESULT_ESCAPE:
            invoker->Terminate();
            break;
    }
    return;
}

シミュレータでの実行結果は以下の通りです。

図 3.29. 実行結果

実行結果

参照: ダイアログ(基礎編)