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 輸入框中內容被更新
我的代碼:
串口選擇
void CCarGNSSDlg::OnSelchangeChoseCom()
{
// TODO: Add your control notification handler code here
char str[10];
int iPos=m_ChoseCOM.GetCurSel();
int iNum=m_ChoseCOM.GetLBText( iPos, (LPTSTR) str) ;
int i=3;//atoi(str+3);
if(m_ctrlComm.GetPortOpen())
{
m_ctrlComm.SetPortOpen(FALSE); //關閉串口
m_ctrlComm.SetCommPort(i); //選擇COM口
m_ctrlComm.SetPortOpen(TRUE); //打開串口
}
else
{
m_ctrlComm.SetCommPort(i); //選擇COM口
}
}
波特率選擇
void CCarGNSSDlg::OnSelchangeCOMBaund()
{
// TODO: Add your control notification handler code here
char string[8];
int iBaund=m_ctrlChoseBaund.GetCurSel();
int iNum=m_ctrlChoseBaund.GetLBText( iBaund, (LPTSTR) string) ;
int i=atoi(string);
if(m_ctrlComm.GetPortOpen())
{
m_ctrlComm.SetPortOpen(FALSE); //關閉串口
switch(i)
{
case 1200: m_ctrlComm.SetSettings("1200,n,8,1"); //波特率1200,無校驗,8個數據位,1個停止位
break;
case 2400: m_ctrlComm.SetSettings("2400,n,8,1");
break;
case 4800: m_ctrlComm.SetSettings("4800,n,8,1");
break;
case 9600: m_ctrlComm.SetSettings("9600,n,8,1");
break;
case 19200: m_ctrlComm.SetSettings("19200,n,8,1");
break;
case 38400: m_ctrlComm.SetSettings("38400,n,8,1");
break;
case 57600: m_ctrlComm.SetSettings("57600,n,8,1");
break;
case 115200: m_ctrlComm.SetSettings("115200,n,8,1");
break;
default: ;
break;
}
m_ctrlComm.SetPortOpen(TRUE); //打開串口
}
else
{
switch(i)
{
case 1200: m_ctrlComm.SetSettings("1200,n,8,1"); //波特率1200,無校驗,8個數據位,1個停止位
break;
case 2400: m_ctrlComm.SetSettings("2400,n,8,1");
break;
case 4800: m_ctrlComm.SetSettings("4800,n,8,1");
break;
case 9600: m_ctrlComm.SetSettings("9600,n,8,1");
break;
case 19200: m_ctrlComm.SetSettings("19200,n,8,1");
break;
case 38400: m_ctrlComm.SetSettings("38400,n,8,1");
break;
case 57600: m_ctrlComm.SetSettings("57600,n,8,1");
break;
case 115200: m_ctrlComm.SetSettings("115200,n,8,1");
break;
default: ;
break;
}
}
}