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

10.8. レスポンダの検索

レスポンダを区別し、検索するために、レスポンダには「タイプ」と「アトリビュート」が設定されています。

10.8.1. タイプ

タイプとは、レスポンダの種類 を区別するためのものです。

[Note] 注意

タイプは SFRResponder クラスを継承する新しいレスポンダクラスを定義するときに、four_char_code マクロ関数を使用して「4文字リテラル」として設定可能です。

小文字アルファベットまたは記号からなる4文字リテラルは SophiaFramework UNIVERSE で予約されています。 アプリ開発用には、大文字アルファベット 4 文字からなる 4 文字リテラルを利用します。

タイプは SFRResponder::GetType 関数を使用して取得します。

表 10.11. 取得できるタイプ

タイプの種類 解説
TYPE_SFRAPPLICATION アプリケーション
TYPE_SFRWINDOW ウィンドウ
TYPE_SFRDIALOG ダイアログ
TYPE_SFRMENU メニュー
TYPE_SFRCONTROL コントロール
TYPE_SFRPANE ペイン

例 10.49. レスポンダのタイプに応じた分岐処理

// 最前面のレスポンダを取得する
SFRResponderPtr responder = GetFront();

// レスポンダのタイプに応じて処理を分岐する
switch (responder->GetType()) {
    case TYPE_SFRAPPLICATION: // アプリケーション
        ...
    case TYPE_SFRWINDOW:      // ウィンドウ
        ...
    case TYPE_SFRDIALOG:      // ダイアログ
        ...
    case TYPE_SFRMENU:        // メニュー
        ...
    case TYPE_SFRCONTROL:     // コントロール
        ...
    case TYPE_SFRPANE:        // ペイン
        ...
}

10.8.2. アトリビュート

アトリビュートは個々のレスポンダを区別するためのものです。アトリビュートはレスポンダのインスタンスを作成するときに設定します。

表 10.12. 取得できるアトリビュート

アトリビュート 解説
ATTRIBUTE_SFRAPPLICATION アプリケーション
ATTRIBUTE_SFRWINDOW ウィンドウ
ATTRIBUTE_SFRPLAINWINDOW プレーンウィンドウ
ATTRIBUTE_SFRFRAMEWINDOW フレームウィンドウ
ATTRIBUTE_SFRTITLEWINDOW タイトルウィンドウ
ATTRIBUTE_SFRDIALOG ダイアログ
ATTRIBUTE_SFRPLAINDIALOG プレーンダイアログ
ATTRIBUTE_SFRFRAMEDIALOG フレームダイアログ
ATTRIBUTE_SFRTITLEDIALOG タイトルダイアログ
ATTRIBUTE_SFRMESSAGEDIALOG メッセージダイアログ
ATTRIBUTE_SFRMULTIDIALOG 選択ダイアログ
ATTRIBUTE_SFRMENU メニュー
ATTRIBUTE_SFRPLAINMENU プレーンメニュー
ATTRIBUTE_SFRFRAMEMENU フレームメニュー
ATTRIBUTE_SFRTITLEMENU タイトル メニュー
ATTRIBUTE_SFRTEXTMENU テキストメニュー
ATTRIBUTE_SFRPANE ペイン
ATTRIBUTE_SFRPLAINPANE プレーン ペイン
ATTRIBUTE_SFRTABPANE タブペイン
ATTRIBUTE_SFRCONTROL コントロール
ATTRIBUTE_SFRBUTTONCONTROL ボタンコントロール
ATTRIBUTE_SFRCHECKBOXCONTROL チェックボックスコントロール
ATTRIBUTE_SFRRADIOBUTTONCONTROL ラジオボタンコントロール
ATTRIBUTE_SFRLABELCONTROL ラベルコントロール
ATTRIBUTE_SFRCOMBOBOXCONTROL コンボボックスコントロール
ATTRIBUTE_SFREDITBOXCONTROL テキストボックスコントロール
ATTRIBUTE_SFRTABCONTROL タブコントロール
ATTRIBUTE_SFRBROWSERCONTROL 簡易ウェブブラウザコントロール

図 10.47. デフォルトで設定されているアトリビュートの例

デフォルトで設定されているアトリビュートの例

例 10.50. アトリビュートの利用

// レスポンダのアトリビュートに応じて処理を分岐する
switch (responder->GetAttribute()) {
    case ATTRIBUTE_SFRTITLEWINDOW:        // ウィンドウ
        ...
    case ATTRIBUTE_SFRBUTTONCONTROL:      // ボタン
        ...
    case ATTRIBUTE_SFRRADIOBUTTONCONTROL: // ラジオボタン
        ...
}

アトリビュートは SFRResponder::GetAttribute 関数を使用して取得します。

アトリビュートを設定すると、同じ種類のレスポンダでも個々のインスタンスを区別できます。

例 10.51. アトリビュートの定義

// アトリビュートの定義
// 第 1 引数はアトリビュート名、第2引数は four_char_code マクロ関数を使った任意の値
SFMRESPONDERATTRIBUTE(MYBUTTON1, four_char_code('B', 't', 'n', '1'))
[Note] four_char_code マクロ関数とは

4 つの 1 バイト文字から「4文字リテラル」を作るマクロ関数です。他の「4文字リテラル」と重複しないように 4 つの英数字を使用して作成します。

すべてが小文字の「4文字リテラル」は SophiaFramework UNIVERSE で予約されています。

例 10.52. アトリビュートの設定

// レスポンダの作成時に設定
SFRButtonControlPtr button1 = new SFRButtonControl(window,
                                                   SFXRectangle(10, 40, 120, 25),
                                                   "button1", 
                                                   ALIGN_CENTER,
                                                   BEHAVIOR_SFRBUTTONCONTROL,
                                                   ATTRIBUTE_MYBUTTON1);

例 10.53. アトリビュートの利用

// ボタンのアトリビュートの値に応じて処理を分岐する
switch (button->GetAttribute()) {
    case ATTRIBUTE_MYBUTTON1:
        ...
    case ATTRIBUTE_MYBUTTON2:
        ...
}

10.8.3. 振る舞い

「振る舞い」とは、レスポンダの「状態」、「見た目」、「属性」を管理するフラグです。

■ 状態:

     BEHAVIOR_NONE           : 状態について考慮しない
     STATUS_VISIBLE          : 可視であるかどうか ( 可視のときのみ描画される )
     STATUS_ENABLE           : キーイベントやその他一部のイベントに応答できるかどうか ( フォーカスできるかどうか )
     STATUS_FOCUS            : フォーカスが当たっているかどうか 
     STATUS_TARGET           : ターゲッティングされているかどうか ( キーイベントなどのイベントを受け取れるかどうか )
[Note] 注意

PROPERTY_DIRECT がセットされると、STATUS_TARGET もセットされます。

■ 見た目:

    APPEARANCE_TRANSPARENT  : 透過領域を持っているかどうか
[Warning] 警告
APPEARANCE_TRANSPARENT が設定されると、透過領域用アルゴリズムによるレンダリングのため、スピードが遅くなります。

■ 属性:

    PROPERTY_DIRECT         : ターゲッティングしなくてもイベントを受信できるかどうか 
    PROPERTY_SELECT         : 背後にあるレスポンダをターゲッティングしたときに自動的に最前面に移動させるかどうか
    PROPERTY_CLOSABLE       : クリアキーでレスポンダを破棄できるかどうか
    PROPERTY_MOVABLE        : レスポンダを移動できるかどうか
    PROPERTY_SCROLLABLE     : 仮想領域をスクロールできるかどうか
[Note] 注意

PROPERTY_DIRECT がセットされると、STATUS_TARGET もセットされます。コントロールなどのレスポンダでは、PROPERTY_DIRECT がセットされています。

ウィンドウなどのレスポンダでは、PROPERTY_SELECT がセットされています。

デフォルトでは すべてのレスポンダの PROPERTY_CLOSABLE はオフです。

デフォルトでは すべてのレスポンダの PROPERTY_MOVABLE はオフです。

デフォルトでは SFRApplication 以外のレスポンダの PROPERTY_SCROLLABLE はオフです。

PROPERTY_CLOSABLE と PROPERTY_MOVABLE は STATUS_TARGET がセットされているとき有効です。

■ 状態の遷移

  1. STATUS_VISIBLE がセットされているとき、STATUS_ENABLE が有効となる
  2. STATUS_ENABLE がセットされているとき、STATUS_FOCUS が有効となる
  3. STATUS_FOCUS がセットされているとき、STATUS_TARGET が有効となる
  4. STATUS_TARGET がセットされているとき、操作対象としてロック可能となる

図 10.48. フォーカスとターゲッティング

フォーカスとターゲッティング

10.8.4. 検索

タイプ、アトリビュート、状態を指定してレスポンダを検索できます。

例えば、ウィンドウ A の描画ハンドラ内から、ウィンドウ B にあるチェックボックスへのポインタを取得するときに使います。

[Note] 注意
状態を指定しない場合、可視で応答可能なレスポンダだけを検索対象とします。また、タイプとアトリビュートにワイルドカード( TYPE_WILDCARD、ATTRIBUTE_WILDCARD ) を指定して、全てのタイプやアトリビュートのレスポンダを検索対象にできます。

表 10.13. レスポンダを検索するための関数

関数名 解説
GetFront 検索条件に一致する、最前面の子レスポンダを取得します。
GetBack 検索条件に一致する、最背面の子レスポンダを取得します。
GetNthForward 検索条件に一致する、最前面から N 番目の子レスポンダを取得します。( 最前面 = 0, 1 つ後 = 1,... )
GetNthBackward 検索条件に一致する、最背面から N 番目の子レスポンダを取得します。( 最背面 = 0, 1 つ前 = 1,... )
GetLeft 検索条件に一致する、1つ左の兄弟レスポンダを取得します。
GetRight 検索条件に一致する、1つ右の兄弟レスポンダを取得します。
GetNext 検索条件に一致する、1つ背面にある兄弟レスポンダを取得します。
GetPrevious 検索条件に一致する、1つ前面にある兄弟レスポンダを取得します。

図 10.49. レスポンダの検索

レスポンダの検索

例 10.54. 上図レスポンダの作成

// コンストラクタの第1引数で親を設定する
SFRTitleWindowPtr window1 = new SFRTitleWindow(SFRApplication::GetInstance(),
                                               SFXRectangle(5, 10, 180, 200), 
                                               "Window 1");

SFRTitleWindowPtr window2 = new SFRTitleWindow(SFRApplication::GetInstance(),
                                               SFXRectangle(20, 50, 180, 200), 
                                               "Window 2");

SFRTitleWindowPtr window3 = new SFRTitleWindow(SFRApplication::GetInstance(), 
                                               SFXRectangle(35, 200, 200, 80), 
                                               "Window 3");

SFRButtonControlPtr button1 = new SFRButtonControl(window2,
                                                   SFXRectangle(10, 10, 120, 25), 
                                                   "button1");

SFRButtonControlPtr button2 = new SFRButtonControl(window2,
                                                   SFXRectangle(10, 40, 120, 25), 
                                                   "button2");

SFRButtonControlPtr button3 = new SFRButtonControl(window2,
                                                   SFXRectangle(10, 70, 120, 25), 
                                                   "button3");

SFRCheckboxControlPtr check1 = new SFRCheckboxControl(window2,
                                                      SFXRectangle(10, 100, 120, 25), 
                                                      "check1");

SFRRadiobuttonControlPtr radio1 = new SFRRadiobuttonControl(window3,
                                                            SFXRectangle(10, 5, 120, 20), 
                                                            "radio1");

SFRRadiobuttonControlPtr radio2 = new SFRRadiobuttonControl(window3,
                                                            SFXRectangle(10, 30, 120, 20), 
                                                            "radio2");

SFRCheckboxControlPtr check2 = new SFRCheckboxControl(window3,
                                                      SFXRectangle(100, 5, 120, 25), 
                                                      "check2");

図 10.50. 所有関係の図

所有関係の図
[Note] レスポンダの前後関係

ウィンドウは後に作成したものが上に、コントロールは先に作成したものが上になります。

この例では、ウィンドウは上から順に window3、window2、window1、コントロールは button1、button2、button3、check1 です。

最上位であるアプリケーションクラスは SFRApplication::GetInstance 関数で、最前面のウィンドウ ( window3 ) はアプリケーションクラスの GetFront 関数で取得します。

例 10.55. 最前面のレスポンダを取得する方法

SFRApplicationPtr appli = SFRApplication::GetInstance();

// window3 へのポインタを取得
// アプリケーションクラスの子の中から、最前面のレスポンダを取得する
SFRWindowPtr window3 = static_cast<SFRWindowPtr>(appli)->GetFront();

前から 2 番目のウィンドウ ( window2 ) を取得するには 2 通りあります。

例 10.56. 前から 2 番目のウィンドウを取得する方法

SFRWindowPtr window2;

// window2 へのポインタを取得する

// 方法 1 : アプリケーションクラスの子の中から、最前面から数えて 2 番目を取得する
window2 = static_cast<SFRWindowPtr>(appli)->GetNthForward(1);

// 方法 2 : window3 の兄弟を取得する
window2 = static_cast<SFRWindowPtr>(window3)->GetNext();

button1、button2、button3、check1 を取得するには window2 の子レスポンダを検索します。

例 10.57. window2 のコントロールを取得する方法

SFRButtonControlPtr button1;

// button1 へのポインタを取得する
button1 = static_cast<SFRButtonControlPtr>(window2)->GetFront();
// または GetNthForward(0)

// button2 へのポインタを取得する
button2 = static_cast<SFRButtonControlPtr>(window2)->GetNthForward(1);
// または button1->GetNext()

// button3 へのポインタを取得する
button3 = static_cast<SFRButtonControlPtr>(window2)->GetNthForward(2);
// または button2->GetNext()

// check1 へのポインタを取得する
check1 = static_cast<SFRCheckboxControlPtr>(window2)->GetNthForward(3);
// または button3->GetNext()

レスポンダが見つからない場合は null を返します。

例 10.58. レスポンダが見つからない場合

// window1 には子レスポンダがないので、responder = null となる
SFRResponderPtr responder = window1->GetFront();

レスポンダの検索関数には、タイプ、アトリビュートを指定できます。ウィンドウだけ、あるいは特定のコントロールだけの検索も可能です。

例 10.59. レスポンダの検索

// 例1: responder の子で、タイプがウィンドウである
//      最前面のレスポンダを取得する
responder->GetFront(TYPE_SFRWINDOW);

// 例2: responder の子で、タイプがコントロール、アトリビュートがボタンである
//      最前面のレスポンダを取得する
responder->GetFront(TYPE_SFRCONTROL, ATTRIBUTE_SFRBUTTONCONTROL);

// 例3: responder の子で、アトリビュートがボタンである
//      最前面のレスポンダを取得する
responder->GetFront(TYPE_WILDCARD, ATTRIBUTE_SFRBUTTONCONTROL);

レスポンダの検索関数の第 3 パラメータの「状態」として BEHAVIOR_NONE は指定すると「状態」に関係なく不可視で応答不能なレスポンダも検索します。

例 10.60. レスポンダの検索

// 例 1 : responder の子で、タイプがウィンドウである
//      最前面のレスポンダを取得する
//      可視で応答可能なレスポンダだけを対象とする( デフォルト )
responder->GetFront(TYPE_SFRWINDOW, ATTRIBUTE_WILDCARD);

// 例 2 : responder の子で、タイプがウィンドウである
//      最前面のレスポンダを取得する
//      可視・不可視などの状態に関係なく全てのレスポンダを検索対象とする
responder->GetFront(TYPE_SFRWINDOW, ATTRIBUTE_WILDCARD, BEHAVIOR_NONE);
[Note] 注意
第 3 パラメータの「状態」を指定しないと、レスポンダの検索関数は可視で応答可能なレスポンダだけを検索します。