Palm Programmer's Laboratory
Palm OS Programmer's Companion Volume I/4-4
4-4 コントロール
アプリケーションのフォームにコントロールを追加すれば、ユーザーに対話的な操作をさせることができます。コントロールオブジェクトにおけるイベントは、CtlHandleEvent で処理されます。コントロールオブジェクトにはいくつかの種類があります。このセクションではそれらについて説明します。
- NOTE
- Palm OS 3.5 以降ではチェックボックス以外の全てのコントロールでグラフィカルコントロールがサポートされるようになりました。グラフィカルコントロールはグラフィカルでないタイプのコントロールと同じように使えますが、テキストラベルのかわりにビットマップを表示します。Palm OS 3.5 未満のリリースでは、テキストラベルに空文字列を設定してビットマップの上にそのコントロールを表示することでグラフィカルコントロールを実現できます。
ボタン
ボタン( 図 4.8 参照 )はボックスの中にテキストかグラフィックのラベルを表示します。ボタンのデフォルトのスタイルでは、角の丸い矩形の中に中央揃えでテキスト文字列を表示します。矩形フレームを指定しない限り、ボタンは丸い角をもちます。フレームなしのボタンでは、タップしたときに矩形領域が反転されます。
ユーザーがペンでボタンをタップすると、ボタンはユーザーがペンを離すかボタンの外側までペンをドラッグするまでハイライト表示されます。
表 4.5 に、ユーザーがボタンを操作したときに生成されるシステムイベントとそれに対する CtlHandleEvent の応答を示します。
図 4.8 ボタン
表 4.5 ボタンのイベントフロー
ユーザー操作 | システムの応答 | CtlHandleEvent の応答 |
---|---|---|
ボタンをペンで押下 | penDownEvent と x & y 座標を EventType に設定 | ctlEnterEvent をイベントキューに追加 |
ボタン ID の ctlEnterEvent | ボタンの表示を反転 | |
ペンをボタンから離す | penUpEvent と x & y 座標を EventType に設定 | ctlSelectEvent をイベントキューに追加 |
ペンをボタンの外側で離す | penUpEvent と x & y 座標を EventType に設定 | ctlExitEvent をイベントキューに追加 |
ポップアップトリガー
ポップアップトリガー( 図 4.9 参照 )はテキストラベルとグラフィック要素( 常にテキストの左側 )に表示し、コントロールがポップアップリストを提供することを示します。テキストラベルが変更されると、コントロールの幅は新しいラベルとグラフィック要素をあわせた幅に拡縮されます。
表 4.6 に、ユーザーがポップアップトリガーを操作したときに生成されるシステムイベントとそれに対する CtlHandleEvent の応答を示します。ポップアップトリガーはリストオブジェクトを表示するため、この章の「 4-8 リスト 」も参照してください。
図 4.9 ポップアップトリガー
表 4.6 ポップアップトリガーのイベントフロー
ユーザー操作 | システムの応答 | CtlHandleEvent の応答 |
---|---|---|
ポップアップトリガーをペンで押下 | penDownEvent と x & y 座標を EventType に設定 | ctlEnterEvent をイベントキューに追加 |
ポップアップトリガーの ID の ctlEnterEvent | トリガーの表示を反転 | |
ペンをポップアップトリガーから離す | penUpEvent と x & y 座標を EventType に設定 | ctlSelectEvent をイベントキューに追加 |
ポップアップトリガーの ID の ctlEnterEvent | リストオブジェクトウィンドウへの winEnterEvent をイベントキューに追加。コントロールが FrmHandleEvent に渡るとリストが表示されて popSelectEvent がイベントキューに追加。その後コントロールは LstHandleEvent に渡る。 | |
ペンをポップアップトリガーの外側で離す | penUpEvent と x & y 座標を EventType に設定 | ctlExitEvent をイベントキューに追加 |
- TIP
- Constructor for Palm OS でポップアップリストを作成するには、まずポップアップトリガーをフォームに追加し、次にリストを同じ座標に追加します。リストのリソース設定で usable チェックボックスを外し、ポップアップトリガーのリスト ID 欄にリストリソースの ID を入力します。
セレクタトリガー
セレクタトリガー( 図 4.10 参照 )は灰色の矩形フレームに囲まれたテキストラベルを表示します。テキストラベルが変更されると、コントロールの幅は新しいラベルの幅にあわせて拡縮されます。
表 4.7 に、ユーザーがセレクタトリガーを操作したときに生成されるシステムイベントとそれに対する CtlHandleEvent の応答を示します。
図 4.10 セレクタトリガー
表 4.7 セレクタトリガーのイベントフロー
ユーザー操作 | システムの応答 | CtlHandleEvent の応答 |
---|---|---|
セレクタトリガーをペンで押下 | penDownEvent と x & y 座標を EventType に設定 | ctlEnterEvent をイベントキューに追加 |
セレクタトリガーの ID の ctlEnterEvent | セレクタトリガーの表示を反転 | |
ペンをセレクタトリガーから離す | penUpEvent と x & y 座標を EventType に設定 | ctlSelectEvent をイベントキューに追加 |
セレクタトリガーの ID の ctlSelectEvent | frmOpenEvent に続いて winExitEvent をイベントキューに追加。コントロールはフォームオブジェクトに渡される。 |
リピートボタン
リピートコントロールはボタンに似ています。しかし、ボタンとは対照的に、コントロールが選択されている状態でペンを離さなければ繰り返しリピートコントロールを選択できます。リピートコントロールはペンを離すまで繰り返し選択されます。
表 4.8 に、ユーザーがリピートボタンを操作したときに生成されるシステムイベントとそれに対する CtlHandleEvent の応答を示します。
表 4.8 リピートボタンのイベントフロー
ユーザー操作 | システムの応答 | CtlHandleEvent の応答 |
---|---|---|
リピートボタンをペンで押下 | penDownEvent と x & y 座標を EventType に設定 | ctlEnterEvent をイベントキューに追加 |
ボタン ID の ctlEnterEvent | ctlRepeatEvent をイベントキューに追加 | |
ペンがリピートボタンを押し続けている | ctlRepeatEvent | 一定時間ペンを追跡し、ペンがコントロールの領域内にあり続ければ次の ctlRepeatEvent を発行。 |
ペンをドラッグしてボタンから離す | ctlRepeatEvent は発生しない。 | |
ペンをドラッグしてボタン上に戻す | ctlRepeatEvent | 上記参照 |
ペンをボタンから離す | penUpEvent と x & y 座標を EventType に設定 | ctlExitEvent をイベントキューに追加 |
プッシュボタン
プッシュボタン( 図 4.11 参照 )ボタンに似ています。しかし、通常フレームのコーナーは角張っています。ペンでプッシュボタンに触れると領域が反転します。領域内でペンを離しても、ボタンは反転したままです。
表 4.9 に、ユーザーがプッシュボタンを操作したときに生成されるシステムイベントとそれに対する CtlHandleEvent の応答を示します。
図 4.11 プッシュボタン
表 4.9 プッシュボタンのイベントフロー
ユーザー操作 | システムの応答 | CtlHandleEvent の応答 |
---|---|---|
プッシュボタンをペンで押下 | penDownEvent と x & y 座標を EventType に設定 | ctlEnterEvent をイベントキューに追加 |
ボタン ID の ctlEnterEvent | プッシュボタンがグループの一部でハイライト済みであればなにもしない。プッシュボタンがグループの一部でなくハイライトされていれば、ハイライトを解除。 | |
ペンをプッシュボタンから離す | penUpEvent と x & y 座標を EventType に設定 | ctlSelectEvent をイベントキューに追加 |
チェックボックス
チェックボックス( 図 4.12 参照 )は、オン(チェック状態)かオフ(未チェック状態)の設定を表示します。ペンでチェックボックスに触れると、設定を切り替えることができます。チェックボックスは四角形として表示され、設定がオンであればチェックマークが付きます。チェックボックスにはテキストラベルをつけることができます。ラベルを選択することでもチェック状態を切り替えることができます。
表 4.10 に、ユーザーがチェックボックスを操作したときに生成されるシステムイベントとそれに対する CtlHandleEvent の応答を示します。
図 4.12 チェックボックス
表 4.10 チェックボックスのイベントフロー
ユーザー操作 | システムの応答 | CtlHandleEvent の応答 |
---|---|---|
チェックボックスをペンで押下 | penDownEvent と x & y 座標を EventType に設定 | ctlEnterEvent をイベントキューに追加 |
チェックボックスの ID の ctlEnterEvent | ユーザーが離すまでペンを追跡 | |
ペンをチェックボックスから離す | penUpEvent と x & y 座標を EventType に設定 | (1) チェックボックスが未チェックならばチェック (2) チェックボックスが既にチェック状態でグループの一部ならばなにもしない (3) チェックボックスが既にチェック状態でグループの一部でなければ、チェック状態を解除 |
ctlSelectEvent をイベントキューに追加 | ||
ペンがチェックボックスの外側で離す | penUpEvent と x & y 座標を EventType に設定 | ctlExitEvent をイベントキューに追加 |
スライダーとフィードバックスライダー
Palm OS 3.5 より、スライダーコントロール( 図 4.13 参照 )がサポートされるようになりました。スライダーは一定範囲に収まる値を表現します。例えば、スライダーで 0 〜 10 までの間で選択できる値を表現できます。
図 4.13 Slider
スライダーコントロールには4つの属性があります。
- スライダーが表すことのできる最小値。
- スライダーが表すことのできる最大値。
- 現在値。
- ページジャンプ値。つまり、スライダーのつまみの左右をタップした際に増減する量。
Palm OS は2種類のスライダーをサポートしています。通常のスライダーとフィードバックスライダーです。スライダーとフィードバックスライダーは見た目は似ていますが、挙動は異なります。具体的には、通常のスライダーコントロールはユーザーがつまみをドラッグしている間はイベントを発生しません。フィードバックスライダーはペンを離したかどうかに関わまず、つまみが1ピクセル動くたびにイベントを送信します。
表 4.11 に、ユーザーがスライダーを操作したときに生成されるシステムイベントとそれに対する CtlHandleEvent の応答を示します。
表 4.11 スライダーのイベントフロー
ユーザー操作 | システムの応答 | CtlHandleEvent の応答 |
---|---|---|
スライダーの背景をペンでタップ | penDownEvent と x & y 座標を EventType に設定 | ctlEnterEvent をイベントキューに追加 |
スライダーの ID の ctlEnterEvent | 現在値に対してページジャンプ値を加減算し、新しい現在値で ctlSelectEvent をイベントキューに追加 | |
スライダーのつまみをペンで押下 | penDownEvent と x & y 座標を EventType に設定 | ctlEnterEvent をイベントキューに追加 |
スライダーの ID の ctlEnterEvent | ペンを追跡 | |
スライダーのつまみをペンで左右にドラッグ | ペンの追跡を続行 | |
ペンをスライダーから離す | penUpEvent と x & y 座標を EventType に設定 | スライダーの領域内であればスライダーの ID と新しい現在値で ctlSelectEvent をイベントキューに追加 |
スライダーの領域外であれば ctlExitEvent をイベントキューに追加 |
表 4.12 に、ユーザーがフィードバックスライダーを操作したときに生成されるシステムイベントとそれに対する CtlHandleEvent の応答を示します。
表 4.12 フィードバックスライダーのイベントフロー
ユーザー操作 | システムの応答 | CtlHandleEvent の応答 |
---|---|---|
スライダーの背景をペンでタップ | penDownEvent と x & y 座標を EventType に設定 | ctlEnterEvent をイベントキューに追加 |
スライダーの ID の ctlEnterEvent | 現在値に対してページジャンプ値を加減算し、新しい現在値で ctlRepeatEvent をイベントキューに追加 | |
ctlRepeatEvent | 現在値に対し、つまみがペン位置に到達するかスライダーの最大値または最小値に到達するまで繰り返しページジャンプ値を加減算し、スライダーの ID と新しい現在値で ctlSelectEvent をイベントキューに追加 | |
スライダーのつまみをペンで押下 | penDownEvent と x & y 座標を EventType に設定 | ctlEnterEvent をイベントキューに追加 |
スライダーの ID の ctlEnterEvent | ペンを追跡し、表示を更新 | |
スライダーのつまみをペンで左右にドラッグ | スライダーの ID と新しい現在値の ctlRepeatEvent | ペンを追跡し、ペンが左右に動くたびに領域内であれば ctlRepeatEvent を発行 |
ペンを垂直方向へスライダーの外側にドラッグ | スライダーの ID と古い現在値の ctlRepeatEvent | |
ペンをドラッグしてスライダー上に戻す | スライダーの ID と新しい現在値の ctlRepeatEvent | |
ペンをスライダーから離す | penUpEvent と x & y 座標を EventType に設定 | ctlExitEvent をイベントキューに追加 |
スライダーは2つのビットマップを使って描画されます。1つはスライダーの背景で、もう1つはつまみです。スライダーの描画にはデフォルトのビットマップを使うこともできますし、スライダーを作成する際に独自のビットマップを指定することもできます。
ユーザー指定の背景画像は、スライダーの領域よりも小さくすることができます。これにより、異なるサイズのスライダーに1つのビットマップを使用できます。背景画像がスライダー領域の高さに一致しなければ、画像は矩形領域内で垂直方向の中央に配置されます。背景画像がスライダー領域の幅に一致しなければ、ビットマップは2回に分けて描画されます。まず最初に、領域矩形の左半分に左端を合わせ、矩形の幅の左半分を描画します。次に、領域矩形の右半分に右端を合わせ、矩形の幅の右半分を描画します( 図 4.14 参照 )。これにより、指定する背景ビットマップは最低でもスライダーの幅の半分は必要になることに注意して下さい。
図 4.14 スライダーの背景の描画