ComboBox
ComboBox
hwndCtl為此組合框的句柄,lpsz為需要添加的字元串,組合框不能直接通過id添加內容,所以需要得到這個控制項的句柄,還得使用GetDlgItem()函數.
ComboBox_AddString(hwndCtl,lpsz)
舉例:
//建立一個組合框,ID可以設置為IDC_C1,然後通過GetDlgItem獲取這個組合框的句柄
//如果無法正常顯示,需要調整此組合框的最大顯示範圍,在向下箭頭上出現上下箭頭時可以調整.
ComboBox_AddString(hwndCombo1,TEXT("內容1"));
ComboBox_AddString(hwndCombo1,TEXT("內容2"));
//使用IDC_C1的句柄hwndCombo1,然後添加內容,多次調用可以設置多項文字,
//添加的內容通常都放在Main_OnInitDialog()初始化函數中,也可以通過按鈕或其他控制項調用.
ComboBox_GetCount(hwndCtl)
這個函數的返回值為int,參數hwndCtl為此組合框控制項句柄;
舉例:
HWND hwndCombo1 = GetDlgItem(hwnd,IDC_C1);
int count = ComboBox_GetCount(hwndCombo1);
//通過定義count拿到返回值.
ComboBox_DeleteString(hwndCtl, index)
hwndCtl為句柄,index為項目索引號,從上至下,從0開始排列,所以0就是刪除第一項.
舉例:
HWND hwndCombo1 = GetDlgItem(hwnd,IDC_C1);
ComboBox_DeleteString(hwndCombo1,0);
ComboBox_GetCurSel(hwndCtl)
此函數的返回值為int,返回項目索引號.
舉例:
HWND hwndCombo1 = GetDlgItem(hwnd,IDC_C1);
int count = ComboBox_GetCurSel(hwndCombo1);
//獲取到索引號.
TCHAR str1[256];
sprintf(str1,"當前選中的項索引號為:%d",count);
//使用sprintf儲存說明文字跟索引號,
MessageBox(hwnd,str1,TEXT("標題"),MB_OK);
ComboBox_DeleteString(hwndCombo1,count);
//刪除獲取此索引號的項.
MessageBox(hwnd,TEXT("刪除當前選中的項"),TEXT("標題"),MB_OK);
//為選中並刪除當前項,如果沒有選中任何項,返回值為-1.
ComboBox_SetCurSel(hwndCtl, index)
位置的編號由0開始,0表示第一項
舉例:
HWND hwndCombo1 = GetDlgItem(hwnd,IDC_C1);
ComboBox_SetCurSel(hwndCombo1,2);
//選擇並顯示第3項
ComboBox_GetLBText(hwndCtl, index, lpszBuffer)
hwndCtl句柄,index索引號,lpszBuffer儲存字元串
舉例:
HWND hwndCombo1 = GetDlgItem(hwnd,IDC_C1);
CString str;
ComboBox_GetLBText(hwndCombo1,2, str);
//ComboBox_GetLBText不返回值,實際是通過str儲存並傳遞字元串.
MessageBox(hwnd,str,TEXT("標題"),MB_OK);
//輸出某項的str字元串的值.
在VB中,Combo Box(組合框)控制項很簡單也很常用,可以節省空間。從用戶角度來看,這個控制項是由一個文本輸入控制項和一個下拉菜單組成的。用戶可以從一個預先定義的列表裡選擇一個選項,同時也可以直接在文本框裡面輸入文本。
1)直接在控制項上操作,先點向下的箭頭,就可以調整下拉框大小;
2)為了讓列表框變的更寬,可以用setdroppedwidth(int width)函數來調整列表框的寬度。
假定已經創建了一個Dialog,並且從控制項工具箱將Combo Box 控制項拖放到上面。打開 Class Wizard,添加控制項對應變數,如:CComboBox m_combo。
1)在Combo Box控制項屬性的Data標籤裡面添加,一行表示Combo Box下拉列表中的一行。換行用ctrl+回車。若在VS2005中,Items間用";"隔開即可;
2)利用函數 AddString()向 Combo Box 控制項添加Items,如:
m_combo.AddString(“StringData1”);
m_combo.AddString(“StringData2”);
m_combo.AddString(“StringData3”);
3) 也可以調用函數 InsertString() 將 Item 插入指定位置 nIndex,如:
m_combo.InsertString(nIndex, “StringData” );
4)int GetCount( )可以得到當前列表框中行的數量。
示例代碼:程序初始化時動態添加Items
CString strTemp;
m_combo.ResetContent();//消除現有所有內容
for(inti=1;i<=100;i++)
{
strTemp.Format("%d",i);
m_combo.AddString(strTemp);
}
假設在控制項列表中已經選定某項,現在要得到被選定項的內容,首先要得到該項的位置,然後得到對應位置的內容。這裡會用到兩個函數,如:
int nIndex = m_combo.GetCurSel();
CString strText;
m_combo.GetLBText( nIndex, strText);
這樣,得到的內容就保存在 strText 中。若要選取當前內容,可調用函數GetWindowText(strText)。
這種操作一般用於在程序中動態修改控制項中該項的值,可以用函數FindStringExact() 精確匹配,如:
int nIndex =m_combo.FindStringExact( nStartAfter, “value to befound”);
nStartAfter指明從哪一行開始查找。如果查找成功,返回的是該項的位置;否則,返回CB_ERR。
也可以選中包含指定字元串的項,如:
int nIndex =m_combo.SelectString( nStartAfter, “value to beselected”);
該操作可以利用函數DeleteString(),需要指定被刪除項的位置,如:
m_combo.DeleteString(nIndex);
也可以使用函數ResetContent(),清除目前的所有項,如:
m_combo.ResetContent();
int nIndex =m_combo.GetCurSel(); //當前選中的項
m_combo.SetCurSel(nIndex); //設置第nIndex項為顯示的內容
1)取當前內容
m_combo.GetWindowText(strTemp);
2)取其他行內容
m_combo.GetLBText(n,strTemp);
通常要判斷控制項是否獲得了焦點,可以用GetFocus()函數,例如:
if(GetFocus()==GetDlgItem(IDC_EDIT_VALUE2))//判斷焦點是否在編輯框IDC_EDIT_VALUE2內。
但是combobox 的焦點不同,因為它是由edit和listbox兩部分組成,所以獲得焦點要用GetParent(),例如:
if ((GetFocus()->GetParent())==GetDlgItem(IDC_COMBO_CF))。
1)Sort 屬性:設置為 true,則新添加項將按字母順序插入到列表中;否則,在列表的結尾處插入項。
2)Type屬性:設置為Drop List,則使ComboBox不能輸入只能在下拉菜單中選擇;設置Dropdown,則ComboBox中允許輸入內容。
3)No integral height屬性,表示最大長度為設計長度,如果實際內容比設計長度多,就出現滾動條,少就以實際長度顯示。
得到或設置輸入框中被選中的字元位置
2)BOOL LimitText(int nMaxChars );//設置輸入框中可輸入的最大字元數。
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會自動列出相關的消息,並能自動產生消息映射代碼。
在.NET的Server Control中只有DropDownList,而不像Win Form編程一樣有ComboBox,但是AjaxControlToolkit中提供了ComboBox,可以提供文本輸入功能,並且有SuggestAppend功能。
與Textbox不同的是,ComboBox.Text屬性並不能取得文本框中的文本,此屬性與ComboBox.SelectedValue完全等同,只能獲得下拉列表中的Value。如果想獲得ComboBox文本框中的文本,只能通過ComboBox.Controls屬性來讀取。
((TextBox)((Table)ComboBoxComponent.Controls[0]).Rows[0].Cells[0].Controls[0]).Text
這就是ComboBox中自己輸入的文本。
循環初始化ComboBox的例子:
{
for (int i = 0; i < 24; i++)
{
comboHour.Items.Add(i.ToString());
comboHour.SelectedIndex = 0; //設置第一個被選中
}
}
組合框和列表框的功能類似,但使用更為靈活,更為常用。實際上,組合框是由一個文本框和一個列表框組成的,組合框又被稱為彈出式菜單。用戶使用時,單擊文本框右側的三角即可展開下拉列表。
屬性 作用
rowsource 組合框內容從何處來(來源)
rowsourcetype 組合框內容來源的類型,詳見注1
displayvalue 選擇值
boundcolumn 在組合框包含多項時指定哪一列作為value屬性的值
columncount 行源列數
list(i) 第i行的值
selected(i) 第i行是否被選中
multiselect 是否可以同時選取多項
moverbars 項目是否可以移動
sorted 當rowsourcetype為0和1時,組合框內容是否按字母大小排序
listindex 組合框中當前被選定項的索引值
integralheight 組合框的高度是否可自動調整
listcount 組合框中數據項的數目
style 指定組合框的類型。參數如下:0-下拉組合框,也可在文本框中直接輸入 2-下拉列表框,只能在展開的下拉列表中選擇
incrementalsearch 確定在鍵盤操作時是否支持增量搜索。值為.T.,當用鍵盤選擇列表項,用戶敲一個鍵,系統將自動定位到與輸入字母相應的項前
注1(rowsourcetype屬性可指定的值):
0-無,運行時使用列表框的確良additem和addlistitem方法加入
1-值,將列表框的內容在設計時直接寫在該屬性中
2-表別名:由columncount確定表中選擇的欄位。當用戶選擇列表框時,記錄指針將自動移到該記錄上
3-sql語句:見sql部分,由執行的結果產生.
4-查詢文件名:見查詢部分,由查詢結果產生
5-數組名
6-欄位名表:可用表別名作為欄位前綴。當用戶選擇列表項時,記錄指針將自動移到該記錄上
7-文件名描述框架,可包含"*"和"?"來描述在列表框中顯示的文件名
8-結構
9-彈出式菜單,提供向後兼容.
方法 作用
additem 增加列表項
removeitem 移去列表項
clear 移去所有列表項
requery 當rowsourcetype為3和4時,根據rowsource中的最新數據重新刷新列表項
列表框的常用事件為click(單擊)事件、dbclick(雙擊)事件和interactivechange事件(當用戶使用鍵盤或滑鼠更改組合框的值時發生的事件,比如,我們單擊組合框右側的三角展開下拉列表時,即會發生此事件)。