一.列表框的分類
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);