效果对比

先看下优化前后的效果,再看实现过程.

优化前

combobox之下拉宽度自适应

优化后

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);
}

相关文章:

  • 2022-02-14
  • 2021-06-23
  • 2022-01-14
  • 2022-01-21
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-08-01
  • 2022-12-23
  • 2022-12-23
  • 2021-10-17
  • 2022-01-01
  • 2021-12-18
相关资源
相似解决方案