前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク : SophiaFramework 3.0

4.6. ダイアログ

ダイアログを設置します。

4.6.1. ダイアログの設置

図のようなダイアログを設置します。前節で作成したコードに以下のコードを加えます。

ボタン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;
    }
}

実行結果

4.6.2. 自作ダイアログ

ダイアログは継承して使うこともできます。ウィンドウと同じように描画ハンドラやキーハンドラを登録できます。

宣言

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;
}

実行結果