上一節講了列表框控件ListBox的使用,本節主要講解組合框控件Combo Box。組合框一樣至關常見,例如,在Windows系統的控制面板上設置語言或位置時,有不少選項,用來進行選擇的控件就是組合框控件。它爲咱們的平常操做提供了不少方便。html
Xtreme Toolkit Pro是屢獲殊榮的VC界面庫,是MFC開發中最全面界面控件套包,它提供了Windows開發所須要的11種主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。編程
組合框控件簡介less
組合框其實就是把一個編輯框和一個列表框組合到了一塊兒,分爲三種:簡易(Simple)組合框、下拉式(Dropdown)組合框和下拉列表式(Drop List)組合框。下面講講它們的區別。函數
簡易組合框中的列表框是一直顯示的,效果以下圖:網站
下拉式組合框默認不顯示列表框,只有在點擊了編輯框右側的下拉箭頭纔會彈出列表框,列表框彈出後以下圖:this
下拉列表式組合框的編輯框是不能編輯的,只能由用戶在下拉列表框中選擇了某項後,在編輯框中顯示其文本。下拉列表式組合框以下圖:url
通過上面的介紹,你們應該知道,最經常使用的當屬下拉式組合框和下拉列表式組合框了,它們在不少時候能使程序看起來更專業,更簡潔,讓用戶在進行選擇操做時更方便。.net
組合框被操做時會向父窗口發送通知消息,這些通知消息及其含義以下:指針
CBN_CLOSEUP:組合框的列表框組件被關閉,簡易組合框不會發送該通知消息
CBN_DBLCLK:用戶在某列表項上雙擊鼠標,只有簡易組合框纔會發送該通知消息
CBN_DROPDOWN:組合框的列表框組件下拉,簡易式組合框不會發送該通知消息
CBN_EDITUPDATE:在編輯框準備顯示改變了的正文時發送該消息,下拉列表式組合框不會發送該消息
CBN_EDITCHANGE:編輯框的內容被用戶改變了,與CBN_EDITUPDATE不一樣,該消息是在編輯框顯示的正文被刷新後才發出的,下拉列表式組合框不會發送該消息
CBN_ERRSPACE:組合框沒法申請足夠的內存來容納列表項
CBN_SELENDCANCEL:代表用戶的選擇應該取消,當用戶在列表框中選擇了一項,而後又在組合框控件外單擊鼠標時就會致使該消息的發送
CBN_SELENDOK:用戶選擇了一項,而後按了回車鍵或單擊了下滾箭頭,該消息代表用戶確認了本身所做的選擇
CBN_KILLFOCUS:組合框失去了輸入焦點
CBN_SELCHANGE:用戶經過單擊或移動箭頭鍵改變了列表的選擇
CBN_SETFOCUS:組合框得到了輸入焦點
組合框控件的建立
MFC將組合框控件的全部操做都封裝到了CComboBox類中。
咱們在對話框中加入組合框時,能夠往對話框模板中拖入Combo Box控件,然後添加CComboBox類型的控件變量使用,但若是咱們想在程序中動態建立的話,就要使用CComboBox類的成員函數Create了。Create函數的原型以下:
virtual BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
你們能夠看出,CComboBox類的Create成員函數同前面幾個控件類的Create成員函數很是相似,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等。
CComboBox類應用實例
最後給你們寫一個簡單的實例,說明CComboBox的幾個成員函數及通知消息等的使用方法。此實例實現的功能:在組合框中包含一個網站列表,切換組合框控件的列表框中選擇的列表項時,將新選中的列表項的文本顯示到編輯框中。下面是具體實現步驟:
1. 建立一個基於對話框的MFC工程,名稱設置爲「Example25」。
2. 在自動生成的對話框模板IDD_EXAMPLE25_DIALOG中,刪除「TODO: Place dialog controls here.」靜態文本控件、「OK」按鈕和「Cancel」按鈕。添加一個Combo Box控件,ID設置爲IDC_WEB_COMBO,Type屬性設爲Drop List,爲下拉列表式組合框,編輯框不容許用戶輸入,Sort屬性設爲False,以取消排序顯示。再添加一個靜態文本控件和一個編輯框,靜態文本控件的Caption屬性設爲「您選擇的網站:」,編輯框的ID設爲IDC_SEL_WEB_EDIT,Read Only屬性設爲True。此時的對話框模板以下圖:
3. 爲組合框IDC_WEB_COMBO添加CComboBox類型的控件變量m_comboWeb。
4. 在對話框初始化時,咱們將站點名加入到組合框中,並默認選擇第一項,那麼須要修改CExample25Dlg::OnInitDialog()函數爲:
C++代碼
BOOL CExample25Dlg::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_comboWeb.AddString(_T("雞啄米")); // 爲組合框控件的列表框添加列表項「百度」 m_comboWeb.AddString(_T("百度")); // 在組合框控件的列表框中索引爲1的位置插入列表項「新浪」 m_comboWeb.InsertString(1, _T("新浪")); // 默認選擇第一項 m_comboWeb.SetCurSel(0); // 編輯框中默認顯示第一項的文字「雞啄米」 SetDlgItemText(IDC_SEL_WEB_EDIT, _T("雞啄米")); return TRUE; // return TRUE unless you set the focus to a control }
5. 咱們但願在組合框中選中的列表項改變時,將最新的選擇項實時顯示到編輯框中,那麼這就要用到CBN_SELCHANGE通知消息。爲列表框IDC_WEB_COMBO的通知消息CBN_SELCHANGE添加消息處理函數CExample25Dlg::OnCbnSelchangeWebCombo(),並修改以下:
C++代碼
void CExample25Dlg::OnCbnSelchangeWebCombo() { // TODO: Add your control notification handler code here CString strWeb; int nSel; // 獲取組合框控件的列表框中選中項的索引 nSel = m_comboWeb.GetCurSel(); // 根據選中項索引獲取該項字符串 m_comboWeb.GetLBText(nSel, strWeb); // 將組合框中選中的字符串顯示到IDC_SEL_WEB_EDIT編輯框中 SetDlgItemText(IDC_SEL_WEB_EDIT, strWeb); }
6. 運行程序,彈出結果對話框,在對話框的組合框中改變選擇項時,編輯框中的顯示會相應改變。效果圖以下:
組合框的內容就是這些了。相對於CComboBox類數量很多的成員函數來講,本節的實例只是用到了不多的幾個,你們能夠根據上面所講試試其餘的成員函數。
轉載請標明本文地址:雞啄米