combobox之下拉宽度自适应
效果对比
先看下优化前后的效果,再看实现过程.
优化前
优化后
从上图中可看到,combobox优化后可以自适应不同长度的字符串,保证每个字符串都能够显示完整。
实现过程
当我们触发CBN_DROPDOWN事件时,不再使用默认的实现,而是利用消息反射机制,重新计算下拉列表的宽度,具体步骤如下:
- 生成CMyComboBox类,这个类继承CComboBox
- 将CMyComboBox绑定combobox控件
- 响应CBN_DROPDOWN消息响应
- 重新计算最大的下拉列表长度
CMyComboBox类
类声明
class CMyComboBox : public CComboBox
{
DECLARE_DYNAMIC(CMyComboBox)
public:
CMyComboBox();
virtual ~CMyComboBox();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnCbnDropdown();
};
BEGIN_MESSAGE_MAP(CMyComboBox, CComboBox)
//消息反射声明
ON_CONTROL_REFLECT(CBN_DROPDOWN, &CMyComboBox::OnCbnDropdown)
END_MESSAGE_MAP()
// CMyComboBox 消息处理程序
void CMyComboBox::OnCbnDropdown()
{
CClientDC dc(this);
int nWitdh = 10;
int nSaveDC = dc.SaveDC();
//获取字体信息,
dc.SelectObject(GetFont());
//计算最大的显示长度
for (int i = 0; i < GetCount(); i++)
{
CString strLable = _T("");
GetLBText(i, strLable);
nWitdh = max(nWitdh,dc.GetTextExtent(strLable).cx);
}
//多增加的冗余宽度
nWitdh += 10;
//设置下拉列表宽度
SetDroppedWidth(nWitdh);
//恢复实际dc
dc.RestoreDC(nSaveDC);
}