1. 程式人生 > >MFC中ComboBox的用法

MFC中ComboBox的用法

Combo Box (組合框)控制元件很簡單,可以節省空間。從使用者角度來看,這個控制元件是由一個文字輸入控制元件和一個下拉選單組成的。使用者可以從一個預先定義的列表裡選擇一個選項,同時也可以直接在文字框裡面輸入文字。下面的例子簡要說明如何利用 MFCCComboBox Class來操作字串列表。 
1、定義控制元件對應變數

假定已經建立了一個Dialog,並且從控制元件工具箱將 Combo Box 控制元件拖放到上面。開啟 Class Wizard,新增控制元件對應變數,如:CComboBoxm_cbExamble;

在後面的程式碼中會不斷使用這個變數。

2、向控制元件新增 Items

  1) 在ComboBox控制元件屬性的Data標籤裡面新增,一行表示Combo Box下拉列表中的一行。換行用ctrl+回車。

2) 利用函式 AddString() 向 Combo Box 控制元件新增Items,如:

m_cbExample.AddString(“StringData1”);

m_cbExample.AddString(“StringData2”);

m_cbExample.AddString(“StringData3”);

3) 也可以呼叫函式 InsertString() 將 Item 插入指定位置nIndex,如:

m_cbExample.InsertString( nIndex, “StringData” );

3、從控制元件得到選定的Item

假設在控制元件列表中已經選定某項,現在要得到被選定項的內容,首先要得到該項的位置,然後得到對應位置的內容。這裡會用到兩個函式,如:

int nIndex = m_cbExample.GetCurSel();

CString strCBText;

m_cbExample.GetLBText( nIndex, strCBText);

這樣,得到的內容就儲存在 strCBText 中。

若要選取當前內容,可呼叫函式GetWindowText(strCBText)。

4、在控制元件中查詢給定Item

這種操作一般用於在程式中動態修改控制元件中該項的值,可以用函式FindStringExact()精確匹配,如:

int nIndex = m_cbExample.FindStringExact( nStartAfter, “value to be found”);

nStartAfter指明從哪一行開始查詢。如果查詢成功,返回的是該項的位置;否則,返回CB_ERR。

也可以選中包含指定字串的項,如:

int nIndex = m_cbExample.SelectString( nStartAfter, “value to be selected”);

5、刪除控制元件中的Item

該操作可以利用函式DeleteString(),需要指定被刪除項的位置,如:

m_cbExample.DeleteString(nIndex);

也可以使用函式ResetContent(),清除目前的所有項,如:

m_cbExample.ResetContent();

6、顯示控制元件中的某項

int nIndex = m_cbExample.GetCurSel(); //當前選中的項

m_cbExample.SetCurSel(nIndex); //設定第nIndex項為顯示的內容

7、得到或設定輸入框中被選中的字元位置

DWORD GetEditSel( ) /BOOL SetEditSel( int nStartChar, int nEndChar );

BOOL LimitText( int nMaxChars ); 設定輸入框中可輸入的最大字元數。

8、列表框常用訊息對映巨集

  ON_CBN_DBLCLK 滑鼠雙擊

ON_CBN_DROPDOWN 列表框被彈出

ON_CBN_KILLFOCUS / ON_CBN_SETFOCUS 在輸入框失去/得到輸入焦點時產生

ON_CBN_SELCHANGE 列表框中選擇的行發生改變

ON_CBN_EDITUPDATE 輸入框中內容被更新







補充:

一、如何新增/刪除Combo Box內容

1,在Combo Box控制元件屬性的Data標籤裡面新增,一行表示ComboBox下拉列表中的一行。換行用ctrl+回車。

2,在程式初始化時動態新增

如: //控制元件內容初始化

CString strTemp;

((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent();//消除現有所有內容

for(int i=1;i<=100;i++)

{

  strTemp.Format("%d",i);

  ((CComboBox*)GetDlgItem(IDC_COMBO_CF))->AddString(strTemp);

}

3,下拉的時候新增

如: CStringstrTemp;

int iCount=((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCount();//取得目前已經有的行數

if(iCount<1)//防止重複多次新增

{

  ((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent();

  for(int i=1;i<=100;i++)

  {

  strTemp.Format("%d",i);

  ((CComboBox*)GetDlgItem(IDC_COMBO_CF))->AddString(strTemp);

  }

}

4,刪除

DeleteString( UINT nIndex )//刪除指定行,

5,插入

InsertString( int nIndex, LPCTSTR lpszItem )//將行插入到指定位置

6,查詢

FindString( int nStartAfter, LPCTSTR lpszItem )//可以在當前所有行中查詢指定的字元傳的位置,nStartAfter指明從那一行開始進行查詢。

int SelectString( int nStartAfter, LPCTSTR lpszItem )//可以選中包含指定字串的行

二、如何控制Combo Box的下拉長度

1,首先要知道兩點:一、那就是在設計介面裡,點選一下ComboBox的下拉箭頭,此時出現的調整框就是Combo Box的下拉調整框。

2,二、屬性裡有個 No integralheight 鉤選項,表示最大長度為設計長度,如果實際內容比設計長度多,就出現滾動條,少就以實際長度顯示。

三、選擇其中的某行

1,選中:

int iPos=((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCurSel();//當前選中的行。

2,設定

((CComboBox*)GetDlgItem(IDC_COMBO_CF))->SetCurSel(n)//設定第n行內容為顯示的內容。

四、取得Combo Box框內容

1取當前內容

((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetWindowText(strTemp);

2取其他行內容

((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetLBText(n,strTemp);

四、獲得焦點

通常要判斷控制元件是否獲得了焦點,可以用GetFocus()函式

例如:if(GetFocus()==GetDlgItem(IDC_EDIT_VALUE2))//判斷焦點是否在編輯框IDC_EDIT_VALUE2內。

但是combobox 的焦點不同,因為它是由edit和listbox兩部分組成的

所以獲得焦點要用GetParent():if((GetFocus()->GetParent())==GetDlgItem(IDC_COMBO_CF))

控制Combo Box的下拉長度

1,首先要知道兩點:一、那就是在設計介面裡,點選一下ComboBox的下拉箭頭,此時出現的調整框就是Combo Box的下拉調整框。

二、屬性裡有個 No integralheight 鉤選項,表示最大長度為設計長度,如果實際內容比設計長度多,就出現滾動條,少就以實際長度顯示。

VC++ Combo Box/Combo Box Ex控制元件

  組合視窗是由一個輸入框和一個列表框組成。建立一個組合視窗可以使用成員函式:

BOOL CListBox::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect,CWnd* pParentWnd, UINT nID = 0xffff );

其中dwStyle將指明該視窗的風格,除了子視窗常用的風格WS_CHILD,WS_VISIBLE外,你可以針對列表控制元件指明專門的風格。

CBS_DROPDOWN 下拉式組合框

CBS_DROPDOWNLIST 下拉式組合框,但是輸入框內不能進行輸入

CBS_SIMPLE 輸入框和列表框同時被顯示

LBS_SORT 所有的行按照字母順序進行排序

由於組合框內包含了列表框,所以列表框的功能都能夠使用,如可以利用:

int AddString( LPCTSTR lpszItem )新增行,

int DeleteString( UINT nIndex )刪除指定行,

int InsertString( int nIndex, LPCTSTR lpszItem )將行插入到指定位置。

void ResetContent( )可以刪除列表框中所有行。

通過呼叫int GetCount( )得到當前列表框中行的數量。

如果需要得到/設定當前被選中的行的位置,可以呼叫int GetCurSel()/int SetCurSel(int iIndex)。通過呼叫intGetLBText( int nIndex, LPTSTR lpszText )得到列表框內指定行的字串。

此外通過呼叫int FindString(int nStartAfter, LPCTSTR lpszItem )可以在當前所有行中查詢指定的字元傳的位置,nStartAfter指明從那一行開始進行查詢。

int SelectString( int nStartAfter, LPCTSTR lpszItem )可以選中包含指定字串的行。

此外輸入框的功能都能夠使用,如可以利用:

DWORD GetEditSel( ) /BOOL SetEditSel( int nStartChar, int nEndChar )得到或設定輸入框中被選中的字元位置。

BOOL LimitText( int nMaxChars )設定輸入框中可輸入的最大字元數。

輸入框的剪貼簿功能Copy,Clear,Cut,Paste動可以使用。

最後介紹一下列表框幾種常用的訊息對映巨集:

ON_CBN_DBLCLK 滑鼠雙擊

ON_CBN_DROPDOWN 列表框被彈出

ON_CBN_KILLFOCUS / ON_CBN_SETFOCUS 在輸入框失去/得到輸入焦點時產生

ON_CBN_SELCHANGE 列表框中選擇的行發生改變

ON_CBN_EDITUPDATE 輸入框中內容被更新

使用以上幾種訊息對映的方法為定義原型如:afx_msgvoid memberFxn( );的函式,並且定義形式如ON_Notification(id, memberFxn )的訊息對映。如果在對話方塊中使用組合框,ClassWizard會自動列出相關的訊息,並能自動產生訊息對映程式碼。

在MFC 4.2中對組合框進行了增強,你可以在組合框中使用ImageList,有一個新的類CComboBoxEx(由CComboBox派生)來實現這一功能。在CComboBoxEx類中添加了一些新的成員函式來實現新的功能:首先你需要呼叫CImageList*SetImageList( CImageList* pImageList );來設定ImageList,然後呼叫

int InsertItem( const COMBOBOXEXITEM* pCBItem );來新增行,其中COMBOBOXEXITEM定義如下:

typedef struct { UINT mask; int iItem; LPTSTR pszText; int cchTextMax; intiImage; int iSelectedImage; int iOverlay;       intiIndent; LPARAM lParam;} COMBOBOXEXITEM, *PCOMBOBOXEXITEM;

你需要設定mask=CBEIF_IMAGE CBEIF_TEXT,並設定iItem為插入位置,設定pszText為顯示字串,設定iImage為顯示的圖示索引。下面的程式碼演示瞭如何進行插入:

/*m_cbeWnd 為已經建立的CComboBox物件

m_list 為CImageList物件IDB_IMG為16*(16*4)的點陣圖,每個圖片為16*16共4個圖示*/

m_list.Create(IDB_IMG,16,4,RGB(0,0,0));

m_cbeWnd.SetImageList(&m_list);

COMBOBOXEXITEM insItem;insItem.mask=CBEIF_IMAGE CBEIF_TEXT;insItem.iItem=0;insItem.iImage=0;insItem.pszText="Line1";m_cbeWnd.InsertItem(&insItem);insItem.iItem=1;insItem.iImage=1;insItem.pszText="Line2";m_cbeWnd.InsertItem(&insItem);

通過呼叫int DeleteItem(int iIndex );來刪除行,並指明行的位置。

通過呼叫BOOL GetItem(COMBOBOXEXITEM* pCBItem )/BOOL SetItem( const COMBOBOXEXITEM* pCBItem );來得到/設定行資料





******************************************************************************************************

  tonyswe(tong)回覆於 2003-03-10 13:31:10 得分 0 這位朋友可能也是新手. 
  是不是加了,執行後看不到選項.  
  加上後.要先在combo box的屬性裡的styles->types下選simple,然後把combobox框拉大,  
  也就是你希望的下拉的範圍大小. 再回到styles->types下選drop down 就行了.



MFC ComBox ResetContent( )
MFC, ComBox, ResetContent
在 ComBox控制元件的EditExchange事件中,新增ResetContent()函式清空列表後無法輸入資料,如何解決這個問題
void CTestDlg::OnEditchangeCombo1() 
{
 ((CComboBox*)GetDlgItem(IDC_COMBO1))->ResetContent();
  //其他.....
}  



WinForm Combox問題?
Combox, WinForm
WinForm窗體,Combox如何讓其不可編輯? 
WinForm窗體,如何限制TextBox只能輸入數字? 並且數字長度不能小於6?  

1:
WinForm Combox問題?
[此問題的推薦答案]

將Combox的DropDownStyle屬性設定為DropDownList就OK了 。



  數字長度不能小於6:this.textBox1.MaxLength=6;
如何限制TextBox只能輸入數字:
 private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
  {
  if (e.KeyChar < 48 || e.KeyChar > 57)
  if (e.KeyChar != (char)(Keys.Back))
  e.Handled = true;
  }  


2:
WinForm Combox問題?
s="ianswer"> 其他回答 共 7 條 
將Combox的DropDownStyle屬性設定為DropDownList,那樣的話只可以選擇,不可以輸入;
TextBox如果只能輸入數字,那麼就需要在程式碼中進行判斷,數字長度不能小於6也需要在程式碼中判斷  



VB 的COMBOX控制元件的STYLE屬性設定了2-dropdown list 屬性,怎麼新增預設的文字?
list, COMBOX, 控制元件, 文字, STYLE
就是我開啟窗體的時候,要它顯示的就是列表裡面的某列 ,而不是空的!!! 
怎麼實現? 
非常非常謝謝! 


VB 的COMBOX控制元件的STYLE屬性設定了2-dropdown list 屬性,怎麼新增預設的文字?
[此問題的推薦答案]
Combo1.ListIndex=0 '顯示第一項,其它一次類推