1. ListBox 的2种使用模式
A. 有一种是通过资源来加载ListItem,这种方式不用我们手动添加字符串
B. 第2种是可以动态生成ListItem。本文就主要说明第2种的使用方式.
2. 示例说明
由于我使用的是小图标单行Item样式的ListBox,所以我们需要用到一些图标。
我把每行图标设置成相同了。因为我们要用到图标。首先要用到位图资源。首先在mmp文件中定义如下的
START BITMAP images.mbm
HEADER
TARGETPATH /system/apps/demo002
SOURCEPATH ../bitmaps
SOURCE c12 listbox_icon.bmp
END
我猜测 symbian 应该是把位图资源统一生成在一个XXX.mbm的文件中,当然我们程序本身的图标却在AIF文件中。 从SOURCE 那行开始,就是我们要用到的图片的文件, c12 (应该表示12色深的),1(应该表示黑白图)。
3 . 具体代码
void Cdemo002Container::ConstructL(const TRect& aRect)
{
CreateWindowL(); // 创建窗口
iListBox = new (ELeave)CAknSingleGraphicHeadingStyleListBox() ; // C++构造
/* 2阶段构造,如果是采用 B 方式的代码,才需要 2阶段构造。如果是采用A方式 ,则不需要2阶段
* 构造, 只需另外用TReadResource从资源中加载 我们定义的LISTBOX
*/
iListBox->ConstructL(this); // 2阶段构造( A模式不需要 )
iListBox->SetContainerWindowL(*this) ; //设置自己的容器窗口
iListBox->CreateScrollBarFrameL(ETrue); //创建滚动条
iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOn,
CEikScrollBarFrame::EOn ) ; // 开启其滚动的特性
CDesCArray* itemList = new (ELeave) CDesCArrayFlat(3) ; //创建字符串数组
_LIT(KListItemFormat,"%d/t%S/t%S/t") ; //为ListItem准备好数据格式
TBuf<32> item ;
//添加字符串到数组中去。
item.Format(KListItemFormat,0,&(_L("head1")),&(_L("Item1"))) ;
itemList->AppendL(item) ;
item.Format(KListItemFormat,1,&(_L("head2")),&(_L("Item2"))) ;
itemList->AppendL(item) ;
item.Format(KListItemFormat,2,&(_L("head3")),&(_L("Item3"))) ;
itemList->AppendL(item) ;
// 把字串添加到ListBox中(MVC ,Model管理我们的数据)
iListBox->Model()->SetItemTextArray(itemList);
// 这句是让字符串被LISTBOX的Model接管,所以我们不用删除 itemList对象
iListBox->Model()->SetOwnershipType(ELbmOwnsItemArray);
//创建图标指针容器数组
CArrayPtr<CGulIcon>* iconList = new (ELeave) CAknIconArray(3);
//压入清除栈
CleanupStack::PushL(iconList);
//我们的图标存放的位置
_LIT(KIconFileName,"//system//apps//demo002//images.mbm");
//加入图标到我们的图标数组中
iconList->AppendL(iEikonEnv->CreateIconL(KIconFileName,EMbmImagesListBoxIcon));
iconList->AppendL(iEikonEnv->CreateIconL(KIconFileName,EMbmImagesListBoxIcon));
iconList->AppendL(iEikonEnv->CreateIconL(KIconFileName,EMbmImagesListBoxIcon));
// 将我们的图标添加到ListBox中
iListBox->ItemDrawer()->ColumnData()->SetIconArray(iconList);
//弹出刚入栈的iconList
CleanupStack::Pop() ;
//更新LISTBOX
iListBox->HandleItemAdditionL() ; //update listbox
//设置LISTBOX控件的区域,没有这句,我们看不到listbox,嘿嘿
iListBox->SetRect(aRect);
SetRect(aRect);
ActivateL();
}
4 .
总的来说。字符串 和图标 分别添加 到Model,和ItemDrawer中。
好像LISTBOX可以设置自己的ItemDrawer,这意味着我们可以自己来绘制listitem项。。