当我们在MFC中使用CCombobox下拉控件时,经常会遇到一个问题:
下拉列表中无法显示完全列表类容,如图:

很明显,图中未完全显示我们的内容,那么,我们如何来解决这个问题呢?
一般首先想到的是使用CToolTips类,这个类对常规控件显示很方便,但如果用在CCombobox里面,就没那么好用了,因为我们下拉列表里面属性被封装死了,所以如果要使用这种方式,需要我们自己重写CCombox类,并重写mousemove事件,这种方式放下一次讨论,本次讨论一种更简单直观的方式。
在下拉事件IDC_COMBO_DROPDOWN里面进行修改,自动调整宽度。

下面来说说步骤:
添加方式很多种,手动和自动都可以,通过资源视图,选中下拉控件—属性—事件—IDC_COMBO_DROPDOWN—Add,如图:

也可以,右键控件,然后添加事件处理程序,如图:

然后选定类列表,消息类型,确定,如图:

首先,添加控件成员变量;
然后,在自动生成的下拉事件OnCbnDropdownComboDropdown里,进行代码宽度重绘,代码如下:
void CRedrawSystemComboBoxDlg::OnCbnDropdownComboDropdown()
{
// TODO: 在此添加控件通知处理程序代码
CClientDC dc(this);
int nWitdh = 10;
int nSaveDC = dc.SaveDC();
//获取字体信息,
dc.SelectObject(GetFont());
//计算最大的显示长度
for (int i = 0; i < m_cbDropDown.GetCount(); i++)
{
CString strLable = _T("");
m_cbDropDown.GetLBText(i, strLable);
nWitdh = max(nWitdh, dc.GetTextExtent(strLable).cx);
}
//多增加的冗余宽度
nWitdh += DEL_RECT_WIDTH + 5;
//设置下拉列表宽度
m_cbDropDown.SetDroppedWidth(nWitdh);
//恢复实际dc
dc.RestoreDC(nSaveDC);
}
最后效果,如图:
