![]() ![]() ![]()
|
BREW C++ ライブラリ & GUI フレームワーク : SophiaFramework 3.0 |
ダイアログを設置します。
図のようなダイアログを設置します。前節で作成したコードに以下のコードを加えます。

ボタン5 にハンドラを設定
// ボタン5 のハンドラの定義(宣言、登録は省略) HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnButtonControl5, result, control) { // ダイアログ作成時のパラメータのための構造体 SFRMultiDialog::ParamRec param; // ダイアログに表示するテキスト param.text = "アプリを終了します。よろしいですか?"; // 第1ボタンのテキスト param.ok = "はい"; // 第2ボタンのテキスト param.cancel = "いいえ"; // 第3ボタンのテキスト(空テキスト:ボタン無し) param.another = ""; // フォーカスの初期位置 param.focus = SFRMultiDialog::FOCUS_OK; // アイコン画像 param.image = SFBImageSmp(null); // ダイアログ作成 SFRMultiDialogPtr multiDialog = new SFRMultiDialog( SFXRectangle(10, 40, 220, 140), "終了?", param); //ハンドラを登録 if (static_try()) { static_throw( multiDialog->RegisterHandler( SREVT_DIALOG, HANDLER_BEFORE, HANDLER_FUNCTION(OnDialog))); } }
マルチダイアログのハンドラ(「はい」、「いいえ」のどちらかを選んだ場合に呼ばれる)
「はい」を選んだ場合はアプリを終了、「いいえ」を選んだ場合はダイアログを閉じます。
// 宣言 HANDLER_DECLARE_VOIDDIALOG(MyWindow, OnDialog) // マルチダイアログハンドラの定義 // ダイアログで「はい」か「いいえ」を選んだときに実行されるコード HANDLER_IMPLEMENT_VOIDDIALOG(MyWindow, OnDialog, result, dialog) { switch(result) { case SRP16_OK: // 「はい」を選んだとき TRACE("OK"); // アプリを終了する SFRApplication::Terminate(); break; case SRP16_CANCEL: // 「いいえ」を選んだとき TRACE("CANCEL"); // ダイアログを閉じる dialog->DialogHandler(); break; } }
実行結果

ダイアログは継承して使うこともできます。ウィンドウと同じように描画ハンドラやキーハンドラを登録できます。
宣言
SFMTYPEDEFCLASS(MyDialog)
class MyDialog : public SFRFrameDialog {
SFMSEALCOPY(MyDialog)
public:
MyDialog(Void) static_throws;
virtual ~MyDialog(Void);
HANDLER_DECLARE_VOIDRENDER(MyDialog, OnRenderContent)
HANDLER_DECLARE_BOOLEVENT(MyDialog, OnKey)
};
定義
// コンストラクタ MyDialog::MyDialog() : SFRFrameDialog(SFXRectangle(10, 40, 220, 80)) static_throws { if (static_try()) { static_throw( RegisterHandler(SREVT_RESPONDER_RENDER, SRP16_RENDER_CONTENT, HANDLER_BEFORE, HANDLER_FUNCTION(OnRenderContent))); } if (static_try()) { static_throw( RegisterHandler(SFEVT_KEY, HANDLER_BEFORE, HANDLER_FUNCTION(OnKey))); } } // デストラクタ MyDialog::~MyDialog(Void) { return; } // 描画ハンドラ HANDLER_IMPLEMENT_VOIDRENDER(MyDialog, OnRenderContent, graphics) { graphics->FillRectangle(GetContentWorld(), SFXRGBColor(0xCC, 0xFF, 0xFF, 0x00)); graphics->DrawString( "3 キーを押すと閉じます", SFXRectangle(10, 10, 200, 80), SFXRGBColor(0, 0, 0, 0), IDF_ALIGN_LEFT | IDF_ALIGN_MIDDLE); } // キー ハンドラ HANDLER_IMPLEMENT_BOOLEVENT(MyDialog, OnKey, event) { switch (event.GetP16()) { case AVK_3: // 3 キーが押されると // 自分自身を閉じる return Invoke( SFXEvent(SREVT_RESPONDER_TERMINATE, SRP16_TERMINATE_INVOKE, true)); } return false; }
HelloWorld のキーハンドラ
// キー ハンドラ HANDLER_IMPLEMENT_BOOLEVENT(HelloWorld, OnKey, event) { switch (event.GetP16()) { ... //*** ↓ここから追加 case AVK_2: if (static_try()) { MyDialogPtr dialog; // new 演算子でダイアログ生成 if ((dialog = ::new MyDialog()) != null) { // コードの残り部分はエラー処理 static_throw(*dialog); if (!static_try()) { ::delete dialog; } } else { static_throw(SFERR_NO_MEMORY); } } return true; //*** ↑ここまで追加 } return false; }
実行結果

|
Copyright (C) 2002 - 2009 Sophia Cradle, Inc. All Rights Reserved. |
![]() ![]() ![]()
|