1. 程式人生 > >組合框控制元件用法大全

組合框控制元件用法大全

一、 控制Combo Box的下拉長度 1、當你在介面上拖出來了combox控制元件後,點選它的屬性,把No integral height 搜尋這一項選成true 2、點選一下那個combox控制元件的小三角,現在拖動出現的那個框框的的長度,拖到你覺得合適就行啦 3、如果你的內容比較多,那麼你剛剛拖得那個框框當你編譯完執行後會自動產生一個滾動條的。 4、到此,combox的下拉框大小就設定好了。

參考知識點如下:

1、那就是在設計介面裡,點選一下Combo Box的下拉箭頭,此時出現的調整框就是Combo Box的下拉調整框。

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

二、AddString與InsertString區別

1、AddString

      CToolBarCtrl::AddString   int AddString( UINT nStringID );   返回值:如果成功則返回被新增的第一個新字串的從零開始的索引;否則返回-1。   引數: nStringID 要新增到工具條控制元件的字串列表中去的字串資源的資源識別符號。
  說明:此成員函式用來將一個被作為資源ID傳遞的新字串新增到工具條的內部字串列表中。       CListBox::AddString   int AddString( LPCTSTR lpszItem );   返回值:列表框中字串的基於零的索引。如果出錯,則返回LB_ERR;如果沒有足夠的有效空間儲存新字串,則為LB_ERRSPACE。   引數: lpszItem 指向將被新增的空終止字串的指標。   說明:呼叫此成員函式新增一個字串到列表框中。如果列表框未被建立為LBS_SORT風格,則字串被新增到列表末尾。否則,字串被插入到列表中,並把列表排序。如果列表被建立為LBS_SORT 風格而不是LBS_HASSTRINGS風格,則框架通過對CompareItem成員函式的一個或多個呼叫來排序列表。
  使用InsertString插入一個字串到列表框的指定位置。       CComboBox::AddString   int AddString( LPCTSTR lpszString );   返回值:返回值大於等於0時,是列表中項的下標。出錯時,返回CB_ERROR,沒有足夠的空間存放新的字串時返回CB_ERRSPACE。   引數: lpszString 指向將要新增的字串(以null結尾)的指標。   說明:本函式在組合框中的列表框中新增一個字串。如果列表框的風格不是CBS_SORT的,則在列表的末尾新增該字串。否則,該字串按照排序的次序插入到列表中。   在列表的指定位置插入一項,需使用成員函式InsertString。 2、InsertString

在列表的指定位置插入一項,需使用成員函式InsertString

函式有兩個引數,

第一個引數為索引號,設定為-1時,專案條被插入到列表的末尾;

第二個引數與AddString 函式的唯一引數相同,為代表專案條中內容的字串

使用InsertString ,第一個引數設定為-1時,列表中的專案條的排列順序嚴格按照原始碼中語句的順序排列;

使用AddString時,列表中的專案條的順序則按照英文字典序由上而下排列;

三、具體一些操作


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

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

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

2、向控制元件新增 Items

1) 在Combo Box控制元件屬性的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標籤裡面新增,一行表示Combo Box下拉列表中的一行。換行用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,下拉的時候新增

如: CString strTemp;

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,首先要知道兩點:一、那就是在設計介面裡,點選一下Combo Box的下拉箭頭,此時出現的調整框就是Combo Box的下拉調整框。

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

三、選擇其中的某行

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,首先要知道兩點:一、那就是在設計介面裡,點選一下Combo Box的下拉箭頭,此時出現的調整框就是Combo Box的下拉調整框。

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

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)。通過呼叫int GetLBText( 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_msg void memberFxn( );的函式,並且定義形式如ON_Notification( id, memberFxn )的訊息對映。如果在對話方塊中使用組合框,Class Wizard會自動列出相關的訊息,並能自動產生訊息對映程式碼。

在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; int iImage; int iSelectedImage; int iOverlay;       int iIndent; 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="Line 1";m_cbeWnd.InsertItem(&insItem);insItem.iItem=1;insItem.iImage=1;insItem.pszText="Line 2";m_cbeWnd.InsertItem(&insItem);

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

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