组合框控件 -- CComboBox
組合框控件 -- CComboBox
組合框其實就是把一個編輯框和一個列表框組合到了一起,分為三種:簡易(Simple)組合框、下拉式(Dropdown)組合框和下拉列表式(Drop List)組合框。Properties面板中設置type屬性。在動態創建時,BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID); 在 dwStyle中添加CBS_DROPDOWNLIST參數即可。其顯示效果分別為:
常用通知消息
組合框被操作時會向父窗口發送通知消息,這些通知消息及其含義如下:
CBN_CLOSEUP:組合框的列表框組件被關閉,簡易組合框不會發送該通知消息
CBN_DBLCLK:用戶在某列表項上雙擊鼠標,只有簡易組合框才會發送該通知消息
CBN_DROPDOWN:組合框的列表框組件下拉,簡易式組合框不會發送該通知消息
CBN_EDITUPDATE:在編輯框準備顯示改變了的正文時發送該消息,下拉列表式組合框不會發送該消息
CBN_EDITCHANGE:編輯框的內容被用戶改變了,與CBN_EDITUPDATE不同,該消息是在編輯框顯示的正文被刷新后才發出的,下拉列表式組合框不會發送該消息
CBN_ERRSPACE:組合框無法申請足夠的內存來容納列表項
CBN_SELENDCANCEL:表明用戶的選擇應該取消,當用戶在列表框中選擇了一項,然后又在組合框控件外單擊鼠標時就會導致該消息的發送
CBN_SELENDOK:用戶選擇了一項,然后按了回車鍵或單擊了下滾箭頭,該消息表明用戶確認了自己所作的選擇
CBN_KILLFOCUS:組合框失去了輸入焦點
CBN_SELCHANGE:用戶通過單擊或移動箭頭鍵改變了列表的選擇
CBN_SETFOCUS:組合框獲得了輸入焦點
其消息映射形如:
ON_CBN_SELCHANGE(IDC_COMBO_PRINTERS, &CPrintDlgAppDlg::OnCbnSelchangeComboPrinters)
ON_CBN_EDITCHANGE(IDC_COMBO_PRINTERS,
&CPrintDlgAppDlg::OnCbnEditchangeComboPrinters)
ON_CBN_CLOSEUP(IDC_COMBO_PRINTERS,
&CPrintDlgAppDlg::OnCbnCloseupComboPrinters)
ON_CBN_DROPDOWN(IDC_COMBO_PRINTERS,
&CPrintDlgAppDlg::OnCbnDropdownComboPrinters)
ON_CBN_EDITUPDATE(IDC_COMBO_PRINTERS,
&CPrintDlgAppDlg::OnCbnEditupdateComboPrinters)
ON_CBN_DBLCLK(IDC_COMBO_PRINTERS, &CPrintDlgAppDlg::OnCbnDblclkComboPrinters)
ON_CBN_ERRSPACE(IDC_COMBO_PRINTERS,
&CPrintDlgAppDlg::OnCbnErrspaceComboPrinters)
ON_CBN_SELENDCANCEL(IDC_COMBO_PRINTERS,
&CPrintDlgAppDlg::OnCbnSelendcancelComboPrinters)
ON_CBN_SELENDOK(IDC_COMBO_PRINTERS,
&CPrintDlgAppDlg::OnCbnSelendokComboPrinters)
ON_CBN_SETFOCUS(IDC_COMBO_PRINTERS,
&CPrintDlgAppDlg::OnCbnSetfocusComboPrinters)
ON_NOTIFY(NM_THEMECHANGED, IDC_COMBO_PRINTERS,
&CPrintDlgAppDlg::OnNMThemeChangedComboPrinters)
組合框控件的創建
MFC將組合框控件的所有操作都封裝到了CComboBox類中。
在對話框中加入組合框時,可以往對話框模板中拖入Combo
Box控件,然后在Properties面板中可以配置各種屬性。如果在程序中動態創建,則要使用CComboBox類的成員函數Create。Create函數的原型如下:
virtual
BOOL Create(
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID
);
其中,dwStyle指定組合框控件的風格,rect為列表框彈出后組合框的位置和尺寸,pParentWnd是指向父窗口的指針,不能為NULL,nID指定組合框控件的ID。重點是dwStyle參數,它可以指定組合框控件的風格,包括以下幾種:
CBS_AUTOHSCROLL:使編輯框組件具有水平滾動的風格
CBS_DISABLENOSCROLL:使列表框在不需要滾動時顯示一個禁止的垂直滾動條
CBS_DROPDOWN:指定一個下拉式組合框
CBS_DROPDOWNLIST:指定一個下拉列表式組合框
CBS_HASSTRINGS:指定一個含有字符串的自繪式組合框
CBS_LOWERCASE:將編輯框和列表框中的所有文本都自動轉換為小寫字符
CBS_NOINTEGRALHEIGHT:組合框的尺寸由應用程序而不是Windows
指定,通常,由Windows指定尺寸會使列表項的某些部分隱藏起來
CBS_OEMCONVERT:使編輯框組件中的正文可以在ANSI
字符集和OEM字符集之間相互轉換。這在編輯框中包含文件名時是很有用的
CBS_OWNERDRAWFIXED:指定自繪式組合框,即由父窗口負責繪制列表框的內容,并且列表項有相同的高度
CBS_OWNERDRAWVARIABLE:指定自繪式組合框,并且列表項有不同的高度
CBS_SIIMPLE:指定一個簡易組合框
CBS_SORT:自動對列表框組件中的項進行排序
CBS_UPPERCASE:將編輯框和列表框中的所有文本都自動轉換為大寫字符
dwStyle參數可以是以上風格的組合。跟其他控件一樣,創建時一般也還要指定WS_CHILD、WS_VISIBLE、WS_TABSTOP和WS_VSCROLL等風格。
在對話框模板中直接添加組合框控件時,其屬性頁中的屬性包含了以上風格,例如屬性Uppercase設為True就相當于指定了CBS_UPPERCASE風格。
CComboBox類的主要成員函數
因為組合框是由編輯框和列表框組合而成的,所以組合框的操作和編輯框與列表框的操作有很多相似之處,同樣的,CComboBox類的成員函數也和CEdit類與CListBox類的成員函數有很多相似之處,不但功能相似,甚至函數名和參數也很相似。下面是CComboBox類的主要成員函數,更詳細的內容可以參見MSDN。
int GetCount( ) const;
獲取組合框控件的列表框中列表項的數量。
int GetCurSel( ) const;
獲取組合框控件的列表框中選中項的索引,如果沒有選中任何項,該函數返回CB_ERR。
int SetCurSel(int nSelect);
在組合框控件的列表框中選擇某項。nSelect參數指定了要選擇的列表項的索引,如果為-1則列表框中當前選擇項被取消選中,編輯框也被清空。
DWORD GetEditSel( ) const;
獲取組合框控件的編輯框中當前選擇范圍的起始和終止字符的位置。該函數返回一個32位數,低16位存放起始位置,高16位存放選擇范圍后第一個非選擇字符的位置。如果該函數用于下拉列表式組合框時,會返回CB_ERR。
BOOL SetEditSel(int nStartChar,int
nEndChar);
用于在組合框控件的編輯框中選擇字符。nStartChar參數指定起始位置,nEndChar參數指定終止位置。
DWORD_PTR
GetItemData(int nIndex) const;
獲取組合框中指定項所關聯的32位數據。nIndex參數指定組合框控件的列表框某項的索引(從0開始)。
int
SetItemData(int nIndex,DWORD_PTR dwItemData);
為某個指定的組合框列表項設置一個關聯的32位數。nIndex參數指定要進行設置的列表項索引。dwItemData參數指定要關聯的新值。
void
GetLBText(int nIndex,CString& rString) const;
從組合框控件的列表框中獲取某項的字符串。nIndex參數指定要獲取字符串的列表項的索引,CString參數用于接收取到的字符串。
int GetLBTextLen(int nIndex) const;
獲取組合框控件的列表框中某項的字符串長度。nIndex參數指定要獲取字符串長度的列表項的索引。
int GetTopIndex( ) const;
獲取組合框控件的列表框中第一個可見項的索引。
int SetTopIndex(int nIndex);
將組合框控件的列表框中某個指定項設置為可見的。nIndex參數指定了該列表項的索引。該函數成功則返回0,有錯誤發生則返回CB_ERR。
BOOL
LimitText(int nMaxChars);
用于限制用戶在組合框控件的編輯框中能夠輸入的最大字節長度。nMaxChars參數指定了用戶能夠輸入文字的最大字節長度,如果為0則長度被限制為65535個字節。
int
AddString(LPCTSTR lpszString);
為組合框控件中的列表框添加新的列表項。lpszString參數是指向要添加的字符串的指針。該函數的返回值如果大于等于0,那么它就是新列表項的索引,而如果有錯誤發生則會返回CB_ERR,如果沒有足夠的內存存放新字符串則返回CB_ERRSPACE。
int
DeleteString(UINT nIndex);
刪除組合框中某指定位置的列表項。nIndex參數指定了要刪除的列表項的索引。該函數的返回值如果大于等于0,那么它就是組合框中剩余列表項的數量。如果nIndex指定的索引超出了列表項的數量則返回CB_ERR。
int
FindString(int nStartAfter,LPCTSTR lpszString) const;
在組合框控件的列表框中查找但不選中第一個包含指定前綴的列表項。nStartAfter參數指定了第一個要查找的列表項之前的那個列表項的索引。lpszString指向包含要查找的前綴的字符串。該函數的返回值如果大于等于0,那么它是匹配列表項的索引,如果查找失敗則返回CB_ERR。
int InsertString(int nIndex,LPCTSTR lpszString);
向組合框控件的列表框中插入一個列表項。nIndex參數指定了要插入列表項的位置,lpszString參數則指定了要插入的字符串。該函數返回字符串被插入的位置,如果有錯誤發生則會返回CB_ERR,如果沒有足夠的內存存放新字符串則返回CB_ERRSPACE。
int SelectString(int nStartAfter,LPCTSTR lpszString);
在組合框控件的列表框中查找一個字符串,如果查找到則選中它,并將其顯示到編輯框中。參數同FindString。如果字符串被查找到則返回此列表項的索引,如果查找失敗則返回CB_ERR,并且當前選擇項不改變。
此外,CComboBox類還繼承了CWnd類的成員函數GetWindowText、SetWindowText等。
一般在使用此控件時,初始化時需要添加相應的信息:
for (int i = 0; i < printers.size(); i++)
{
m_comboPrinters.AddString(printers.at(i));
}
m_comboPrinters.SetCurSel(0);
需要清空所有的信息時,使用
while (m_comboPrinters.GetCount() > 0)
{
m_comboPrinters.DeleteString(0);
}
參考資料
http://www.jizhuomi.com/software/189.html
總結
以上是生活随笔為你收集整理的组合框控件 -- CComboBox的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis的使用
- 下一篇: 支付宝怎么提现到银行卡