前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework 4.1

10.1. レスポンダとは

「レスポンダ(SFRResponder)」とは、SophiaFramework が標準で提供するウインドウ、ボタン、メニュー、ダイアログなどの UI コンポーネントのことです。

SophiaFramework は、キー入力などのイベントを処理するイベント処理エンジン、レスポンダを描画する描画処理エンジンを提供します。

「レスポンダ」は、レスポンダ単位でソース コードを複数のプロジェクトで再利用できます。また、デザインや動作などをカスタマイズした独自の「レスポンダ」も実装できます。

関連情報 : SophiaFramework GUI フレームワーク

10.1.1. レスポンダのタイプ

レスポンダのタイプは、以下の 6 種類があります。

表 10.1. レスポンダのタイプ

基底クラス名 解説
SFRApplication アプリを表すレスポンダです。
SFRWindow ウィンドウを表すレスポンダです。
SFRDialog ダイアログを表すレスポンダです。
SFRMenu メニューを表すレスポンダです。
SFRControl コントロールを表すレスポンダです。
SFRPane ペインを表すレスポンダです。

10.1.2. レスポンダの階層

アプリ ( SFRApplication )でウィンドウ ( SFRWindow )と メニュー ( SFRMenu ) を制御し、ウィンドウ ( SFRWindow )で コントロール ( SFRControl ) や ペイン ( SFRPane ) を制御するプログラミング方式になっています。

ひとつのアプリには SFRApplication を継承するアプリ クラスがひとつだけ必要です。SophiaFramework アプリのプログラミングはこのクラスの記述から始まります。

ウィンドウ や メニュー、コントロール、ペインは定義できる数に制限はありません。

図 10.1. 所有関係図

所有関係図

アプリ、ウィンドウ、メニュー、など、すべての「レスポンダ」は SFRResponder クラスを継承します。

図 10.2. クラス図

クラス図

10.1.3. レスポンダの種類

表 10.2. レスポンダの種類

クラス名 タイプ アトリビュート 解説
SFRApplication TYPE_SFRAPPLICATION ( アプリ ) ATTRIBUTE_SFRAPPLICATION アプリを表すレスポンダです。
SFRWindow TYPE_SFRWINDOW ( ウィンドウ ) ATTRIBUTE_SFRWINDOW ウィンドウを表すレスポンダです。
SFRPlainWindow TYPE_SFRWINDOW ( ウィンドウ ) ATTRIBUTE_SFRPLAINWINDOW タイトルやフレームのないプレーンなウィンドウを表すレスポンダです。
SFRFrameWindow TYPE_SFRWINDOW ( ウィンドウ ) ATTRIBUTE_SFRFRAMEWINDOW フレーム付きのウィンドウを表すレスポンダです。
SFRTitleWindow TYPE_SFRWINDOW ( ウィンドウ ) ATTRIBUTE_SFRTITLEWINDOW タイトル付きのウィンドウを表すレスポンダです。
SFRDialog TYPE_SFRDIALOG ( ダイアログ ) ATTRIBUTE_SFRDIALOG ダイアログを表すレスポンダです。
SFRPlainDialog TYPE_SFRDIALOG ( ダイアログ ) ATTRIBUTE_SFRPLAINDIALOG タイトルやフレームのないプレーンなダイアログを表すレスポンダです。
SFRFrameDialog TYPE_SFRDIALOG ( ダイアログ ) ATTRIBUTE_SFRFRAMEDIALOG フレーム付きのダイアログを表すレスポンダです。
SFRTitleDialog TYPE_SFRDIALOG ( ダイアログ ) ATTRIBUTE_SFRTITLEDIALOG タイトル付きのダイアログを表すレスポンダです。
SFRMessageDialog TYPE_SFRDIALOG ( ダイアログ ) ATTRIBUTE_SFRMESSAGEDIALOG 最高 1 つのボタンを持つメッセージ ダイアログです。
SFRMultiDialog TYPE_SFRDIALOG ( ダイアログ ) ATTRIBUTE_SFRMULTIDIALOG 最高 3 つのボタンを持つ選択ダイアログです。
SFRMenu TYPE_SFRMENU ( メニュー ) ATTRIBUTE_SFRMENU メニューを表すレスポンダです。
SFRPlainMenu TYPE_SFRMENU ( メニュー ) ATTRIBUTE_SFRPLAINMENU タイトルやフレームのないプレーンなメニューを表すレスポンダです。
SFRFrameMenu TYPE_SFRMENU ( メニュー ) ATTRIBUTE_SFRFRAMEMENU フレーム付きのメニューを表すレスポンダです。
SFRTitleMenu TYPE_SFRMENU ( メニュー ) ATTRIBUTE_SFRTITLEMENU タイトル付きのメニューを表すレスポンダです。
SFRTextMenu TYPE_SFRMENU ( メニュー ) ATTRIBUTE_SFRTEXTMENU テキスト メニューを表すレスポンダです。
SFRPane TYPE_SFRPANE ( ペイン ) ATTRIBUTE_SFRPANE ペインを表すレスポンダの基底クラスです。
SFRPlainPane TYPE_SFRPANE ( ペイン ) ATTRIBUTE_SFRPLAINPANE タイトルやフレームのないプレーンなペインを表すレスポンダです。
SFRTabPane TYPE_SFRPANE ( ペイン ) ATTRIBUTE_SFRTABPANE タブ コントロール ( SFRTabControl ) に使うタブ ペインを表すレスポンダです。
SFRControl TYPE_SFRCONTROL ( コントロール ) ATTRIBUTE_SFRCONTROL コントロールの基底クラス
SFRButtonControl TYPE_SFRCONTROL ( コントロール ) ATTRIBUTE_SFRBUTTONCONTROL ボタン コントロールを表すレスポンダです。
SFRCheckboxControl TYPE_SFRCONTROL ( コントロール ) ATTRIBUTE_SFRCHECKBOXCONTROL チェックボックス コントロールを表すレスポンダです。
SFRRadiobuttonControl TYPE_SFRCONTROL ( コントロール ) ATTRIBUTE_SFRRADIOBUTTONCONTROL ラジオボタン コントロールを表すレスポンダです。
SFRLabelControl TYPE_SFRCONTROL ( コントロール ) ATTRIBUTE_SFRLABELCONTROL ラベル コントロールを表すレスポンダです。
SFRComboboxControl TYPE_SFRCONTROL ( コントロール ) ATTRIBUTE_SFRCOMBOBOXCONTROL コンボボックス コントロールを表すレスポンダです。
SFREditboxControl TYPE_SFRCONTROL ( コントロール ) ATTRIBUTE_SFREDITBOXCONTROL エディット コントロールを表すレスポンダです。
SFRTabControl TYPE_SFRCONTROL ( コントロール ) ATTRIBUTE_SFRTABCONTROL タブ コントロールを表すレスポンダです。
SFRBrowserControl TYPE_SFRCONTROL ( コントロール ) ATTRIBUTE_SFRBROWSERCONTROL 簡易ウェブ ブラウザーを表すコントロールです。

図 10.3. ウィンドウ ( SFRPlainWindow, SFRFrameWindow, SFRTitleWindow )

ウィンドウ ( , , )

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

ダイアログ ( , , )

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

ダイアログ ( , )

図 10.6. メニュー( SFRTextMenu )

メニュー( )

図 10.7. ペインとタブ コントロール( SFRPlainPane, SFRTabPane, SFRTabControl )

ペインとタブ コントロール( , , )

10.1.4. レスポンダの定義と実装

レスポンダは SophiaFramework で標準提供されるレスポンダ クラスを継承して定義し、実装します。

関連情報: GUI フレームワークを使う開発 : ウィンドウ

例 10.1. タイトル ウィンドウ の定義と実装 ( SFRTitleWindow )

// 座標 : ( 20 , 20 ) 、幅 : 200、高さ : 250、タイトル : "my window"
SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void);
    virtual ~MyWindow(Void);
};

// コンストラクタ
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
    SFXRectangle(20, 20, 200, 250), "my window")
{
    return;
}

10.1.5. レスポンダの作成と破棄

レスポンダは new 演算子を使って作成します。

例 10.2. タイトル ウィンドウ の作成 ( SFRTitleWindow )

MyWindowPtr window;

window = new MyWindow();

例 10.3. ボタンの作成 ( SFRButtonControl )

SFRButtonControlPtr button;   // ボタンコントロールへのポインター
SFXSize devsize;              // 画面サイズ
SFXAnsiString str = "Button"; // ボタンの名称

SInt16 fontWidth = SFXGraphics::MeasureText(AEE_FONT_NORMAL, str);  // フォントの幅
SInt16 fontHeight = SFXGraphics::GetFontHeight(AEE_FONT_NORMAL);    // フォントの高さ

devsize = SFXGraphics::GetDeviceSize();   //デバイスの画面サイズ
SInt16 devWidth = devsize.GetWidth();     //デバイスの幅
SInt16 devHeight = devsize.GetHeight();   //デバイスの高さ

// ボタンの作成
// 座標 : ( ( 画面の中央の幅 - フォントの幅 * 2 ) / 2, ( 画面の中央の高さ - フォントの高さ * 2 ) / 2 )
// 幅 : フォントの幅 * 2
// 高さ : フォントの高さ * 2
// タイトル : "Button"
button = ::new SFRButtonControl(this, 
                                     SFXRectangle((devWidth - fontWidth * 2) / 2, 
                                     (devHeight- fontHeight * 2) / 2, 
                                     fontWidth * 2 , 
                                     fontHeight * 2), 
                                     str);

図 10.9. 実行結果

実行結果

レスポンダは、アプリの終了時に自動的に破棄されます。

※ レスポンダを明示的に破棄するには下記のコードのように Invoke 関数を使って SREVT_RESPONDER_TERMINATE イベントを送信します。( delete 演算子で破棄できません。 )

例 10.4. レスポンダの破棄

responder->Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE, SRP16_TERMINATE_INVOKE, true));
[Warning] 警告

new 演算子で作成に失敗したレスポンダは delete 演算子で破棄します。

例 10.5. レスポンダの作成 ( SFRPlainWindow )

SFRWindowPtr window;

// new 演算子でプレーン ウィンドウ作成する
if ((window = new SFRPlainWindow(this, SFXRectangle(0, 0, 100, 100))) != null) {

    static_throw(*window);

    if (!static_try()) {   // プレーン ウィンドウ作成時にエラーが発生したとき
         delete window;    
         // delete 演算子を使ってプレーン ウィンドウを破棄する
    }

} else {
    static_throw(SFERR_NO_MEMORY);
}

10.1.6. イベント ハンドラ

イベント ハンドラは、アプリ開始や、キー押下などのイベントに応じて然るべき処理をする関数です。SophiaFramework で利用可能なイベントは SFCEventEnum を参照してください。

イベント ハンドラの定義

イベント ハンドラを定義するには HANDLER_IMPLEMENT_ で始まる名前のマクロを用います。

例 10.6. キー ハンドラの定義

// キー ハンドラの定義(ウィンドウが最前面にあるときにキーが押されると実行される)
// 第 1 引数 : 所属クラス、第 2 引数 : ハンドラ名、第 3 引数 : イベント値
HANDLER_IMPLEMENT_BOOLEVENT(MyWindow, OnKey, event)
{
    // 押されたキーの種類に応じて分岐する
    switch (event.GetP16()) {
        case AVK_CLR: // クリアー キーの場合
            // ウィンドウを閉じる
            return Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE,
                                   SRP16_TERMINATE_INVOKE, true));

        case AVK_1:   // 1 キーの場合

            ...

            return true;  // 押されたキーの処理をしたときは true を返す
    }
    return false;         // 押されたキーの処理をしなかったときは false を返す
}

イベント ハンドラの宣言

イベント ハンドラを宣言するには HANDLER_DECLARE_ で始まる名前のマクロを使います。

例 10.7. キー ハンドラの宣言

		
// MyWindow クラスの定義
SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void) static_throws;
    virtual ~MyWindow(Void) { return; }
    
    // イベント ハンドラの宣言
    // 引数はハンドラ名
    HANDLER_DECLARE_BOOLEVENT(OnKey)
};

イベント ハンドラの登録

イベント ハンドラは RegisterHandler 関数で登録します。

例 10.8. キー ハンドラの登録

// コンストラクタ
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
    SFXRectangle(20, 20, 200, 250), "my window") 
{
    // ハンドラの登録
    RegisterHandler(SFEVT_KEY, HANDLER_AFTER, HANDLER_FUNCTION(OnKey));
    return;
}