GPS 連動天文時計 アプリ "pclock" - 3 / 3 -
オリジナルコントロールを作成する
SophiaFramework UNIVERSE には、ボタンやコンボボックスなど標準コントロールが用意されていますが、独自コントロールも開発できます。
pclock では、リストボックスやカレンダー、数字のみの入力を受け付けるテキストボックスなどの独自コントロールを作成しました。
幸いなことに C++ では、再利用できる汎用的なクラスが作れます。
数値だけを入力できるテキストコントロール SGRNumberTextControl を例に、独自コントロールの作成方法を紹介します。
1. コントロールの状態
全てのコントロールは SFRControl クラスから派生しています。独自コントロールも、SFRControl を継承してクラスを作成します。
携帯アプリには、「フォーカスされた状態」と「ターゲットされた状態」があるのを注意してください。
「フォーカスされた状態」とは、コントロールを操作するために、十字キーで選択した状態のことです。SFRBrewTextControl の場合、フォーカスされると内側に黄緑色の枠が表示されます。この状態では、イベントはコントロールが配置される親レスポンダに通知されます。
「フォーカスされた状態」で「選択」キーを押すと、「ターゲットされた状態」になり、コントロールはイベントを取得できます。
これをまとめると、あるコントロールがイベントを受け取れるようになるまでに、以下の 2 つのステップを経なければなりません。
- フォーカスされる
- ターゲットされる
このままでは、ボタンを押すのに「選択」キーを 2 回押さなければならずとても不便です。
けれども、マクロを使えば、フォーカスされると直ちにターゲットされるようにできます。
2. コントロールの振る舞いを指定するマクロ
- SFMRESPONDERTYPE
- SFMRESPONDERATTRIBUTE
- SFRRESPONDERBEHAVIOR
これらのマクロの使い方を、SGRNumberTextControl のコードで見てみましょう。
// SGRNumberTextControl.hpp SFMRESPONDERTYPE(NUMBERTEXTCONTROL, TYPE_CONTROL) SFMRESPONDERATTRIBUTE( NUMBERTEXTCONTROL, four_char_code('N', 'u', 'm', 't')) SFMRESPONDERBEHAVIOR( NUMBERTEXTCONTROL, BEHAVIOR_CONTROL, STATUS_VISIBLE | PROPERTY_DIRECT, APPEARANCE_SHADOW | PROPERTY_TRAVEL | PROPERTY_SCROLLABLE)
SFMRESPONDERTYPE マクロによって、NUMBERTEXTCONTROL マクロがコントロールの振る舞いを定義するために使用されることを宣言します。そして SFMRESPONDERATTRIBUTE マクロによって、今宣言した NUMBERTEXTCONTROL と Numt という文字列を関連付けています。
ここで関連付けた Numt という 4 文字は、GetFont() などの関数でコントロールを検索するときに使用します。このとき 4 文字が全て小文字であるものは SophiaFramework UNIVERSE 内部で予約されていますので、使用できません。全て小文字にしなければ、どんな文字列を使用しても構いません。
最後に SFMRESPONDERBEHAVIOR マクロによって、NUMBERTEXTCONTROL マクロに追加する振る舞いと、削除する振る舞いとを指定します。第 3 引数が追加する振る舞い、第 4 引数が削除する振る舞いです。
SGRNumberTextControl では、フォーカスされると直ちにターゲットされるようにしたいので、第 3 引数に PROPERTY_DIRECT を指定します。スクロールは不要なので、PROPERTY_SCROLLABLE を第 4 引数に指定します。
他の PROPERTY_TRAVEL などの振る舞いを表す定数の意味は、次の通りです。
定数 | 意味 |
---|---|
STATUS_VISIBLE | 可視 / 不可視 |
STATUS_ENABLE | 操作可能 / 操作不可能 |
STATUS_FOCUS | フォーカス / 非フォーカス |
STATUS_TARGET | ターゲット / 非ターゲット |
APPEARANCE_FLOATING | フローティング ウィンドウ (予約) |
APPEARANCE_TRANSPARENT | 透過 |
APPEARANCE_SHADOW | 影 (予約) |
PROPERTY_DIRECT | 常にターゲットされた状態にする |
PROPERTY_SELECT | ターゲットされた状態では、必ず最前面に表示されるようにする |
PROPERTY_TRAVEL | 保持する子のレスポンダがフォーカスされたときに、そのレスポンダが表示されるように自動的にスクロールする |
PROPERTY_CLOSABLE | クリア キーで消去可能 |
PROPERTY_MOVABLE | 移動可能 |
PROPERTY_SCROLLABLE | スクロール可能 |
このようにして定義したマクロ (NUMBERTEXTCONTROL) を使って、コントロールの初期化を行います。
3. コントロールの初期化
コントロールの振る舞いを定義したマクロ (NUMBERTEXTCONTROL) を、コンストラクタで次のように使用します。
// SGRNumbertextControl.cpp SGRNumberTextControl::SGRNumberTextControl(/* 省略 */) : SFRControl(responder, rect, SFXMargin(3, 3, 3, 3), SFMRESPONDERFILTER(NUMBERTEXTCONTROL, BEHAVIOR_NUMBERTEXTCONTROL), ATTRIBUTE_NUMBERTEXTCONTROL), /* 省略 */ { if (_digit < 1) { _digit = 1; } ...
親クラス SFRControl のコンストラクタの4 番目の引数に、先に定義したコントロールの振る舞いを表すマクロを渡すのがポイントです。NUMBERTEXTCONTROL の前の BEHAVIOR や ATTRIBUTE という文字は、SFMRESPONDERATTRIBUTE と SFRRESPONDERBEHAVIOR マクロによって生成されます。
以上の作業により、SGRNumberTextControl は SophiaFramework UNIVERSE 標準コントロールと同じように、使う事が出来ます。
あとは、イベント ハンドラを定義し実装すれば完成です。