首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

MFC CComboBox 控件全方位使用指南

     編輯:VC 教學

控件概覽

CComboBox 封裝 Windows 組合框控件,提供三種樣式:

  • Simple (簡單):編輯區 + 列表框永遠可見。
  • Drop-down (下拉):編輯區可輸入,點擊箭頭展開列表。
  • Drop-down List (下拉列表):編輯區唯讀,僅能從列表選擇。

資源編輯器 Type 屬性對應上述三種;Data 屬性可預填項目 (分號分隔);Sort 屬性控制是否自動排序。

兩種操作方式

  1. DDX 控制項變數 (推薦):ClassWizard 添加 CComboBox m_CtrlCombo,直接呼叫 m_CtrlCombo.InsertString(...)。
  2. GetDlgItem 強轉:((CComboBox*)GetDlgItem(IDC_COMBO1))->InsertString(...),無需變數但易出錯。

核心成員函數速查表

函數用途備註
GetCount()取得項目總數返回 int
GetCurSel()取得當前選中索引無選擇返回 -1
SetCurSel(int n)設定選中項目-1 清除選擇
GetLBText(int n, CString&)取得指定項目文字
AddString(LPCTSTR)尾端新增項目返回索引
InsertString(int, LPCTSTR)指定位置插入
DeleteString(int)刪除指定項目
ResetContent()清空所有項目
FindStringExact(-1, LPCTSTR)精確查找字串返回索引或 CB_ERR
SetEditSel(int start, int end)設定編輯區選取範圍僅 Simple/Drop-down 有效
GetEditSel()取得編輯區選取範圍
LimitText(int)限制編輯區最大字元數
SetDroppedWidth(int)設定下拉列表寬度防止文字被截斷
ShowDropDown(BOOL)程式控制展開/收合

實戰範例:動態填充與選中處理

void CMyDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // 1. 清空並填充
    m_Combo.ResetContent();
    m_Combo.AddString(_T("選項一"));
    m_Combo.AddString(_T("選項二"));
    m_Combo.AddString(_T("選項三"));

    // 2. 設定預設選中
    m_Combo.SetCurSel(0);

    // 3. 設定下拉寬度適應最長文字
    CClientDC dc(&m_Combo);
    CFont* pOld = dc.SelectObject(m_Combo.GetFont());
    int maxWidth = 0;
    for (int i = 0; i < m_Combo.GetCount(); ++i) {
        CString txt; m_Combo.GetLBText(i, txt);
        maxWidth = max(maxWidth, dc.GetTextExtent(txt).cx);
    }
    dc.SelectObject(pOld);
    m_Combo.SetDroppedWidth(maxWidth + 20); // 留滾動條空間
}

常見訊息處理

  • ON_CBN_SELCHANGE:選擇改變 (最常用)
  • ON_CBN_EDITCHANGE:編輯區文字變更 (僅 Simple/Drop-down)
  • ON_CBN_DROPDOWN / ON_CBN_CLOSEUP:列表展開/收合
  • ON_CBN_SELENDOK / ON_CBN_SELENDCANCEL:確認/取消選擇

進階技巧

  • Owner Draw:設定 CBS_OWNERDRAWFIXED/VARIABLE,重寫 DrawItem / MeasureItem 實現圖文混排、多欄、顏色分級。
  • 自動完成:搭配 SHAutoComplete (需 shlwapi.h) 為編輯區添加歷史/檔案路徑自動完成。
  • 資料綁定:結合 CRecordset 或自定義容器,在 OnInitDialog 批次 AddString,大量資料建議用 CB_INITSTORAGE 預分配。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved