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

3.6. ダイアログ

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

メッセージ ダイアログは通知メッセージを表示するダイアログです。

メニュー項目を選択すると、メッセージ ダイアログを表示するようにします。

テキスト メニューで実装したメニューを利用します。

選択したメニュー項目の配色にダイアログの配色を合わせるようにします。

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

メッセージ ダイアログ

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

例 3.49. ダイアログ 作成関数

// MenuWindow クラスの宣言
SFMTYPEDEFRESPONDER(MenuWindow)
class MenuWindow : public SFZWindow {
    SFMSEALRESPONDER(MenuWindow)
    SFMRESPONDERINSTANTIATEFOUR(MenuWindow, SFZWindow, SFYContainer, SFYWidget, SFYResponder)
public:
    enum CodeEnum {
        CODE_TYPE = four_char_code('M', 'E', 'N', 'U')
    };
    SFMTYPEDEFTYPE(CodeEnum)
    SFZTextMenuSmp _textMenu;
public:
    static MenuWindowSmp NewInstance(SFCErrorPtr exception = null);
    SFCError Make(Void);
protected:
    explicit MenuWindow(Void) static_throws;
    virtual ~MenuWindow(Void);

    virtual Void HandleRenderRequest(SFXGraphicsPtr graphics) const;
    XANDLER_DECLARE_VOIDRESULT(OnMenuResult)
    XANDLER_DECLARE_BOOLEVENT(OnKey)

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

private:

    // メッセージ ダイアログ作成関数の宣言
    SFCError MakeColorDlg(SFXRGBColorConstRef dlgBackColor, SFXRGBColorConstRef dlgForeColor, SFXBevelColorConstRef btnColor, SFXRGBColorConstRef btnTextColor);

};

// メッセージ ダイアログ作成関数の実装
SFCError MenuWindow::MakeColorDlg(SFXRGBColorConstRef dlgBackColor, SFXRGBColorConstRef dlgForeColor, SFXBevelColorConstRef btnColor, SFXRGBColorConstRef btnTextColor)
{
    SFCError error;

    // メッセージ ダイアログのインスタンスを作成します。
    SFZMessageDialogSmp dlg = SFZMessageDialog::NewInstance(&error);
    if (dlg != null) {
        error = dlg->SetParent(GetThis());
        if (error == SFERR_NO_ERROR) {

            // メッセージ ダイアログのメッセージを設定します。
            error = dlg->SetMessageText("Color Changed.");
            if (error == SFERR_NO_ERROR) {

                // メッセージ ダイアログのボタンのテキストを設定します。
                error = dlg->SetButtonText("OK");
                if (error == SFERR_NO_ERROR) {

                    // メッセージ ダイアログの背景色を設定します。
                    dlg->SetBackgroundColor(dlgBackColor);

                    // メッセージの色を設定します。
                    dlg->GetMessage()->SetTextColor(dlgForeColor);

                    // メッセージを中央にアラインします。
                    dlg->GetMessage()->SetHorizontalAlign(SFZMultipleTextLabelControl::DEFAULT_HORIZONTAL);

                    // ボタンの色を設定します。
                    dlg->GetButton()->SetButtonColor(btnColor);

                    // ボタン テキストの色を設定します。
                    dlg->GetButton()->SetTextColor(btnTextColor);

                    // ダイアログの大きさを計算し、中央に配置します。
                    SFXRectangle rect;
                    rect.Set(dlg->GetSuitableBound(GetLocalBound().Deflate(10,10)));
                    rect.SetOrigin(SFXGrid(GetLocalBound().GetSize() - rect.GetSize()) / 2);
                    dlg->SetRealBound(rect);

                    // 500 ミリ秒後にダイアログを閉じます。
                    dlg->ScheduleTimer(500);

                    dlg->SetState(true, true, true, true);
                    dlg->ToFront();
                }
            }
        }
    }

    return error;
}
[Note] 注意

GetMessage() でメッセージ、GetButton() でボタンを取得することができます。

それぞれ、SFZMultipleTextLabelControlSmp 型、SFZTextButtonControlSmp 型の値が返されます。

配色変更のメニュー項目が選択されたときに、ダイアログを表示するようにします。

例 3.50. メニューの結果ハンドラの変更

// メニューの結果ハンドラ
XANDLER_IMPLEMENT_VOIDRESULT(MenuWindow, OnMenuResult, invoker, reason, result)
{
    // *** 太字が追加部分

    if (reason == SFP16_RESULT_OK) {
        TRACE("%S selected", static_cast<SFZTextMenuPtr>(invoker)->GetItemText((SInt16)result).GetCString());
        switch (result) {
            case 0:
                // Elegant の配色に変更します。
                _textMenu->SetTitleForeColor(COLOR_MENU_TITLE_FONT_ELEG);
                _textMenu->SetTitleBackColor(COLOR_MENU_TITLE_BACK_ELEG);
                _textMenu->SetSelBackColor(COLOR_MENU_SELBACK_ELEG);
                _textMenu->SetSelForeColor(COLOR_MENU_SELFORE_ELEG);
                _textMenu->SetBevelColor(COLOR_MENU_BEVEL_ELEG);
                for (i = 0; i < num; ++i) {
                    _textMenu->SetItemForeColor(i, COLOR_MENU_ITEM_FORE_ELEG);
                }

                MakeColorDlg(COLOR_MENU_SELBACK_ELEG, COLOR_MENU_SELFORE_ELEG, COLOR_MENU_BEVEL_ELEG, COLOR_MENU_ITEM_FORE_ELEG);

                break;
            case 1:
                // Carnival の配色に変更します。
                _textMenu->SetTitleForeColor(COLOR_MENU_TITLE_FONT_CARN);
                _textMenu->SetTitleBackColor(COLOR_MENU_TITLE_BACK_CARN);
                _textMenu->SetSelBackColor(COLOR_MENU_SELBACK_CARN);
                _textMenu->SetSelForeColor(COLOR_MENU_SELFORE_CARN);
                _textMenu->SetBevelColor(COLOR_MENU_BEVEL_CARN);
                for (i = 0; i < num; ++i) {
                    _textMenu->SetItemForeColor(i, COLOR_MENU_ITEM_FORE_CARN);
                }

                MakeColorDlg(COLOR_MENU_SELBACK_CARN, COLOR_MENU_SELFORE_CARN, COLOR_MENU_BEVEL_CARN, COLOR_MENU_ITEM_FORE_CARN);

                break;
            case 2:
                // Dynamic の配色に変更します。
                _textMenu->SetTitleForeColor(COLOR_MENU_TITLE_FONT_DYNA);
                _textMenu->SetTitleBackColor(COLOR_MENU_TITLE_BACK_DYNA);
                _textMenu->SetSelBackColor(COLOR_MENU_SELBACK_DYNA);
                _textMenu->SetSelForeColor(COLOR_MENU_SELFORE_DYNA);
                _textMenu->SetBevelColor(COLOR_MENU_BEVEL_DYNA);
                for (i = 0; i < num; ++i) {
                    _textMenu->SetItemForeColor(i, COLOR_MENU_ITEM_FORE_DYNA);
                }

                MakeColorDlg(COLOR_MENU_SELBACK_DYNA, COLOR_MENU_SELFORE_DYNA, COLOR_MENU_BEVEL_DYNA, COLOR_MENU_ITEM_FORE_DYNA);

                break;
            case 3:
                // Black の配色に変更します。
                _textMenu->SetTitleForeColor(COLOR_MENU_TITLE_FONT_MONO);
                _textMenu->SetTitleBackColor(COLOR_MENU_TITLE_BACK_MONO);
                _textMenu->SetSelBackColor(COLOR_MENU_SELBACK_MONO);
                _textMenu->SetSelForeColor(COLOR_MENU_SELFORE_MONO);
                _textMenu->SetBevelColor(COLOR_MENU_BEVEL_MONO);
                for (i = 0; i < num; ++i) {
                    _textMenu->SetItemForeColor(i, COLOR_WHITE);
                }

                MakeColorDlg(COLOR_MENU_SELBACK_MONO, COLOR_MENU_SELFORE_MONO, COLOR_MENU_BEVEL_MONO, COLOR_MENU_ITEM_FORE_MONO);

                break;
            case 5:
                _textMenu->SetMenuStyle(SFZTextMenu::SCROLLABLE_STYLE);
                break;
            case 6:
                _textMenu->SetMenuStyle(SFZTextMenu::PAGE_STYLE);
            case 8:
                break;
        }
    }
    else {
        ・・・省略・・・
    }
    return;
}

シミュレータでの実行結果です。

図 3.32. 実行結果

実行結果

この章を通してのサンプル コードはこちらにあります。