轉自:http://www.jizhuomi.com/software/186.htmlhtml
列表框控件簡介app
列表框給出了一個選項清單,容許用戶從中進行單項或多項選擇,被選中的項會高亮顯示。列表框可分爲單選列表框和多選列表框,顧名思義,單選列表框中一次只能選擇一個列表項,而多選列表框能夠同時選擇多個列表項。less
列表框也會向父窗口發送通知消息。這些通知消息及含義以下:函數
LBN_DBLCLK :用戶用鼠標雙擊了一列表項,只有具備LBS_NOTIFY 的列表框才能發送該消息
LBN_ERRSPACE :列表框不能申請足夠的動態內存來知足須要
LBN_KILLFOCUS :列表框失去輸入焦點
LBN_SELCANCEL: 當前的選擇被取消,只有具備LBS_NOTIFY 的列表框才能發送該消息
LBN_SELCHANGE:單擊鼠標選擇了一列表項,只有具備LBS_NOTIFY 的列表框才能發送該消息
LBN_SETFOCUS:列表框得到輸入焦點
WM_CHARTOITEM:當列表框收到WM_CHAR 消息後, 向父窗口發送該消息, 只有具備LBS_WANTKEYBOARDINPUT 風格的列表框纔會發送該消息
WM_VKEYTOITEM:當列表框收到WM_KEYDOWN 消息後,向父窗口發送該消息,只有具備LBS_WANTKEYBOARDINPUT 風格的列表框纔會發送該消息網站
列表框控件的建立this
MFC將列表框控件的全部操做都封裝到了CListBox類中。spa
建立列表框控件時,能夠在對話框模板中直接拖入列表框控件Listbox,而後添加控件變量使用。但若是須要動態建立列表框,就要用到CListBox類的Create成員函數了。Create成員函數的原型以下:指針
virtual BOOL Create(
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID
);code
參數rect指定了列表框的位置和尺寸,pParentWnd爲父窗口的指針,nID用於指定列表框控件的ID。最後重點講講參數dwStyle,它指定了列表框控件的風格,如下是各類風格說明:htm
LBS_EXTENDEDSEL:支持多重選擇,在點擊列表項時按住Shift 鍵或Ctrl 鍵便可選擇多個項
LBS_HASSTRINGS:指定一個含有字符串的自繪式列表框
LBS_MULTICOLUMN:指定一個水平滾動的多列列表框, 經過調用CListBox::SetColumnWidth 來設置每列的寬度
LBS_MULTIPLESEL:支持多重選擇。列表項的選擇狀態隨着用戶對該項單擊或雙擊鼠標而翻轉
LBS_NOINTEGRALHEIGHT:列表框的尺寸由應用程序而不是Windows 指定。一般,Windows指定尺寸會使列表項的某些部分隱藏起來
LBS_NOREDRAW:當選擇發生變化時防止列表框被更新,可發送消息改變該風格
LBS_NOTIFY:當用戶單擊或雙擊鼠標時通知父窗口
LBS_OWNERDRAWFIXED:指定自繪式列表框,即由父窗口負責繪製列表框的內容,而且列表項有相同的高度
LBS_OWNERDRAWVARIABLE:指定自繪式列表框,而且列表項有不一樣的高度
LBS_SORT:使插入列表框中的項按升序排列
LBS_STANDARD:至關於指定了WS_BORDER|WS_VSCROLL|LBS_SORT
LBS_USETABSTOPS:使列表框在顯示列表項時識別並擴展製表符(‘\t’),默認的製表寬度是32 個對話框單位
LBS_WANTKEYBOARDINPUT:容許列表框的父窗口接收WM_VKEYTOITEM 和WM_CHARTOITEM 消息,以響應鍵盤輸入
LBS_DISABLENOSCROLL:使列表框在不須要滾動時顯示一個禁止的垂直滾動條
dwStyle能夠是以上所列風格的組合。與其餘控件同樣,除了這些風格通常還要爲列表框控件設置WS_CHILD、WS_VISIBLE、WS_TABSTOP、WS_BORDER、WS_VSCROLL等風格。通常建立單選列表框時,風格要設置爲:WS_CHILD|WS_VISIBLE|WS_TABSTOP|LBS_STANDARD,若是不但願列表框項排序顯示則應去掉LBS_STANDARD。建立多選列表框時,只須要在單選列表框風格後添加LBS_MULTIPLESEL或LBS_EXTENDEDSEL風格。
對於對話框模板中直接添加的列表框控件,其屬性頁中的屬性包含了以上風格,例如屬性Multicolumn對應的就是LBS_MULTICOLUMN風格。
CListBox類的主要成員函數
int GetCount( ) const;
返回值:返回列表框中列表項的數目,若是發生錯誤則返回LB_ERR。
int GetSel(int nIndex) const;
參數:nIndex指定某個列表項的索引。
返回值:返回nIndex指定列表項的狀態。若是此列表項被選擇了則返回一個正值,不然返回0,若發生錯誤則返回LB_ERR。
int SetSel(int nIndex,BOOL bSelect = TRUE);
此函數只用於多選列表框,使用它能夠選擇或取消選擇指定的列表項。
參數:nIndex指定某個列表項的索引,若爲-1則至關於指定了全部列表項。bSelect爲TRUE時選擇指定列表項,不然取消選擇指定列表項。
返回值:若是發生錯誤則返回LB_ERR。
int AddString(LPCTSTR lpszItem);
此函數用來向列表框中添加字符串。若是列表框指定了LBS_SORT風格,字符串就被以排序順序插入到列表框中,若是沒有指定LBS_SORT風格,字符串就被添加到列表框的結尾。
參數:lpszItem指定了要添加的字符串。
返回值:返回字符串在列表框中添加的位置。若是發生錯誤則返回LB_ERR,內存不夠則返回LB_ERRSPACE。
int InsertString(int nIndex, LPCTSTR lpszItem);
該函數用來在列表框中的指定位置插入字符串。與AddString函數不一樣的是,InsertString函數不會致使LBS_SORT風格的列表框從新排序。不要在具備LBS_SORT風格的列表框中使用InsertString函數,以避免破壞列表項的次序。
參數:。參數nIndex 給出了插入位置(索引),若是值爲-1,則字符串將被添加到列表的末尾。參數lpszItem 指定了要插入的字符串。
返回值:返回實際的插入位置,若發生錯誤,會返回LB_ERR 或LB_ERRSPACE。
int DeleteString(UINT nIndex);
該函數用於刪除指定的列表項。
參數:nIndex 指定了要刪除項的索引。
返回值:函數的返回值爲剩下的列表項數目,若是nIndex 超過了實際的表項總數,則返回LB_ERR。
void ResetContent();
該函數用於清除全部列表項。
int GetText(int nIndex,LPTSTR lpszBuffer) const;
void GetText(int nIndex,CString& rString) const;
這兩個成員函數用於獲取指定列表項的字符串。參數nIndex 指定了列表項的索引。參數lpszBuffer 指向一個接收字符串的緩衝區。引用參數rString 則指定了接收字符串的CString對象。第一個版本的函數會返回得到的字符串的長度,若出錯,則返回LB_ERR;第二個版本的函數則不會。
int GetTextLen(int nIndex) const;
該函數返回指定列表項的字符串的字節長度。
參數:nIndex 指定了列表項的索引。
返回值:若出錯則返回LB_ERR。
int GetCurSel() const;
該函數僅適用於單選列表框,用來返回當前被選擇項的索引,若是沒有列表項被選擇或有錯誤發生,則函數返回LB_ERR。
int SetCurSel(int nSelect);
該函數僅適用於單選列表框,用來選擇指定的列表項。該函數會滾動列表框以使選擇項可見。參數nIndex 指定了列表項的索引,若爲-1,那麼將清除列表框中的選擇。若出錯函數返回LB_ERR。
int GetSelCount() const;
該函數僅用於多重選擇列表框,它返回選擇項的數目,若出錯函數返回LB_ERR。
int FindString(int nStartAfter,LPCTSTR lpszItem) const;
該函數用於對列表項進行與大小寫無關的搜索。參數nStartAfter 指定了開始搜索的位置,合理指定nStartAfter 能夠加快搜索速度,若nStartAfter 爲-1,則從頭開始搜索整個列表。參數lpszItem 指定了要搜索的字符串。函數返回與lpszItem 指定的字符串相匹配的列表項的索引,若沒有找到匹配項或發生了錯誤,則會返回LB_ERR。FindString 函數先從nStartAfter指定的位置開始搜索,若沒有找到匹配項,則會從頭開始搜索列表。只有找到匹配項,或對整個列表搜索完一遍後,搜索過程纔會中止,因此沒必要擔憂會漏掉要搜索的列表項。
int SelectString(int nStartAfter,LPCTSTR lpszItem);
該函數僅適用於單選列表框,用來選擇與指定字符串相匹配的列表項。該函數會滾動列表框以使選擇項可見。參數的意義及搜索的方法與函數FindString 相似。若是找到了匹配的項,函數返回該項的索引,若是沒有匹配的項,函數返回LB_ERR 而且當前的選擇不被改變。
CListBox類應用實例
最後給你們寫一個簡單的實例,說明CListBox的幾個成員函數及通知消息等的使用方法。此實例實現的功能:在單選列表框中顯示一個網站列表,而後在用鼠標左鍵選擇某列表項時,將選中列表項的文本顯示到編輯框中。下面是具體實現步驟:
1. 建立一個基於對話框的MFC工程,名稱設置爲「Example24」。
2. 在自動生成的對話框模板IDD_EXAMPLE24_DIALOG中,刪除「TODO: Place dialog controls here.」靜態文本控件、「OK」按鈕和「Cancel」按鈕。添加一個Listbox控件,ID設置爲IDC_WEB_LIST,Sort屬性設爲False,以取消排序顯示。再添加一個靜態文本控件和一個編輯框,靜態文本控件的Caption屬性設爲「您選擇的站點:」,編輯框的ID設爲IDC_SEL_WEB_EDIT,Read Only屬性設爲True。此時的對話框模板以下圖:
3. 爲列表框IDC_WEB_LIST添加CListBox類型的控件變量m_listBox。
4. 在對話框初始化時,咱們將站點名加入到列表框中,那麼須要修改CExample24Dlg::OnInitDialog()函數爲:
BOOL CExample24Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here
m_listBox.AddString(_T("新浪")); // 在列表框結尾添加字符串「新浪」
m_listBox.AddString(_T("雞啄米")); // 在列表框結尾添加字符串「雞啄米」
m_listBox.AddString(_T("貓撲")); // 在列表框結尾添加字符串「貓撲」
m_listBox.InsertString(2, _T("百度")); // 在列表框中索引爲2的位置插入字符串「百度」
return TRUE; // return TRUE unless you set the focus to a control
}
5. 咱們但願在選中列表項改變時,將最新的選擇項實時顯示到編輯框中,那麼這就要用到LBN_SELCHANGE通知消息。爲列表框IDC_WEB_LIST的通知消息LBN_SELCHANGE添加消息處理函數CExample24Dlg::OnLbnSelchangeWebList(),並修改以下:
void CExample24Dlg::OnLbnSelchangeWebList() { // TODO: Add your control notification handler code here
CString strText; int nCurSel; nCurSel = m_listBox.GetCurSel(); // 獲取當前選中列表項
m_listBox.GetText(nCurSel, strText); // 獲取選中列表項的字符串
SetDlgItemText(IDC_SEL_WEB_EDIT, strText); // 將選中列表項的字符串顯示到編輯框中
}
6. 運行程序,彈出結果對話框,在對話框的列表框中用鼠標改變選中項時,編輯框中的顯示會相應改變。效果圖以下:
關於列表框ListBox的講解就到此爲止了。你們若是想試驗更多的列表框成員函數,能夠在上面的小例子中加入更多的功能來體會。