SophiaFramework UNIVERSE 5.3 |
下図のメッセージダイアログ(SFZMessageDialog)を作成します。
ダイアログを作成するための関数を定義します。
例 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; }
ダイアログの親レスポンダ | |
---|---|
ダイアログの親レスポンダはアプリケーションクラス[SFYApplication がデフォルトで保持するルート(SFZRoot)]にします。 ルートは、SFYApplication::GetThis 関数または SFYApplication::GetRoot 関数を呼び出して取得します。 |
メッセージダイアログの内部コントロール | |
---|---|
SFZMessageDialog::GetMessage / SFZMessageDialog::GetButton 関数を使用して、 メッセージダイアログが内部で保持するテキストラベルコントロール(SFZMultipleTextLabelControl) / ボタンコントロール(SFZTextButtonControl)を取得できます。 |
ダイアログのタイマー処理 | |
---|---|
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; }
シミュレータでの実行結果は以下の通りです。
参照: ダイアログ(基礎編)
Copyright(c) 2002 - 2024 Sophia Cradle Incorporated All Rights Reserved. |