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

10.2. レスポンダとは

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

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

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

参照: SophiaFramework UNIVERSE GUI フレームワーク

10.2.1. レスポンダのタイプ

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

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

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

10.2.2. レスポンダの階層

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

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

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

図 10.1. 所有関係図

所有関係図

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

図 10.2. クラス図

クラス図

10.2.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.2.4. レスポンダの定義と実装

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

関連情報: SFR 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.2.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.2.6. イベントハンドラ

イベントハンドラは、アプリ開始や、キー押下などのイベントに応じて然るべき処理をする関数です。SophiaFramework UNIVERSE で利用可能なイベントは 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;
}