前面兩節(jié)講了比較常用的按鈕控件,并通過(guò)按鈕控件實(shí)例說(shuō)明了具體用法。本文要講的是列表框控件(ListBox)及其使用實(shí)例。
列表框控件簡(jiǎn)介
列表框給出了一個(gè)選項(xiàng)清單,允許用戶從中進(jìn)行單項(xiàng)或多項(xiàng)選擇,被選中的項(xiàng)會(huì)高亮顯示。列表框可分為單選列表框和多選列表框,顧名思義,單選列表框中一次只能選擇一個(gè)列表項(xiàng),而多選列表框可以同時(shí)選擇多個(gè)列表項(xiàng)。
列表框也會(huì)向父窗口發(fā)送通知消息。這些通知消息及含義如下:
LBN_DBLCLK :用戶用鼠標(biāo)雙擊了一列表項(xiàng),只有具有LBS_NOTIFY 的列表框才能發(fā)送該消息
LBN_ERRSPACE :列表框不能申請(qǐng)足夠的動(dòng)態(tài)內(nèi)存來(lái)滿足需要
LBN_KILLFOCUS :列表框失去輸入焦點(diǎn)
LBN_SELCANCEL: 當(dāng)前的選擇被取消,只有具有LBS_NOTIFY 的列表框才能發(fā)送該消息
LBN_SELCHANGE:?jiǎn)螕羰髽?biāo)選擇了一列表項(xiàng),只有具有LBS_NOTIFY 的列表框才能發(fā)送該消息
LBN_SETFOCUS:列表框獲得輸入焦點(diǎn)
WM_CHARTOITEM:當(dāng)列表框收到WM_CHAR 消息后, 向父窗口發(fā)送該消息, 只有具有LBS_WANTKEYBOARDINPUT 風(fēng)格的列表框才會(huì)發(fā)送該消息
WM_VKEYTOITEM:當(dāng)列表框收到WM_KEYDOWN 消息后,向父窗口發(fā)送該消息,只有具有LBS_WANTKEYBOARDINPUT 風(fēng)格的列表框才會(huì)發(fā)送該消息
列表框控件的創(chuàng)建
MFC將列表框控件的所有操作都封裝到了CListBox類(lèi)中。
創(chuàng)建列表框控件時(shí),可以在對(duì)話框模板中直接拖入列表框控件Listbox,然后添加控件變量使用。但如果需要?jiǎng)討B(tài)創(chuàng)建列表框,就要用到CListBox類(lèi)的Create成員函數(shù)了。Create成員函數(shù)的原型如下:
virtual BOOL Create(
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID
);
參數(shù)rect指定了列表框的位置和尺寸,pParentWnd為父窗口的指針,nID用于指定列表框控件的ID。最后重點(diǎn)講講參數(shù)dwStyle,它指定了列表框控件的風(fēng)格,以下是各種風(fēng)格說(shuō)明:
LBS_EXTENDEDSEL:支持多重選擇,在點(diǎn)擊列表項(xiàng)時(shí)按住Shift 鍵或Ctrl 鍵即可選擇多個(gè)項(xiàng)
LBS_HASSTRINGS:指定一個(gè)含有字符串的自繪式列表框
LBS_MULTICOLUMN:指定一個(gè)水平滾動(dòng)的多列列表框, 通過(guò)調(diào)用CListBox::SetColumnWidth 來(lái)設(shè)置每列的寬度
LBS_MULTIPLESEL:支持多重選擇。列表項(xiàng)的選擇狀態(tài)隨著用戶對(duì)該項(xiàng)單擊或雙擊鼠標(biāo)而翻轉(zhuǎn)
LBS_NOINTEGRALHEIGHT:列表框的尺寸由應(yīng)用程序而不是Windows 指定。通常,Windows指定尺寸會(huì)使列表項(xiàng)的某些部分隱藏起來(lái)
LBS_NOREDRAW:當(dāng)選擇發(fā)生變化時(shí)防止列表框被更新,可發(fā)送消息改變?cè)擄L(fēng)格
LBS_NOTIFY:當(dāng)用戶單擊或雙擊鼠標(biāo)時(shí)通知父窗口
LBS_OWNERDRAWFIXED:指定自繪式列表框,即由父窗口負(fù)責(zé)繪制列表框的內(nèi)容,并且列表項(xiàng)有相同的高度
LBS_OWNERDRAWVARIABLE:指定自繪式列表框,并且列表項(xiàng)有不同的高度
LBS_SORT:使插入列表框中的項(xiàng)按升序排列
LBS_STANDARD:相當(dāng)于指定了WS_BORDER|WS_VSCROLL|LBS_SORT
LBS_USETABSTOPS:使列表框在顯示列表項(xiàng)時(shí)識(shí)別并擴(kuò)展制表符(‘\t’),默認(rèn)的制表寬度是32 個(gè)對(duì)話框單位
LBS_WANTKEYBOARDINPUT:允許列表框的父窗口接收WM_VKEYTOITEM 和WM_CHARTOITEM 消息,以響應(yīng)鍵盤(pán)輸入
LBS_DISABLENOSCROLL:使列表框在不需要滾動(dòng)時(shí)顯示一個(gè)禁止的垂直滾動(dòng)條
dwStyle可以是以上所列風(fēng)格的組合。與其他控件一樣,除了這些風(fēng)格一般還要為列表框控件設(shè)置WS_CHILD、WS_VISIBLE、WS_TABSTOP、WS_BORDER、WS_VSCROLL等風(fēng)格。一般創(chuàng)建單選列表框時(shí),風(fēng)格要設(shè)置為:WS_CHILD|WS_VISIBLE|WS_TABSTOP|LBS_STANDARD,如果不希望列表框項(xiàng)排序顯示則應(yīng)去掉LBS_STANDARD。創(chuàng)建多選列表框時(shí),只需要在單選列表框風(fēng)格后添加LBS_MULTIPLESEL或LBS_EXTENDEDSEL風(fēng)格。
對(duì)于對(duì)話框模板中直接添加的列表框控件,其屬性頁(yè)中的屬性包含了以上風(fēng)格,例如屬性Multicolumn對(duì)應(yīng)的就是LBS_MULTICOLUMN風(fēng)格。
CListBox類(lèi)的主要成員函數(shù)
int GetCount( ) const;
返回值:返回列表框中列表項(xiàng)的數(shù)目,如果發(fā)生錯(cuò)誤則返回LB_ERR。
int GetSel(int nIndex) const;
參數(shù):nIndex指定某個(gè)列表項(xiàng)的索引。
返回值:返回nIndex指定列表項(xiàng)的狀態(tài)。如果此列表項(xiàng)被選擇了則返回一個(gè)正值,否則返回0,若發(fā)生錯(cuò)誤則返回LB_ERR。
int SetSel(int nIndex,BOOL bSelect = TRUE);
此函數(shù)只用于多選列表框,使用它可以選擇或取消選擇指定的列表項(xiàng)。
參數(shù):nIndex指定某個(gè)列表項(xiàng)的索引,若為-1則相當(dāng)于指定了所有列表項(xiàng)。bSelect為T(mén)RUE時(shí)選擇指定列表項(xiàng),否則取消選擇指定列表項(xiàng)。
返回值:如果發(fā)生錯(cuò)誤則返回LB_ERR。
int AddString(LPCTSTR lpszItem);
此函數(shù)用來(lái)向列表框中添加字符串。如果列表框指定了LBS_SORT風(fēng)格,字符串就被以排序順序插入到列表框中,如果沒(méi)有指定LBS_SORT風(fēng)格,字符串就被添加到列表框的結(jié)尾。
參數(shù):lpszItem指定了要添加的字符串。
返回值:返回字符串在列表框中添加的位置。如果發(fā)生錯(cuò)誤則返回LB_ERR,內(nèi)存不夠則返回LB_ERRSPACE。
int InsertString(int nIndex, LPCTSTR lpszItem);
該函數(shù)用來(lái)在列表框中的指定位置插入字符串。與AddString函數(shù)不同的是,InsertString函數(shù)不會(huì)導(dǎo)致LBS_SORT風(fēng)格的列表框重新排序。不要在具有LBS_SORT風(fēng)格的列表框中使用InsertString函數(shù),以免破壞列表項(xiàng)的次序。
參數(shù):。參數(shù)nIndex 給出了插入位置(索引),如果值為-1,則字符串將被添加到列表的末尾。參數(shù)lpszItem 指定了要插入的字符串。
返回值:返回實(shí)際的插入位置,若發(fā)生錯(cuò)誤,會(huì)返回LB_ERR 或LB_ERRSPACE。
int DeleteString(UINT nIndex);
該函數(shù)用于刪除指定的列表項(xiàng)。
參數(shù):nIndex 指定了要?jiǎng)h除項(xiàng)的索引。
返回值:函數(shù)的返回值為剩下的列表項(xiàng)數(shù)目,如果nIndex 超過(guò)了實(shí)際的表項(xiàng)總數(shù),則返回LB_ERR。
void ResetContent();
該函數(shù)用于清除所有列表項(xiàng)。
int GetText(int nIndex,LPTSTR lpszBuffer) const;
void GetText(int nIndex,CString& rString) const;
這兩個(gè)成員函數(shù)用于獲取指定列表項(xiàng)的字符串。參數(shù)nIndex 指定了列表項(xiàng)的索引。參數(shù)lpszBuffer 指向一個(gè)接收字符串的緩沖區(qū)。引用參數(shù)rString 則指定了接收字符串的CString對(duì)象。第一個(gè)版本的函數(shù)會(huì)返回獲得的字符串的長(zhǎng)度,若出錯(cuò),則返回LB_ERR;第二個(gè)版本的函數(shù)則不會(huì)。
int GetTextLen(int nIndex) const;
該函數(shù)返回指定列表項(xiàng)的字符串的字節(jié)長(zhǎng)度。
參數(shù):nIndex 指定了列表項(xiàng)的索引。
返回值:若出錯(cuò)則返回LB_ERR。
int GetCurSel() const;
該函數(shù)僅適用于單選列表框,用來(lái)返回當(dāng)前被選擇項(xiàng)的索引,如果沒(méi)有列表項(xiàng)被選擇或有錯(cuò)誤發(fā)生,則函數(shù)返回LB_ERR。
int SetCurSel(int nSelect);
該函數(shù)僅適用于單選列表框,用來(lái)選擇指定的列表項(xiàng)。該函數(shù)會(huì)滾動(dòng)列表框以使選擇項(xiàng)可見(jiàn)。參數(shù)nIndex 指定了列表項(xiàng)的索引,若為-1,那么將清除列表框中的選擇。若出錯(cuò)函數(shù)返回LB_ERR。
int GetSelCount() const;
該函數(shù)僅用于多重選擇列表框,它返回選擇項(xiàng)的數(shù)目,若出錯(cuò)函數(shù)返回LB_ERR。
int FindString(int nStartAfter,LPCTSTR lpszItem) const;
該函數(shù)用于對(duì)列表項(xiàng)進(jìn)行與大小寫(xiě)無(wú)關(guān)的搜索。參數(shù)nStartAfter 指定了開(kāi)始搜索的位置,合理指定nStartAfter 可以加快搜索速度,若nStartAfter 為-1,則從頭開(kāi)始搜索整個(gè)列表。參數(shù)lpszItem 指定了要搜索的字符串。函數(shù)返回與lpszItem 指定的字符串相匹配的列表項(xiàng)的索引,若沒(méi)有找到匹配項(xiàng)或發(fā)生了錯(cuò)誤,則會(huì)返回LB_ERR。FindString 函數(shù)先從nStartAfter指定的位置開(kāi)始搜索,若沒(méi)有找到匹配項(xiàng),則會(huì)從頭開(kāi)始搜索列表。只有找到匹配項(xiàng),或?qū)φ麄€(gè)列表搜索完一遍后,搜索過(guò)程才會(huì)停止,所以不必?fù)?dān)心會(huì)漏掉要搜索的列表項(xiàng)。
int SelectString(int nStartAfter,LPCTSTR lpszItem);
該函數(shù)僅適用于單選列表框,用來(lái)選擇與指定字符串相匹配的列表項(xiàng)。該函數(shù)會(huì)滾動(dòng)列表框以使選擇項(xiàng)可見(jiàn)。參數(shù)的意義及搜索的方法與函數(shù)FindString 類(lèi)似。如果找到了匹配的項(xiàng),函數(shù)返回該項(xiàng)的索引,如果沒(méi)有匹配的項(xiàng),函數(shù)返回LB_ERR 并且當(dāng)前的選擇不被改變。
CListBox類(lèi)應(yīng)用實(shí)例
最后雞啄米給大家寫(xiě)一個(gè)簡(jiǎn)單的實(shí)例,說(shuō)明CListBox的幾個(gè)成員函數(shù)及通知消息等的使用方法。此實(shí)例實(shí)現(xiàn)的功能:在單選列表框中顯示一個(gè)網(wǎng)站列表,然后在用鼠標(biāo)左鍵選擇某列表項(xiàng)時(shí),將選中列表項(xiàng)的文本顯示到編輯框中。下面是具體實(shí)現(xiàn)步驟:
1. 創(chuàng)建一個(gè)基于對(duì)話框的MFC工程,名稱設(shè)置為“Example24”。
2. 在自動(dòng)生成的對(duì)話框模板IDD_EXAMPLE24_DIALOG中,刪除“TODO: Place dialog controls here.”靜態(tài)文本控件、“OK”按鈕和“Cancel”按鈕。添加一個(gè)Listbox控件,ID設(shè)置為IDC_WEB_LIST,Sort屬性設(shè)為False,以取消排序顯示。再添加一個(gè)靜態(tài)文本控件和一個(gè)編輯框,靜態(tài)文本控件的Caption屬性設(shè)為“您選擇的站點(diǎn):”,編輯框的ID設(shè)為IDC_SEL_WEB_EDIT,Read Only屬性設(shè)為T(mén)rue。此時(shí)的對(duì)話框模板如下圖:
3. 為列表框IDC_WEB_LIST添加CListBox類(lèi)型的控件變量m_listBox。
4. 在對(duì)話框初始化時(shí),我們將站點(diǎn)名加入到列表框中,那么需要修改CExample24Dlg::OnInitDialog()函數(shù)為:
5. 我們希望在選中列表項(xiàng)改變時(shí),將最新的選擇項(xiàng)實(shí)時(shí)顯示到編輯框中,那么這就要用到LBN_SELCHANGE通知消息。為列表框IDC_WEB_LIST的通知消息LBN_SELCHANGE添加消息處理函數(shù)CExample24Dlg::OnLbnSelchangeWebList(),并修改如下:
6. 運(yùn)行程序,彈出結(jié)果對(duì)話框,在對(duì)話框的列表框中用鼠標(biāo)改變選中項(xiàng)時(shí),編輯框中的顯示會(huì)相應(yīng)改變。效果圖如下:
關(guān)于列表框ListBox的講解就到此為止了。大家如果想試驗(yàn)更多的列表框成員函數(shù),可以在上面的小例子中加入更多的功能來(lái)體會(huì)。最后依然感謝大家對(duì)雞啄米的關(guān)注。
聯(lián)系客服