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

10.5. ダイアログ

10.5.1. ダイアログとは

ダイアログはウィンドウを継承するレスポンダです。

表 10.5. ダイアログの種類

クラス名 解説
SFRPlainDialog タイトルやフレームのないプレーンなダイアログを表すレスポンダです。
SFRFrameDialog フレームダイアログを表すレスポンダです。
SFRTitleDialog タイトルダイアログを表すレスポンダです。
SFRMessageDialog 最高 1 つのボタンを持つメッセージダイアログを表します。
SFRMultiDialog 最高 3 つのボタンを持つ選択ダイアログを表します。

図 10.24. ダイアログ ( SFRPlainDialog, SFRFrameDialog, SFRTitleDialog )

ダイアログ ( , , )

図 10.25. ダイアログ ( SFRMessageDialog, SFRMultiDialog )

ダイアログ ( , )

関連情報: SFR GUI フレームワークを使う開発 : ダイアログ

10.5.2. プレーンダイアログ

図 10.26. プレーンダイアログ ( SFRPlainDialog )

プレーンダイアログ ( )

SFRPlainDialog クラスを継承するクラスのインスタンス(プレーンダイアログ)を作成します。

例 10.18. プレーンダイアログの定義・実装・作成

SFMTYPEDEFCLASS(MyDialog)
class MyDialog : public SFRPlainDialog {
    SFMSEALCOPY(MyDialog)
public:
    MyDialog(Void) static_throws;
    virtual ~MyDialog(Void);
private:
    HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
};

// コンストラクタ
MyDialog::MyDialog() : SFRPlainDialog(SFXRectangle(20, 80, 200, 100)) static_throws { 
    if (static_try()) {
        static_throw(
            RegisterHandler(SREVT_RESPONDER_RENDER, 
                            SRP16_RENDER_CONTENT,
                            HANDLER_BEFORE, 
                            HANDLER_FUNCTION(OnRenderContent)));
    }
}

// デストラクタ
MyDialog::~MyDialog(Void)
{
    return;
}

// 描画ハンドラ
HANDLER_IMPLEMENT_VOIDRENDER(MyDialog, OnRenderContent, graphics) {
  
    // SFXGraphics インスタンスによる描画
 
    // ダイアログの中を水色に設定
    // GetContentWorld() はウィンドウの中の描画領域を表す矩形 ( SFXRectangle ) を返す
    // SFXRGBColor(0xCE, 0xFF, 0xFF, 0x00) : 水色
    graphics->FillRectangle(GetContentWorld(), 
                            SFXRGBColor(0xCE, 0xFF, 0xFF, 0x00));

    // "Hello Window" 文字列表示
    // SFXRGBColor(0x00, 0x00, 0x00, 0x00) : 黒色
    graphics->DrawText("Hello Window", 
                       GetContentWorld(),
                       SFXRGBColor(0x00, 0x00, 0x00, 0x00));
}

// プレーンダイアログの作成
MyDialogPtr dialog;
dialog = new MyDialog();

10.5.3. フレームダイアログ

図 10.27. フレームダイアログ ( SFRFrameDialog )

フレームダイアログ ( )

SFRFrameDialog クラスを継承するクラスのインスタンス(フレームダイアログ)を作成します。

例 10.19. フレームダイアログの定義・実装・作成

SFMTYPEDEFCLASS(MyDialog)
class MyDialog : public SFRFrameDialog {
    SFMSEALCOPY(MyDialog)
public:
    MyDialog(Void) static_throws;
    virtual ~MyDialog(Void);
private:
    HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
};

// コンストラクタ
MyDialog::MyDialog() : SFRFrameDialog(SFXRectangle(20, 80, 200, 100)) static_throws { 
    if (static_try()) {
        static_throw(
            RegisterHandler(SREVT_RESPONDER_RENDER, 
                            SRP16_RENDER_CONTENT,
                            HANDLER_BEFORE, 
                            HANDLER_FUNCTION(OnRenderContent)));
    }
}

// デストラクタ
MyDialog::~MyDialog(Void)
{
    return;
}

// 描画ハンドラ
HANDLER_IMPLEMENT_VOIDRENDER(MyDialog, OnRenderContent, graphics) {
  
    // SFXGraphics インスタンスによる描画
 
    // ダイアログの中を水色に設定
    // GetContentWorld() はウィンドウの中の描画領域を表す矩形 ( SFXRectangle ) を返す
    // SFXRGBColor(0xCE, 0xFF, 0xFF, 0x00) : 水色
    graphics->FillRectangle(GetContentWorld(), 
                            SFXRGBColor(0xCE, 0xFF, 0xFF, 0x00));

    // "Hello Window" 文字列表示
    // SFXRGBColor(0x00, 0x00, 0x00, 0x00) : 黒色
    graphics->DrawText("Hello Window", 
                       GetContentWorld(),
                       SFXRGBColor(0x00, 0x00, 0x00, 0x00));
}

// フレームダイアログの作成
MyDialogPtr dialog;
dialog = new MyDialog();

10.5.4. タイトルダイアログ

図 10.28. タイトルダイアログ ( SFRTitleDialog )

タイトルダイアログ ( )

SFRTitleDialog クラスを継承するクラスのインスタンス(タイトルダイアログ)を作成します。

例 10.20. タイトルダイアログの定義・実装・作成

SFMTYPEDEFCLASS(MyDialog)
class MyDialog : public SFRTitleDialog {
    SFMSEALCOPY(MyDialog)
public:
    MyDialog(Void) static_throws;
    virtual ~MyDialog(Void);
private:
    HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
};

// コンストラクタ
MyDialog::MyDialog() : SFRTitleDialog(SFXRectangle(20, 80, 200, 100), "my dialog") static_throws { 
    if (static_try()) {
        static_throw(
            RegisterHandler(SREVT_RESPONDER_RENDER, 
                            SRP16_RENDER_CONTENT,
                            HANDLER_BEFORE, 
                            HANDLER_FUNCTION(OnRenderContent)));
    }
}

// デストラクタ
MyDialog::~MyDialog(Void)
{
    return;
}

// 描画ハンドラ
HANDLER_IMPLEMENT_VOIDRENDER(MyDialog, OnRenderContent, graphics) {
  
    // SFXGraphics インスタンスによる描画
 
    // ダイアログの中を水色に設定
    // GetContentWorld() はウィンドウの中の描画領域を表す矩形 ( SFXRectangle ) を返す
    // SFXRGBColor(0xCE, 0xFF, 0xFF, 0x00) : 水色
    graphics->FillRectangle(GetContentWorld(), 
                            SFXRGBColor(0xCE, 0xFF, 0xFF, 0x00));

    // "Hello Window" 文字列表示
    // SFXRGBColor(0x00, 0x00, 0x00, 0x00) : 黒色
    graphics->DrawText("Hello Window", 
                       GetContentWorld(),
                       SFXRGBColor(0x00, 0x00, 0x00, 0x00));
}

// タイトルダイアログの作成
MyDialogPtr dialog;
dialog = new MyDialog();

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

メッセージダイアログは、ボタンが最高 1 個のボタンを持つダイアログです。

例 10.21. メッセージダイアログの作成

new SFRMessageDialog(SFXRectangle(20, 80, 200, 100), "処理が完了しました。", "OK");

図 10.29. メッセージダイアログ ( SFRMessageDialog )

メッセージダイアログ ( )

デフォルト設定では、ボタンを押すとメッセージダイアログは閉じます。 ボタンを押したときの動作を変更するには別のイベントハンドラを定義・実装・登録します。

例 10.22. メッセージダイアログのハンドラの宣言・実装・登録

class ExampleAppli : public SFRApplication {
    ...
    
    // ダイアログハンドラの宣言
    HANDLER_DECLARE_VOIDDIALOG(OnDialog)
    
    ...
};

// ダイアログ のハンドラの実装
HANDLER_IMPLEMENT_VOIDDIALOG(ExampleAppli, OnDialog, result, dialog)
{
    
     ...  // 何らかの処理
 
    // ダイアログを閉じる
    // dialog : ダイアログへのポインタ
    dialog->Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE,
                            SRP16_TERMINATE_INVOKE, 
                            true));
}

// ダイアログハンドラの登録
SFRDialogPtr dialog;
dialog = new SFRMessageDialog(SFXRectangle(20, 80, 200, 100),
                              "処理が完了しました。", 
                              "OK");

dialog->RegisterHandler(SREVT_DIALOG, 
                        HANDLER_BEFORE, 
                        HANDLER_FUNCTION(OnDialog));

10.5.6. マルチダイアログ

マルチダイアログは、ボタンが最高 3 個のボタンを持つダイアログです。

[Note] ボタンを表示させないためには

ボタンに表示するテキストを空にすると、ボタンが表示されないようになります。

図 10.30. マルチダイアログ ( SFRMultiDialog )

マルチダイアログ ( )

例 10.23. マルチダイアログの作成

SFRMultiDialog::ParamRec param;
param.text = "アプリを終了しますか?";
param.ok = "はい";
param.cancel = "いいえ";
param.another = ";            // 空文字の場合、ボタンは表示されない
param.focus = SFRMultiDialog::FOCUS_OK,  // フォーカスの位置
param.image = SFBImageSmp(null);         // アイコンのイメージ
new SFRMultiDialog(SFXRectangle(20, 80, 200, 150), "確認", param);

SFRMultiDialog のコンストラクタに引数を指定するには SFRMultiDialog::ParamRec 構造体を使います。

ボタンが押された場合の処理はマルチダイアログ のハンドラに記述します。

例 10.24. マルチダイアログのハンドラの実装

HANDLER_IMPLEMENT_VOIDDIALOG(ExampleAppli, OnDialog, result, dialog)
{

    // 押されたキーの種類に応じて分岐する
    switch (result) {
        case SRP16_OK:         // OK ボタンの場合
            ...

        case SRP16_CANCEL:     // CANCEL ボタンの場合
            ...

        case SRP16_ANOTHER:    // ANOTHER ボタンの場合
            ...

    }
}

10.5.7. カスタマイズ

フレームダイアログ SFRFrameDialog クラスを継承するクラスを作成して、フレームダイアログをカスタマイズします。ウィンドウと同じように描画ハンドラやキーハンドラを登録できます。

図 10.31. フレームダイアログのカスタマイズ例 ( SFRFrameDialog )

フレームダイアログのカスタマイズ例 ( )

例 10.25. フレームダイアログのカスタマイズ

SFMTYPEDEFCLASS(MyDialog)
class MyDialog : public SFRFrameDialog {
    SFMSEALCOPY(MyDialog)
public:
    MyDialog(Void) static_throws;
    virtual ~MyDialog(Void);
private:
    HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
    HANDLER_DECLARE_BOOLEVENT(OnKey)
};

// コンストラクタ
// ハンドラの登録
MyDialog::MyDialog() : SFRFrameDialog(SFXRectangle(20, 80, 200, 150)) 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_AFTER, 
                            HANDLER_FUNCTION(OnKey)));
    }
}

// デストラクタ
MyDialog::~MyDialog(Void)
{
    return;
}

// 描画ハンドラ
HANDLER_IMPLEMENT_VOIDRENDER(MyDialog, OnRenderContent, graphics) {

    // 背景色を水色にする
    graphics->FillRectangle(GetContentWorld(), 
                            SFXRGBColor(0xCC, 0xFF, 0xFF, 0x00));
																												
    // 文字列を自動折り返しで指定した矩形の中に描画する
    // 第 1 引数 : 描画文字列
    // 第 2 引数 : 描画先の矩形座標
    // 第 3 引数 : 描画色
    // 第 4 引数 : 行中の文字列のアライメント
    graphics->DrawString("3 キーを押すと閉じます", 
                         SFXRectangle(10, 10, 180, 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;
}