combobox之下拉宽度自适应

    xiaoxiao2021-03-25  78

    效果对比

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

    优化前

    优化后

    从上图中可看到,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://ju.6miu.com/read-34628.html

    最新回复(0)