一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

VS2010/MFC編程入門(mén)之二十五(常用控件:組合框控件Combo Box)

 牛人的尾巴 2015-10-27

       上一節(jié)雞啄米講了列表框控件ListBox的使用,本節(jié)主要講解組合框控件Combo Box。組合框同樣相當(dāng)常見(jiàn),例如,在Windows系統(tǒng)的控制面板上設(shè)置語(yǔ)言或位置時(shí),有很多選項(xiàng),用來(lái)進(jìn)行選擇的控件就是組合框控件。它為我們的日常操作提供了很多方便。

       組合框控件簡(jiǎn)介

       組合框其實(shí)就是把一個(gè)編輯框和一個(gè)列表框組合到了一起,分為三種:簡(jiǎn)易(Simple)組合框、下拉式(Dropdown)組合框和下拉列表式(Drop List)組合框。下面講講它們的區(qū)別。

       簡(jiǎn)易組合框中的列表框是一直顯示的,效果如下圖:

VS2010/MFC編程入門(mén)之二十五(常用控件:組合框控件Combo Box)

       下拉式組合框默認(rèn)不顯示列表框,只有在點(diǎn)擊了編輯框右側(cè)的下拉箭頭才會(huì)彈出列表框,列表框彈出后如下圖:

VS2010/MFC編程入門(mén)之二十五(常用控件:組合框控件Combo Box)

       下拉列表式組合框的編輯框是不能編輯的,只能由用戶(hù)在下拉列表框中選擇了某項(xiàng)后,在編輯框中顯示其文本。下拉列表式組合框如下圖:

VS2010/MFC編程入門(mén)之二十五(常用控件:組合框控件Combo Box)

       經(jīng)過(guò)上面的介紹,大家應(yīng)該知道,最常用的當(dāng)屬下拉式組合框和下拉列表式組合框了,它們?cè)诤芏鄷r(shí)候能使程序看起來(lái)更專(zhuān)業(yè),更簡(jiǎn)潔,讓用戶(hù)在進(jìn)行選擇操作時(shí)更方便。

       組合框被操作時(shí)會(huì)向父窗口發(fā)送通知消息,這些通知消息及其含義如下:

       CBN_CLOSEUP:組合框的列表框組件被關(guān)閉,簡(jiǎn)易組合框不會(huì)發(fā)送該通知消息
       CBN_DBLCLK:用戶(hù)在某列表項(xiàng)上雙擊鼠標(biāo),只有簡(jiǎn)易組合框才會(huì)發(fā)送該通知消息
       CBN_DROPDOWN:組合框的列表框組件下拉,簡(jiǎn)易式組合框不會(huì)發(fā)送該通知消息
       CBN_EDITUPDATE:在編輯框準(zhǔn)備顯示改變了的正文時(shí)發(fā)送該消息,下拉列表式組合框不會(huì)發(fā)送該消息
       CBN_EDITCHANGE:編輯框的內(nèi)容被用戶(hù)改變了,與CBN_EDITUPDATE不同,該消息是在編輯框顯示的正文被刷新后才發(fā)出的,下拉列表式組合框不會(huì)發(fā)送該消息
       CBN_ERRSPACE:組合框無(wú)法申請(qǐng)足夠的內(nèi)存來(lái)容納列表項(xiàng)
       CBN_SELENDCANCEL:表明用戶(hù)的選擇應(yīng)該取消,當(dāng)用戶(hù)在列表框中選擇了一項(xiàng),然后又在組合框控件外單擊鼠標(biāo)時(shí)就會(huì)導(dǎo)致該消息的發(fā)送
       CBN_SELENDOK:用戶(hù)選擇了一項(xiàng),然后按了回車(chē)鍵或單擊了下滾箭頭,該消息表明用戶(hù)確認(rèn)了自己所作的選擇
       CBN_KILLFOCUS:組合框失去了輸入焦點(diǎn)
       CBN_SELCHANGE:用戶(hù)通過(guò)單擊或移動(dòng)箭頭鍵改變了列表的選擇
       CBN_SETFOCUS:組合框獲得了輸入焦點(diǎn)

       組合框控件的創(chuàng)建

      MFC將組合框控件的所有操作都封裝到了CComboBox類(lèi)中。

       我們?cè)趯?duì)話(huà)框中加入組合框時(shí),可以往對(duì)話(huà)框模板中拖入Combo Box控件,而后添加CComboBox類(lèi)型的控件變量使用,但如果我們想在程序中動(dòng)態(tài)創(chuàng)建的話(huà),就要使用CComboBox類(lèi)的成員函數(shù)Create了。Create函數(shù)的原型如下:

virtual BOOL Create(
   DWORD dwStyle,
   const RECT& rect,
   CWnd* pParentWnd,
   UINT nID
);

       大家可以看出,CComboBox類(lèi)的Create成員函數(shù)同前面幾個(gè)控件類(lèi)的Create成員函數(shù)非常類(lèi)似,dwStyle指定組合框控件的風(fēng)格,rect為列表框彈出后組合框的位置和尺寸,pParentWnd是指向父窗口的指針,不能為NULL,nID指定組合框控件的ID。最后還是重點(diǎn)講講dwStyle參數(shù)。組合框控件的風(fēng)格包括以下幾種,并給出了相應(yīng)說(shuō)明:

       CBS_AUTOHSCROLL:使編輯框組件具有水平滾動(dòng)的風(fēng)格
       CBS_DISABLENOSCROLL:使列表框在不需要滾動(dòng)時(shí)顯示一個(gè)禁止的垂直滾動(dòng)條
       CBS_DROPDOWN:指定一個(gè)下拉式組合框
       CBS_DROPDOWNLIST:指定一個(gè)下拉列表式組合框
       CBS_HASSTRINGS:指定一個(gè)含有字符串的自繪式組合框
       CBS_LOWERCASE:將編輯框和列表框中的所有文本都自動(dòng)轉(zhuǎn)換為小寫(xiě)字符
       CBS_NOINTEGRALHEIGHT:組合框的尺寸由應(yīng)用程序而不是Windows 指定,通常,由Windows指定尺寸會(huì)使列表項(xiàng)的某些部分隱藏起來(lái)
       CBS_OEMCONVERT:使編輯框組件中的正文可以在ANSI 字符集和OEM字符集之間相互轉(zhuǎn)換。這在編輯框中包含文件名時(shí)是很有用的
       CBS_OWNERDRAWFIXED:指定自繪式組合框,即由父窗口負(fù)責(zé)繪制列表框的內(nèi)容,并且列表項(xiàng)有相同的高度
       CBS_OWNERDRAWVARIABLE:指定自繪式組合框,并且列表項(xiàng)有不同的高度
       CBS_SIIMPLE:指定一個(gè)簡(jiǎn)易組合框
       CBS_SORT:自動(dòng)對(duì)列表框組件中的項(xiàng)進(jìn)行排序
       CBS_UPPERCASE:將編輯框和列表框中的所有文本都自動(dòng)轉(zhuǎn)換為大寫(xiě)字符

       dwStyle參數(shù)可以是以上風(fēng)格的組合。跟其他控件一樣,創(chuàng)建時(shí)一般也還要指定WS_CHILD、WS_VISIBLE、WS_TABSTOP和WS_VSCROLL等風(fēng)格。

       在對(duì)話(huà)框模板中直接添加組合框控件時(shí),其屬性頁(yè)中的屬性包含了以上風(fēng)格,例如屬性Uppercase設(shè)為T(mén)rue就相當(dāng)于指定了CBS_UPPERCASE風(fēng)格。

       CComboBox類(lèi)的主要成員函數(shù)

      因?yàn)榻M合框是由編輯框和列表框組合而成的,所以組合框的操作和編輯框與列表框的操作有很多相似之處,同樣的,CComboBox類(lèi)的成員函數(shù)也和CEdit類(lèi)與CListBox類(lèi)的成員函數(shù)有很多相似之處,不但功能相似,甚至函數(shù)名和參數(shù)也很相似。雞啄米下面大概講解下CComboBox類(lèi)的主要成員函數(shù),更詳細(xì)的內(nèi)容可以參見(jiàn)MSDN。

       int GetCount( ) const;
       獲取組合框控件的列表框中列表項(xiàng)的數(shù)量。

       int GetCurSel( ) const;
       獲取組合框控件的列表框中選中項(xiàng)的索引,如果沒(méi)有選中任何項(xiàng),該函數(shù)返回CB_ERR。

       int SetCurSel(int nSelect);
       在組合框控件的列表框中選擇某項(xiàng)。nSelect參數(shù)指定了要選擇的列表項(xiàng)的索引,如果為-1則列表框中當(dāng)前選擇項(xiàng)被取消選中,編輯框也被清空。

       DWORD GetEditSel( ) const;
       獲取組合框控件的編輯框中當(dāng)前選擇范圍的起始和終止字符的位置。該函數(shù)返回一個(gè)32位數(shù),低16位存放起始位置,高16位存放選擇范圍后第一個(gè)非選擇字符的位置。如果該函數(shù)用于下拉列表式組合框時(shí),會(huì)返回CB_ERR。

       BOOL SetEditSel(int nStartChar,int nEndChar);
       用于在組合框控件的編輯框中選擇字符。nStartChar參數(shù)指定起始位置,nEndChar參數(shù)指定終止位置。

       DWORD_PTR GetItemData(int nIndex) const;
       獲取組合框中指定項(xiàng)所關(guān)聯(lián)的32位數(shù)據(jù)。nIndex參數(shù)指定組合框控件的列表框某項(xiàng)的索引(從0開(kāi)始)。

       int SetItemData(int nIndex,DWORD_PTR dwItemData);
       為某個(gè)指定的組合框列表項(xiàng)設(shè)置一個(gè)關(guān)聯(lián)的32位數(shù)。nIndex參數(shù)指定要進(jìn)行設(shè)置的列表項(xiàng)索引。dwItemData參數(shù)指定要關(guān)聯(lián)的新值。

       void GetLBText(int nIndex,CString& rString) const;
       從組合框控件的列表框中獲取某項(xiàng)的字符串。nIndex參數(shù)指定要獲取字符串的列表項(xiàng)的索引,CString參數(shù)用于接收取到的字符串。

       int GetLBTextLen(int nIndex) const;
       獲取組合框控件的列表框中某項(xiàng)的字符串長(zhǎng)度。nIndex參數(shù)指定要獲取字符串長(zhǎng)度的列表項(xiàng)的索引。  

       int GetTopIndex( ) const;
       獲取組合框控件的列表框中第一個(gè)可見(jiàn)項(xiàng)的索引。

       int SetTopIndex(int nIndex);
       將組合框控件的列表框中某個(gè)指定項(xiàng)設(shè)置為可見(jiàn)的。nIndex參數(shù)指定了該列表項(xiàng)的索引。該函數(shù)成功則返回0,有錯(cuò)誤發(fā)生則返回CB_ERR。

       BOOL LimitText(int nMaxChars);
       用于限制用戶(hù)在組合框控件的編輯框中能夠輸入的最大字節(jié)長(zhǎng)度。nMaxChars參數(shù)指定了用戶(hù)能夠輸入文字的最大字節(jié)長(zhǎng)度,如果為0則長(zhǎng)度被限制為65535個(gè)字節(jié)。

       int AddString(LPCTSTR lpszString);
       為組合框控件中的列表框添加新的列表項(xiàng)。lpszString參數(shù)是指向要添加的字符串的指針。該函數(shù)的返回值如果大于等于0,那么它就是新列表項(xiàng)的索引,而如果有錯(cuò)誤發(fā)生則會(huì)返回CB_ERR,如果沒(méi)有足夠的內(nèi)存存放新字符串則返回CB_ERRSPACE。

       int DeleteString(UINT nIndex);
       刪除組合框中某指定位置的列表項(xiàng)。nIndex參數(shù)指定了要?jiǎng)h除的列表項(xiàng)的索引。該函數(shù)的返回值如果大于等于0,那么它就是組合框中剩余列表項(xiàng)的數(shù)量。如果nIndex指定的索引超出了列表項(xiàng)的數(shù)量則返回CB_ERR。

       int FindString(int nStartAfter,LPCTSTR lpszString) const;
       在組合框控件的列表框中查找但不選中第一個(gè)包含指定前綴的列表項(xiàng)。nStartAfter參數(shù)指定了第一個(gè)要查找的列表項(xiàng)之前的那個(gè)列表項(xiàng)的索引。lpszString指向包含要查找的前綴的字符串。該函數(shù)的返回值如果大于等于0,那么它是匹配列表項(xiàng)的索引,如果查找失敗則返回CB_ERR。

       int InsertString(int nIndex,LPCTSTR lpszString);
       向組合框控件的列表框中插入一個(gè)列表項(xiàng)。nIndex參數(shù)指定了要插入列表項(xiàng)的位置,lpszString參數(shù)則指定了要插入的字符串。該函數(shù)返回字符串被插入的位置,如果有錯(cuò)誤發(fā)生則會(huì)返回CB_ERR,如果沒(méi)有足夠的內(nèi)存存放新字符串則返回CB_ERRSPACE。

       int SelectString(int nStartAfter,LPCTSTR lpszString);
       在組合框控件的列表框中查找一個(gè)字符串,如果查找到則選中它,并將其顯示到編輯框中。參數(shù)同F(xiàn)indString。如果字符串被查找到則返回此列表項(xiàng)的索引,如果查找失敗則返回CB_ERR,并且當(dāng)前選擇項(xiàng)不改變。

       此外,CComboBox類(lèi)還繼承了CWnd類(lèi)的成員函數(shù)GetWindowText、SetWindowText等。

       CComboBox類(lèi)應(yīng)用實(shí)例     

       最后雞啄米給大家寫(xiě)一個(gè)簡(jiǎn)單的實(shí)例,說(shuō)明CComboBox的幾個(gè)成員函數(shù)及通知消息等的使用方法。此實(shí)例實(shí)現(xiàn)的功能:在組合框中包含一個(gè)網(wǎng)站列表,切換組合框控件的列表框中選擇的列表項(xiàng)時(shí),將新選中的列表項(xiàng)的文本顯示到編輯框中。下面是具體實(shí)現(xiàn)步驟:

       1. 創(chuàng)建一個(gè)基于對(duì)話(huà)框的MFC工程,名稱(chēng)設(shè)置為“Example25”。

       2. 在自動(dòng)生成的對(duì)話(huà)框模板IDD_EXAMPLE25_DIALOG中,刪除“TODO: Place dialog controls here.”靜態(tài)文本控件、“OK”按鈕和“Cancel”按鈕。添加一個(gè)Combo Box控件,ID設(shè)置為IDC_WEB_COMBO,Type屬性設(shè)為Drop List,為下拉列表式組合框,編輯框不允許用戶(hù)輸入,Sort屬性設(shè)為False,以取消排序顯示。再添加一個(gè)靜態(tài)文本控件和一個(gè)編輯框,靜態(tài)文本控件的Caption屬性設(shè)為“您選擇的網(wǎng)站:”,編輯框的ID設(shè)為IDC_SEL_WEB_EDIT,Read Only屬性設(shè)為T(mén)rue。此時(shí)的對(duì)話(huà)框模板如下圖:

VS2010/MFC編程入門(mén)之二十五(常用控件:組合框控件Combo Box)

       3. 為組合框IDC_WEB_COMBO添加CComboBox類(lèi)型的控件變量m_comboWeb。

       4. 在對(duì)話(huà)框初始化時(shí),我們將站點(diǎn)名加入到組合框中,并默認(rèn)選擇第一項(xiàng),那么需要修改CExample25Dlg::OnInitDialog()函數(shù)為:

C++代碼
  1. BOOL CExample25Dlg::OnInitDialog()   
  2. {   
  3.     CDialogEx::OnInitDialog();   
  4.   
  5.     // Add "About..." menu item to system menu.   
  6.   
  7.     // IDM_ABOUTBOX must be in the system command range.   
  8.     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);   
  9.     ASSERT(IDM_ABOUTBOX < 0xF000);   
  10.   
  11.     CMenu* pSysMenu = GetSystemMenu(FALSE);   
  12.     if (pSysMenu != NULL)   
  13.     {   
  14.         BOOL bNameValid;   
  15.         CString strAboutMenu;   
  16.         bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);   
  17.         ASSERT(bNameValid);   
  18.         if (!strAboutMenu.IsEmpty())   
  19.         {   
  20.             pSysMenu->AppendMenu(MF_SEPARATOR);   
  21.             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);   
  22.         }   
  23.     }   
  24.   
  25.     // Set the icon for this dialog.  The framework does this automatically   
  26.     //  when the application's main window is not a dialog   
  27.     SetIcon(m_hIcon, TRUE);         // Set big icon   
  28.     SetIcon(m_hIcon, FALSE);        // Set small icon   
  29.   
  30.     // TODO: Add extra initialization here   
  31.     // 為組合框控件的列表框添加列表項(xiàng)“雞啄米”   
  32.     m_comboWeb.AddString(_T("雞啄米"));   
  33.     // 為組合框控件的列表框添加列表項(xiàng)“百度”   
  34.     m_comboWeb.AddString(_T("百度"));   
  35.     // 在組合框控件的列表框中索引為1的位置插入列表項(xiàng)“新浪”   
  36.     m_comboWeb.InsertString(1, _T("新浪"));   
  37.   
  38.     // 默認(rèn)選擇第一項(xiàng)   
  39.     m_comboWeb.SetCurSel(0);   
  40.     // 編輯框中默認(rèn)顯示第一項(xiàng)的文字“雞啄米”   
  41.     SetDlgItemText(IDC_SEL_WEB_EDIT, _T("雞啄米"));   
  42.   
  43.     return TRUE;  // return TRUE  unless you set the focus to a control   
  44. }  

       5. 我們希望在組合框中選中的列表項(xiàng)改變時(shí),將最新的選擇項(xiàng)實(shí)時(shí)顯示到編輯框中,那么這就要用到CBN_SELCHANGE通知消息。為列表框IDC_WEB_COMBO的通知消息CBN_SELCHANGE添加消息處理函數(shù)CExample25Dlg::OnCbnSelchangeWebCombo(),并修改如下:

C++代碼
  1. void CExample25Dlg::OnCbnSelchangeWebCombo()   
  2. {   
  3.     // TODO: Add your control notification handler code here   
  4.     CString strWeb;   
  5.     int nSel;   
  6.   
  7.     // 獲取組合框控件的列表框中選中項(xiàng)的索引   
  8.     nSel = m_comboWeb.GetCurSel();   
  9.     // 根據(jù)選中項(xiàng)索引獲取該項(xiàng)字符串   
  10.     m_comboWeb.GetLBText(nSel, strWeb);   
  11.     // 將組合框中選中的字符串顯示到IDC_SEL_WEB_EDIT編輯框中   
  12.     SetDlgItemText(IDC_SEL_WEB_EDIT, strWeb);   
  13. }  

       6. 運(yùn)行程序,彈出結(jié)果對(duì)話(huà)框,在對(duì)話(huà)框的組合框中改變選擇項(xiàng)時(shí),編輯框中的顯示會(huì)相應(yīng)改變。效果圖如下:

VS2010/MFC編程入門(mén)之二十五(常用控件:組合框控件Combo Box)

       組合框的內(nèi)容就是這些了。相對(duì)于CComboBox類(lèi)數(shù)量不少的成員函數(shù)來(lái)說(shuō),本節(jié)的實(shí)例只是用到了很少的幾個(gè),大家可以根據(jù)上面所講試試其他的成員函數(shù)。有問(wèn)題歡迎繼續(xù)到雞啄米來(lái)交流討論。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多

    国产在线一区中文字幕| 久久偷拍视频免费观看| 国产a天堂一区二区专区| 欧美区一区二在线播放| 日韩在线一区中文字幕| 情一色一区二区三区四| 国产精品欧美日韩中文字幕| 亚洲丁香婷婷久久一区| 五月婷婷亚洲综合一区| 高清在线精品一区二区| 国产黄色高清内射熟女视频 | 99日韩在线视频精品免费| 制服丝袜美腿美女一区二区| 在线观看免费无遮挡大尺度视频| 亚洲中文字幕日韩在线| 四季精品人妻av一区二区三区| 五月婷婷综合激情啪啪| 亚洲欧洲在线一区二区三区| 欧美黑人黄色一区二区| 国产精品成人一区二区在线| 欧美日韩少妇精品专区性色| 日本免费熟女一区二区三区| 人妻少妇av中文字幕乱码高清| 国产精品免费自拍视频| 午夜精品在线观看视频午夜| 富婆又大又白又丰满又紧又硬| 国产又大又黄又粗的黄色| 成年女人下边潮喷毛片免费| 国产情侣激情在线对白| 1024你懂的在线视频| 99久久成人精品国产免费| 少妇肥臀一区二区三区| 亚洲超碰成人天堂涩涩| 欧美日韩国产精品第五页| 黄色国产一区二区三区| 在线观看欧美视频一区| 欧美欧美欧美欧美一区| 中文字幕亚洲人妻在线视频| 黑人粗大一区二区三区| 东京热男人的天堂一二三区| 中文字幕人妻一区二区免费|