轉自:http://www.jizhuomi.com/software/186.html
清單框控件簡介
清單框給出了一個選項清單,允許使用者從中進行單項或多項選擇,被選中的項會高亮顯示。清單框可分為單選清單框和多選清單框,顧名思義,單選清單框中一次隻能選擇一個清單項,而多選清單框可以同時選擇多個清單項。
清單框也會向父視窗發送通知消息。這些通知消息及含義如下:
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 風格的清單框才會發送該消息
清單框控件的建立
MFC将清單框控件的所有操作都封裝到了CListBox類中。
建立清單框控件時,可以在對話框模闆中直接拖入清單框控件Listbox,然後添加控件變量使用。但如果需要動态建立清單框,就要用到CListBox類的Create成員函數了。Create成員函數的原型如下:
virtual BOOL Create(
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID
);
參數rect指定了清單框的位置和尺寸,pParentWnd為父視窗的指針,nID用于指定清單框控件的ID。最後重點講講參數dwStyle,它指定了清單框控件的風格,以下是各種風格說明:
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()函數為:
C++代碼
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的講解就到此為止了。大家如果想試驗更多的清單框成員函數,可以在上面的小例子中加入更多的功能來體會。
轉載于:https://www.cnblogs.com/Tang-tangt/p/9460061.html