=============================================================
標題:重新設置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);
效果: