Combo Box 的用法

 

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;
   }  

 } 
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章