Palm Programmer's Laboratory
Palm OS Programmer's Companion Volume I/4-13
4-13 カスタム UI オブジェクト(ガジェット)
ガジェットリソースを使用することで、カスタム UI オブジェクトを実装することができます。ガジェットリソースにはカスタムガジェットに関する基本的な情報が含まれており、ガジェットの作成者が描画やユーザー入力を処理するのに利用できます。
プログラムにおけるガジェットとのやりとりはフォーム API を使用して行ないます。この章の終わりにある「 4-18 ユーザーインターフェース API の要約 」を参照して下さい。
ガジェットは、フォーム上に定められた一意を持つ単純な矩形と考えるのがいいでしょう。ガジェットの作成者は全ての描画とイベント処理コードを準備しなければなりません。ガジェットにはデフォルトの処理というものがありません。
Palm OS 3.5 からは、拡張ガジェットを作成することができます。拡張ガジェットとは、通常のガジェットに描画とイベントハンドリングのためのコールバックルーチン( FormGadgetHandlerType )を追加したものです。コールバック関数を設定するには、FrmSetGadgetHandler 関数を使用します( コールバック関数にはガジェットのポインタが渡されるため、1つのコールバック関数を複数のガジェットに使用できます )。フォームが自身の描画、削除、あるいはガジェットオブジェクトの非表示や表示のリクエストを受信すると、フォームマネージャは指定されたガジェットハンドラ関数をコールします。フォームがガジェットのイベントを受信した場合も、同様にガジェットハンドラ関数に渡されます。
バージョン 3.5 未満では、ガジェットはコールバック関数を持ちません。そのかわり、フォームイベントハンドラにおいてガジェットを描画し、ペンダウンイベントを処理するコードを書く必要があります。リスト 4.9 に Rock Music サンプルアプリケーションのメインフォームにおけるイベントハンドラを示します。このコードでは frmOpenEvent と frmUpdateEvent に応答してガジェットを描画し、ガジェットの領域内で penDownEvent が発生した場合にはイベント処理のための関数をコールしています。リスト 4.10 に Rock Music サンプルにおけるガジェットハンドラ関数を示します。
リスト 4.9 Palm OS 3.5 未満のガジェットの例
Boolean MainViewHandleEvent(EventPtr event) { Boolean handled = false; Word objIndex; FormPtr frm; RectangleType r; switch (event->eType) { case frmOpenEvent: MainViewInit(); frm = FrmGetActiveForm (); FrmDrawForm (frm); DrawGadget(); handled = true; break; case frmUpdateEvent: frm = FrmGetActiveForm (); FrmDrawForm (frm); DrawGadget(); handled = true; break; case penDownEvent: frm = FrmGetActiveForm (); objIndex = FrmGetObjectIndex (frm, RockMusicMainInputGadget); FrmGetObjectBounds (frm, objIndex, &r); if (RctPtInRectangle (event->screenX, event->screenY, &r)) { GadgetTapped (); handled=true; } break; ... }
リスト 4.10 Palm OS 3.5 におけるガジェットの例
Boolean GadgetHandler (struct FormGadgetType *gadgetP, UInt16 cmd, void *paramP) { Boolean handled = false; switch (cmd) { case formGadgetDrawCmd: //Sent to active gadgets any time form is //drawn or redrawn. DrawGadget(); gadgetP->attr.visible = true; handled = true; break; case formGadgetHandleEventCmd: //Sent when form receives a gadget event. //paramP points to EventType structure. if (paramP->eType == frmGadgetEnterEvent) { // penDown in gadget’s bounds. GadgetTapped (); handled = true; } if (paramP->eType == frmGadgetMiscEvent) { //This event is sent by your application //when it needs to send info to the gadget } break; case formGadgetDeleteCmd: //Perform any cleanup prior to deletion. break; case formGadgetEraseCmd: //FrmHideObject takes care of this if you //return false. handled = false; break; } return handled; }