一.列表框的分类
CEikListBox类是所以的列表框的基类,由它派生出CEikTextListBox 类和CAknGrid类。严格的讲,CAknPopupList类和CAknSettingItemList类并不是列表框类,但是他们使用了列表框类。 本节将列表框粗略的分为四类。
分类 |
类 |
说明 |
普通列表框 |
CEikTextListBox |
这是使用最广泛的列表框,提供一维竖向列表。 |
网格 |
CaknGrid |
提供了二维的列表,用于紧凑的方式显示数据,支持多选功能 |
弹出式列表框 |
CaknPopupList |
底部弹出菜单的竖向列表 |
设置项列表框 |
CaknSettingItemList |
竖向列表,各个表项的值可以调节,主要设置属性 |
二、普通列表框
普通列表框继承自CEikTextListBox,根据继承关系又可以分为两类
1.分栏式列表框
分栏式列表框继承CEikColumnListBox,有如下特点:
每个列表项占一行,这里的行不是由宽度区分,而是由显示的内容是否分行区分。
每个列表项分成若干栏,各栏显示文本、数字和图标等分栏列表框,以字符串作为数据。
2.格式化单元列表框
格式化单元列表框指继承CEikFormattedCellListBox,特点如下:
每个列表项未必只占一行
每个列表项是由若干个单元构成,各单元可以显示文本、数字、时间和图标
格式化单元格列表框又可以分为三类:
双行列表框(继承AknListBoxLinesTemplate<CEikFormattedCellListBox>)。
设置式列表框(继承CEikSettingListBox).
弹出菜单式列表框(继承AknPopupListEmpty<CEikFormattedCellListBox>).
三、普通列表框开发
创建普通列表框的顺序。
1.声明列表框 2.创建列表框 3.加载列表框 4.设置图标 5.创建滚动条
1.声明列表框:
列表框对象通常作为容器控件(Container Control)的子控件,因此一般将它声明为容器控件类的成员变量,例如
...
CAknXXXListBox *iListBox; //CAknXXXListBox 可以使前面介绍的任一特定列表框类
...
此为,为了声明更加通用,可以将上面的iListBox声明为基类的对象指针,如:
...
CEikColumnListBox* iListBox; //分栏列表框
...
或者:
...
CEikFormattedCellListBox* iListBox ; //格式化单元列表框
...
2.创建列表框
第一种方法:利用资源创建,例如
...
RESOURCE LISTBOX r_mylist_listbox
{
flags = EAknListBoxSelectionList; //选择列表框类型
}
如果在创建列表框的同时要加载一些预定义的数据,可以再资源中添加列表框数组,例如:
...
RESOURCE LISTBOX r_mylist_listbox
{
flags = EAknListBoxSelectionList; //选择列表框类型
array_id = r_mylist_listbox_array; //列表项数组
}
RESOURCE ARRAY r_mylist_listbox_array //列表项数组
{
items=
{
LBUF{txt=qtn_mylist_listbox_array_item1;},
LBUF{txt=qtn_mylist_listbox_array_item2;},
LBUF{txt=qtn_mylist_listbox_array_item3;},
};
}
...
其中txt=qtn_mylist_listbox_array_item1等是在本地化文件(.loc文件)中定义的字符串,例如:
...
#define txt=qtn_mylist_listbox_array_item1 "/tItem1"
...
然后可以再代码中通过下面的方法创建列表框:
...
iListBox = new(ELeave) CAknXXXListBox; //CAknXXXListBox是前面介绍的任一特定列表框
iListBox->SetContainerWindowL(*this);
TInt resourceId = R_YMLIST_LSITBOX; //resourceId 是前面定义的列表框资源的标识
TResourceReader reader;
CEikonEnv::Static()->CreateResourceReaderLC(reader,resourceId);
iListBox->ConstructFormResourceL(reader); //创建列表框
CleanupStack::PopAndDestroy();
...
第二种方法:使用代码动态创建,这种方法不用预先自定义资源。
...
iListBox = new(ELeave) CAknXXXXListBox;
iListBox->SetContainerWindowL(*this);
TInt flags = EAknListBoxSelectionList;
iListBox->ConstructL(this,flags);
...
3.加载列表项
在创建了列表框之后,可以在代码中动态地为它添加一些列表项作为初始值。这需要用到列表框模型类。首先获取模型对象中的描述符数组,然后最加格式化的描述符(字符串):
...
CTextListBoxModel* model = iListBox->Model; //获取模型对象
CDesCArray* array = static_cast<CDesCArray*>(model->ItemTextArray()); //获取描述符数组
_LIT(KItemFormat,"/tItem%d"); //定义格式串
TBuf<32>item;
fot(TInt i = 1;i<9;i++)
{
item.Format(KItemFormat(),i); //生成格式化的字符串,i的值会取代格式串中的%d
array->AppenL(item);//追加字符串
}
...
4.设置图标
如果想在列表项中显示图标,则必须为列表框创建图标。应用程序一般通过.mbm文件提供位图,例如:
...
CGullIcon* icon = env->CreateIconL(filename,EmbmMylistG1,EMbmMylistGm1); //创建图标
icons->AppendL(icon); //追加图标
CleanupStack::Pop(icons);
CleanupStack::PopAndDestroy(filename);
//设置分栏列表框的图标数组,设置后列表框拥有该数组
iListBox->ItemDrawer()->ColumnData()->SetIconArray(icons);
//如果是格式化的单元格式框,必须使用下面的语句设置
//iListBox->ItemDrawer()->FormattedCellData()->SetIconArray(icons);
...
格式化字符串引用的序号是图标在数组中的下标,多选列表框必须拥有两个标记图标,其中表示选中状态的图标必须是图标数组的第一个元素,表示未选中状态的图标必须是图标数组的第二个元素。
注意:SDK提供的工具bmconv可以将一张或多张位图文件压缩成一个多位图文件。直接使用bmconv生成多位图文件操作起来很不方便,因为这里用.mmp文件中使用START BITMAP定义多位图文件。代码如下:
START BITMAP MySeleList.mbm
//TARGETPATH
HEADER
SOURCEPATH ../data
SOURCE C12 Star.bmp
SOURCE 2 StarMask.bmp
END
每个START BITMAP ...END 代码定义了一个多位图文件,文件名在START BITMAP后指定,而且后缀名.mbm。
TARGETPATH用于指定多位图文件的存放位置,一般不指定此参数。默认将生成的.mbm文件生成到“/system/apps/myselelist/”目录中。
HEADER表示在生成多位图文件的同时也生成相应的.mbg文件,该文件生成到SDK根目录“/epoc32/include”中。
SOURCEPATH用于指定.bmp文件所在目录,可以用相对目录
SOURCE用于指定位图文件及其属性,如果有“c”表示该位图是彩色,此时后面的数字表示位图的色深;没有“c”表示是灰度位图,后边的数字代表灰度。
可以在dos下用abld build wins udeb来编译生成。
5.创建滚动条
当列表项很多时有可能一屏显示不了,最好为列表框创建滚动条。
...
iListBox->CreateScrollBarFrameL(ETrue);
iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff,CEikScrollBarFrame::EAuto);
//自动显示竖向滚动条
...
CEikonEnv* env = CEikonEnv::Static();
CArrayPtr<CGullcon>* icons = new(ELeave)CAknIconArray(3); //创建图标数组
CleanupStack::PushL(icons);