Microsoft Office 系列採用扁平化 `ComboBox`(邊框僅在滑鼠懸停/焦點時顯示),視覺現代輕量。Codejock Xtreme Toolkit 提供免費類別 `CXTFlatComboBox` 實現此效果。本文說明整合步驟、核心屬性、自動完成支援、已知問題(`WM_CTLCOLOR` 下拉模式文字顏色不生效)與替代方案。
// 對話方塊類別頭文件
#include "XTFlatComboBox.h"
class CFlatComboDemoDlg : public CDialog
{
CXTFlatComboBox m_comboDropdown; // CBS_DROPDOWN 可編輯
CXTFlatComboBox m_comboDropList; // CBS_DROPDOWNLIST 僅選擇
BOOL m_bAutoComplete;
BOOL m_bDisableDropdown, m_bDisableDropList;
// ...
};
void CFlatComboDemoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_COMBO_DROPDOWN, m_comboDropdown);
DDX_Control(pDX, IDC_COMBO_DROPLIST, m_comboDropList);
DDX_Check(pDX, IDC_CHECK_AUTOCOMP, m_bAutoComplete);
DDX_Check(pDX, IDC_CHECK_DISABLE_DD, m_bDisableDropdown);
DDX_Check(pDX, IDC_CHECK_DISABLE_DL, m_bDisableDropList);
}
BOOL CFlatComboDemoDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 填入測試資料
CString arr[] = { _T("Apple"), _T("Banana"), _T("Cherry"), _T("Date"), _T("Elderberry") };
for (auto& s : arr) { m_comboDropdown.AddString(s); m_comboDropList.AddString(s); }
m_comboDropdown.SetCurSel(0); m_comboDropList.SetCurSel(0);
// 自動完成(僅 Dropdown 模式支援)
m_comboDropdown.SetAutoComplete(m_bAutoComplete);
// 啟用/禁用
m_comboDropdown.EnableWindow(!m_bDisableDropdown);
m_comboDropList.EnableWindow(!m_bDisableDropList);
return TRUE;
}
文中提到:`OnCtlColor` 中設定 `CDC::SetTextColor`/`SetBkColor` 對 `CBS_DROPDOWN` 模式的編輯區無效。原因:下拉模式的編輯框是內建子視窗,`WM_CTLCOLOR` 發送給父視窗時 `nCtlColor` 為 `CTLCOLOR_EDIT`,但 `CXTFlatComboBox` 可能未正確轉發或處理。解決方案:

兩種模式皆呈現扁平風格,懸停顯示邊框與下拉箭頭,點擊展開清單,可編輯模式支援自動完成勾選控制。
若不想引入第三方庫,可自行繼承 `CComboBox`,處理 `WM_PAINT`(繪製扁平邊框)、`WM_MOUSEMOVE`/`WM_MOUSELEAVE`(追蹤懸停)、`WM_CTLCOLOR`(子編輯框顏色)、`NM_CUSTOMDRAW`(下拉清單項目繪製),約 150 行核心代碼即可達到同等效果,且完全可控。
`CXTFlatComboBox` 以零成本提供 Office 風格扁平下拉框,整合簡單、功能完整。已知 `WM_CTLCOLOR` 問題可透過子類化內建編輯框解決。建議團隊評估:若專案已使用 Xtreme Toolkit 其他元件,直接採用;否則自行實作輕量級 `CFlatComboBox` 更符合專案可控性原則。