=============================================================
标题:重新设置Combo Box下拉框宽度
备注:
日期:2011.4.12
姓名:朱铭雷
======================================================
Combo Box控件,受界面布局影响,有时其宽度不足以将每行内容都显示完全。最近在项目中遇到了这种问题。
一种简单的解决方法:
1 新建一个CZyfComboBox类派生自CComboBox。
2 override “=CBN_DROPDOWN”消息。CBN_DROPDOWN前面有一个等号,代表这是一个reflected message。所谓reflected message是控件发送给其父窗口的消息,但父窗口允许控件预先处理它。
3 完成“=CBN_DROPDOWN”的消息处理函数,在该消息处理函数中,重新设置下拉框的宽度。
void CZyfComboBox::OnCbnDropdown()
{
// 重新设置下拉框的宽度
int nNumEntries = GetCount();
int nWidth = 0;
CString str;
CClientDC dc(this);
int nSave = dc.SaveDC();
dc.SelectObject(GetFont());
int nScrollWidth = ::GetSystemMetrics(SM_CXVSCROLL); // 垂直滚动条的宽度
for (int i = 0; i < nNumEntries; i++)
{
GetLBText(i, str);
int nLength = dc.GetTextExtent(str).cx + nScrollWidth;
nWidth = max(nWidth, nLength);
}
nWidth += dc.GetTextExtent(TEXT("0")).cx;
dc.RestoreDC(nSave);
SetDroppedWidth(nWidth);
}
4 使用CZyfComboBox。
CZyfComboBox m_Combo;
DDX_Control(pDX, IDC_COMBO1, m_Combo);
效果: