自绘CComboBox:DROPDOWN样式下编辑控件未同步列表项粗体显示
解决CComboBox DROPDOWN样式下编辑框不显示粗体的问题
当ComboBox为DROPDOWN样式时,其包含独立的CEdit子控件,DrawItem仅负责绘制下拉列表中的选项,编辑框的字体需要单独设置——这就是DROPLIST样式正常但DROPDOWN样式失效的核心原因。
解决方案步骤
- 捕获选中项变化的
CBN_SELCHANGE消息,判断当前选中项是否需要显示粗体 - 获取ComboBox的编辑控件指针,动态为其设置粗体字体或恢复原字体
- 初始化时同步设置编辑框字体(若初始选中项为粗体)
代码实现
- 处理选中项变化消息:
void CMyComboBox::OnSelChange() { CComboBox::OnSelChange(); int nSel = GetCurSel(); if (nSel != CB_ERR) { // 根据业务逻辑判断当前项是否需要粗体,需自行实现IsItemBold函数 bool needBold = IsItemBold(nSel); CEdit* pEdit = GetEditCtrl(); if (pEdit) { pEdit->SetFont(needBold ? &m_fontBold : GetFont()); pEdit->Invalidate(); // 强制刷新编辑框 } } }
- 初始化时同步编辑框字体:
BOOL CMyComboBox::OnInitDialog() { CComboBox::OnInitDialog(); int nSel = GetCurSel(); if (nSel != CB_ERR) { bool needBold = IsItemBold(nSel); CEdit* pEdit = GetEditCtrl(); if (pEdit && needBold) { pEdit->SetFont(&m_fontBold); } } return TRUE; }
关键说明
GetEditCtrl()仅对DROPDOWN或SIMPLE样式的ComboBox有效,DROPLIST样式调用会返回NULL- 确保
m_fontBold是类成员变量,生命周期覆盖ComboBox的使用周期,避免字体对象提前销毁 - 若需要支持编辑框输入时的字体切换,还需额外处理编辑框的
EN_CHANGE消息,根据输入内容判断是否应用粗体
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

