LstSetListChoices関数による動的なリストは、文字列配列を元に作成するので簡単にできますが、 項目の追加・削除するのに文字列を作り直さなければいけないし、 1つの文字列しか表示することができません。
リスト項目としてより多くの情報を表示させたり、リスト項目の追加・削除を自由にしたい場合には、 LstSetDrawFunction関数を使い、リストの内容を自由に描画することができます。
サンプル画面
ヘッダファイル
#define MainForm 1000 #define MainList 1001 |
リソースファイル
FORM ID MainForm AT (0 0 160 160) NOFRAME BEGIN TITLE "Dynamic List" LIST "" ID MainList AT (1 16 158 AUTO) FONT 0 VISIBLEITEMS 13 END |
イベントハンドラ
UInt16 gNum = 4; /* リスト描画用コールバック */ static void DrawOneLine( Int16 itemNum, /* I:リスト行数(0〜) */ RectanglePtr bounds, /* I:描画領域 */ CharPtr* itemText) /* I:リスト項目 */ { Char buff[3]; CharPtr listTable[] = { "One", "Two", "Three", "Four" }; if (0 <= itemNum && gNum > itemNum) /* リスト項目が0〜3の間? */ { /* リスト項目の描画 */ StrIToA(buff, itemNum + 1); WinDrawChars(buff, StrLen(buff), bounds->topLeft.x, bounds->topLeft.y); WinDrawChars(listTable[itemNum], StrLen(listTable[itemNum]), bounds->topLeft.x + 10, bounds->topLeft.y); } } Boolean MainFormHandleEvent( EventPtr pEvent) /* I:イベント */ { Boolean handled = false; FormPtr pForm; ListPtr pList; switch (pEvent->eType) { case frmOpenEvent: /* フォームオープンイベント */ pForm = FrmGetActiveForm(); pList = (ListPtr)FrmGetObjectPtr(pForm, FrmGetObjectIndex(pForm, MainList)); LstSetDrawFunction(pList, DrawOneLine); /* リスト描画ファンクション設定 */ LstSetListChoices(pList, NULL, gNum); /* リストの項目数を設定 */ FrmDrawForm(pForm); break; default: break; } return handled; } |
LstSetDrawFunction関数の第2引数に、リストの1項目を描画するコールバック関数を指定します。
コールバック関数はリストの描画が必要になった時に、Palm OSから呼び出されます。
第1引数に描画すべきリストの行、
第2引数に描画する矩形領域、
第3引数に、リスト項目のテキストポインタの配列へのポインタ
が渡されます。
'05/6/10 新規作成
Copyright (c) 2005-2006 kasa0 All rights reserved.