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