SophiaFramework UNIVERSE 5.3 |
レスポンダを区別し、検索するために、レスポンダには「タイプ」と「アトリビュート」が設定されています。
注意 | |
---|---|
タイプは 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.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.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'))
four_char_code マクロ関数とは | |
---|---|
4 つの 1 バイト文字から「4文字リテラル」を作るマクロ関数です。他の「4文字リテラル」と重複しないように 4 つの英数字を使用して作成します。 すべてが小文字の「4文字リテラル」は SophiaFramework UNIVERSE で予約されています。 |
「振る舞い」とは、レスポンダの「状態」、「見た目」、「属性」を管理するフラグです。
■ 状態:
BEHAVIOR_NONE : 状態について考慮しない STATUS_VISIBLE : 可視であるかどうか ( 可視のときのみ描画される ) STATUS_ENABLE : キーイベントやその他一部のイベントに応答できるかどうか ( フォーカスできるかどうか ) STATUS_FOCUS : フォーカスが当たっているかどうか STATUS_TARGET : ターゲッティングされているかどうか ( キーイベントなどのイベントを受け取れるかどうか )
注意 | |
---|---|
PROPERTY_DIRECT がセットされると、STATUS_TARGET もセットされます。 |
■ 見た目:
APPEARANCE_TRANSPARENT : 透過領域を持っているかどうか
警告 | |
---|---|
APPEARANCE_TRANSPARENT が設定されると、透過領域用アルゴリズムによるレンダリングのため、スピードが遅くなります。 |
■ 属性:
PROPERTY_DIRECT : ターゲッティングしなくてもイベントを受信できるかどうか PROPERTY_SELECT : 背後にあるレスポンダをターゲッティングしたときに自動的に最前面に移動させるかどうか PROPERTY_CLOSABLE : クリアキーでレスポンダを破棄できるかどうか PROPERTY_MOVABLE : レスポンダを移動できるかどうか PROPERTY_SCROLLABLE : 仮想領域をスクロールできるかどうか
注意 | |
---|---|
PROPERTY_DIRECT がセットされると、STATUS_TARGET もセットされます。コントロールなどのレスポンダでは、PROPERTY_DIRECT がセットされています。 ウィンドウなどのレスポンダでは、PROPERTY_SELECT がセットされています。 デフォルトでは すべてのレスポンダの PROPERTY_CLOSABLE はオフです。 デフォルトでは すべてのレスポンダの PROPERTY_MOVABLE はオフです。 デフォルトでは SFRApplication 以外のレスポンダの PROPERTY_SCROLLABLE はオフです。 PROPERTY_CLOSABLE と PROPERTY_MOVABLE は STATUS_TARGET がセットされているとき有効です。 |
■ 状態の遷移
タイプ、アトリビュート、状態を指定してレスポンダを検索できます。
例えば、ウィンドウ A の描画ハンドラ内から、ウィンドウ B にあるチェックボックスへのポインタを取得するときに使います。
注意 | |
---|---|
状態を指定しない場合、可視で応答可能なレスポンダだけを検索対象とします。また、タイプとアトリビュートにワイルドカード( 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.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");
レスポンダの前後関係 | |
---|---|
ウィンドウは後に作成したものが上に、コントロールは先に作成したものが上になります。 この例では、ウィンドウは上から順に 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);
注意 | |
---|---|
第 3 パラメータの「状態」を指定しないと、レスポンダの検索関数は可視で応答可能なレスポンダだけを検索します。 |
Copyright(c) 2002 - 2024 Sophia Cradle Incorporated All Rights Reserved. |