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);
}
原文地址:https://www.cnblogs.com/jinxiang1224/p/8468317.html