3.在主对话框中对我们自定义的类的使用:添加一组合框控件,关联一变量CAutoSizeCombo m_Combo;给此组合框 ...
69上位机VC MFC组合框自动调节宽度显示过长文本
功能展示
开发上位机时,我们会发再组合框的下拉列表宽度和组合框的相同,固定不可自动更改,在显示的文本过长时,文本就不能够全部显示出来,我们当前例程就自己动手实现根据文本长度,自动调节组合框内下拉列表框的长度,效果如图 要点提示
我们当前例程主要是通过组合框处理颜色时,添加调节下拉列表框宽度功能,也就是在OnCtlColor()函数中实现,实现过程中我们用了GetSystemMetrics()获取垂直滚动条宽度功能,用GetTextExtent()获取子项文本总长度功能;GetTextExtent()函数原型CSize GetTextExtent( const CString&str ) const;
参数只有一个,就是工获取长度的字符串,函数返回指定字符的长度; 实现功能 1.新建基于对话框的应用程序
2.从CComboBox类派生一个自定义类class CAutoSizeCombo : publicCComboBox;在处理控件颜色的函数OnCtlColor()中实现我们自动调节组合框宽度的功能 - HBRUSH CAutoSizeCombo::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
- {
- HBRUSH hbr = CComboBox::OnCtlColor(pDC, pWnd, nCtlColor);
- switch(nCtlColor)
- {
- case CTLCOLOR_EDIT://是编辑框时
- break;
- case CTLCOLOR_LISTBOX://是组合框的列表框时
- int nItemNum=GetCount();
- int nWidth=0;
- CString strItem;
- CClientDC dc(this);
- int iSaveDC=dc.SaveDC();//获取DC
- dc.SelectObject(GetFont());//选择字体
- int iVSWidth=::GetSystemMetrics(SM_CXVSCROLL);//垂直滚动条宽度
- for(int i=0;i<nItemNum;i++)//获取每子项的长度,取最大值
- {
- GetLBText(i,strItem);//
- int iWholeWidth=dc.GetTextExtent(strItem).cx+iVSWidth;
- nWidth=max(nWidth,iWholeWidth);
- }
- nWidth+=dc.GetTextExtent("bb").cx;//额外添加点宽度
- dc.RestoreDC(iSaveDC);
复制代码- if(nWidth>0)//重新设置窗口宽度
- {
- CRect rc;
- pWnd->GetWindowRect(&rc);
- if(rc.Width()!=nWidth)
- {
- rc.right=rc.left+nWidth;
- pWnd->MoveWindow(&rc);
- }
- }break;
- }
- return hbr;
- }
复制代码3.在主对话框中对我们自定义的类的使用:添加一组合框控件,关联一变量CAutoSizeCombo m_Combo;给此组合框变量添加些文字,查看效果m_Combo.AddString("a我有多长,你就可以看到多长,毫不保留全部展示");
我们来演示下功能实现的整个过程
|