ホーム > デベロッパ > SophiaFramework > BREW C++ 逆引きコード集

BREW C++ プログラミング 逆引きコード集 : ダイアログ

C++ で作成されたBREW アプリで、レスポンダ(GUIフレームワーク)を使ったダイアログの処理を行う方法です。

最高 3 つのボタンを持つ選択ダイアログを作成する

SFRMultiDialog クラスを使って、最高 3 つのボタンを持つ選択ダイアログを作成します。

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

    SFRDialogPtr _dialog;
    
    ...
};

// ダイアログ ハンドラ
HANDLER_IMPLEMENT_VOIDDIALOG(ExampleAppli, OnDialog, result, dialog)
{
    
    switch (result) {
         case SRP16_OK:         // OK ボタンが押されたとき
             // 何か処理を行う
         break;

        case SRP16_CANCEL:     // CANCEL ボタンが押されたとき
             // 何か処理を行う
        break;

        case SRP16_ANOTHER:    // ANOTHER ボタンの場合
            // 何か処理を行う
        break;
    }
}

// 選択ダイアログを設定する
SFRMultiDialog::ParamRec param;
param.text = "アプリを終了しますか?";
param.ok = "はい";
param.cancel = "いいえ";
param.another = "";                      // 空文字の場合、ボタンは表示されない
param.focus = SFRMultiDialog::FOCUS_OK,  // フォーカスの位置
param.image = SFBImageSmp(null);         // アイコンのイメージ

// ダイアログを作成する
_dialog= new SFRMultiDialog(SFXRectangle(20, 80, 200, 100),
                              "確認", 
                              param);

// ダイアログ ハンドラを登録する
_dialog->RegisterHandler(SREVT_DIALOG, 
                        HANDLER_BEFORE, 
                        HANDLER_FUNCTION(OnDialog));
      

最高 1 つのボタンを持つメッセージ ダイアログを作成する

SFRMessageDialog クラスを使って、最高 1 つのボタンを持つメッセージ ダイアログを作成します。

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

    SFRDialogPtr _dialog;
    
    ...
};

// ダイアログ ハンドラ
HANDLER_IMPLEMENT_VOIDDIALOG(ExampleAppli, OnDialog, result, dialog)
{
    
     ...  // 何らかの処理
 
    // ダイアログを閉じる
    _dialog->DialogHandler();
}


// ダイアログを作成する
_dialog = new SFRMessageDialog(SFXRectangle(20, 80, 200, 100),
                              "処理が完了しました。", 
                              "OK");

// ダイアログ ハンドラを登録する
_dialog->RegisterHandler(SREVT_DIALOG, 
                        HANDLER_BEFORE, 
                        HANDLER_FUNCTION(OnDialog));
      

タイトル付きのダイアログを作成する

SFRTitleDialog クラスを使って、"my dialog"のタイトルがついたウィンドウを作成します。

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 { 
  
    // 描画ハンドラを登録する
    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(0xD8, 0xD8, 0xFF, 0x00) : 左から R, G, B, アルファ値
    graphics->FillRectangle(GetContentWorld(), 
                            SFXRGBColor(0xD8, 0xD8, 0xFF, 0x00));

    // "Hello Window" を描画する
    graphics->DrawText("Hello Window", 
                       GetContentWorld(),
                       SFXRGBColor(0x00, 0x00, 0x00, 0x00));
}

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

フレーム付きのダイアログを作成する

SFRFrameDialog クラスを使って、フレーム付きのダイアログを作成します。

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 { 
   
    // 描画ハンドラを登録する
    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(0xD8, 0xD8, 0xFF, 0x00) : 左から R, G, B, アルファ値
    graphics->FillRectangle(GetContentWorld(), 
                            SFXRGBColor(0xD8, 0xD8, 0xFF, 0x00));

    // "Hello Window" を描画する
    graphics->DrawText("Hello Window", 
                       GetContentWorld(),
                       SFXRGBColor(0x00, 0x00, 0x00, 0x00));
}

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

プレーンダイアログを作成する

SFRPlainDialog クラスを使って、プレーンダイアログを作成します。

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 { 
    
    // 描画ハンドラを登録する
    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(0xD8, 0xD8, 0xFF, 0x00) : 左から R, G, B, アルファ値
    graphics->FillRectangle(GetContentWorld(), 
                            SFXRGBColor(0xD8, 0xD8, 0xFF, 0x00));
}

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

ダイアログを閉じる方法

DialogHandler を使ってダイアログを閉じます。


//  ダイアログの作成
SFRMultiDialog::ParamRec param;   // マルチダイアログの構造体
    
param.text = "ダイアログを閉じます。よろしいですか";  // ダイアログに表示するテキスト
    
param.ok = "はい";   // 第 1 ボタンのテキスト 
param.cancel = "";   // 第 2 ボタンのテキスト( 空テキスト:ボタン無し )
param.another = ";   // 第 3 ボタンのテキスト( 空テキスト:ボタン無し )
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_IMPLEMENT_VOIDDIALOG(MyWindow, OnDialog, result, dialog) {
    switch(result) {
        case SRP16_OK:     // 「はい」を選んだとき
            dialog->DialogHandler();   // ダイアログを閉じる
            break;
    }
}