![]() ![]() ![]()
|
BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework 4.1 |
レスポンダを区別し、検索するために、レスポンダには「タイプ」と「アトリビュート」が設定されています。
![]() |
注意 |
|---|---|
|
タイプは SFRResponder を継承する新しいレスポンダ クラスを定義するときに、four_char_code マクロ関数を使って「 4 文字リテラル」として設定可能です。 すべてが小文字の「 4 文字リテラル」は SophiaFramework で予約されています。 | |
タイプは 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 で予約されています。 | |
「振る舞い」とは、レスポンダの「状態」、「見た目」、「属性」を管理するフラグです。
■ 状態:
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 | 検索条件に一致する、一つ左の兄弟レスポンダを取得します。 |
| GetRight | 検索条件に一致する、一つ右の兄弟レスポンダを取得します。 |
| GetNext | 検索条件に一致する、一つ背面にある兄弟レスポンダを取得します。 |
| GetPrevious | 検索条件に一致する、一つ前面にある兄弟レスポンダを取得します。 |
例 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 - 2008 Sophia Cradle, Inc. All Rights Reserved. |
![]() ![]() ![]()
|