Palm Programmer's Laboratory

トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

Palm OS Programmer's Companion Volume I/4-4

← 3 節に戻る ↑4 章トップへ 5 節に進む →


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 スライダーの背景の描画

 


← 3 節に戻る ↑4 章トップへ 5 節に進む →