需要在ListBox控件中显示一些信息。
为方便查看,不使用水平滚动条。当要输出的字符串占用的宽度超过ListBox的宽度时,截断字符串,剩余的在下一行显示。

1. 计算ListBox所占的宽度,用GetClientRect。

GetClientRect返回的是客户区的大小。当ListBox中有垂直滚动条时,那么客户区的大小会相应调整。GetClientRect返回的是去掉滚动条占用区域后剩余的区域,即完全用来显示内容的区域的大小。

2. 计算字符串占用的宽度,用GetTextExtent方法。
一开始计算的不正确,明显比实际占用的值大。
上网查,发现ListBox的ClientDC并没有包含列表框字体信息。也就是说,对话框创建时所使用字体并没有“选入”ClientCD。
要获得字符串真正占用的宽度,应该先调用GetFont获得列表框的字体信息,然后将此字体选入ClientDC中。

例如:
CFont *pFont = m_List1.GetFont();
CDC *pDC = m_List1.GetDC();

CFont *pOldFont = pDC->SelectObject(pFont);

CSize sz = pDC->GetTextExtent(str);

pDC->SelectObject(pOldFont);

3. 源码

void ShowInfo(CListBox *pListBox, CString infoStr)
{
CRect clientRect;
pListBox->GetClientRect(&clientRect);
int maxWidth = clientRect.Width(); int len = infoStr.GetLength(); CFont *pFont = pListBox->GetFont();
CDC *pDC = pListBox->GetDC(); CFont *pOldFont = pDC->SelectObject(pFont); CSize sz = pDC->GetTextExtent(infoStr, len); while(sz.cx > maxWidth)
{
len--;
sz = pDC->GetTextExtent(infoStr, len);
} pDC->SelectObject(pOldFont); pListBox->AddString(infoStr.Left(len)); int strLen = infoStr.GetLength();
if(len != strLen)
{
ShowInfo(pListBox, infoStr.Right(strLen - len));
}
}

CListBox自动换行显示的更多相关文章

  1. Easyui datagrid 设置内容超过单元格宽度时自动换行显示

    datagrid 设置内容超过单元格宽度时自动换行显示 by:授客 QQ:1033553122 测试环境 jquery-easyui-1.5.3 问题描述 单元格内容超过单元格宽度不会自动化换行.如下 ...

  2. EditText自动换行显示内容

    默认的EditText是不会自动换行的,通过代码来实现: [java] view plain copy EditText editText = new EditText(this); //设置Edit ...

  3. 原生的UITableViewCell高度自适应,textLabel自动换行显示

    /* * 设置子项cell **/ - (UITableViewCell *)getChildCell:(UITableView *)tableView and:(NSIndexPath *)inde ...

  4. QLabel 文本内容自动换行显示

    需要把QLabel的WordWrap属性设置成TRUE,可以通过界面设置,也可以通过程序设置  

  5. Echarts-axislabel文字过长导致显示不全或重叠

    先看两张图 按目前情况,官方并为对axislabel的高度或者宽度做调整.所以解决方案只能从其他方案下手 解决方案有几种 第一种为上图解决方案 设置grid属性定义图的大小来释放空间,使得axisla ...

  6. Excel自动换行、Export2Excel 自动换行

    1需求:导出excel后自动换行显示. 2插件:Export2Excel 3.测试 listToExcel() { import('@/vendor/Export2Excel').then(excel ...

  7. shell脚本之颜色效果显示以及PS1颜色实战

    在bash shell脚本中我们可以使用ASCII颜色来显示文本信息. 格式:\033\[31m hello \033[0m ##m: 左侧#:这个#可以是3或者4,作用不一样. 3:前景色 4:背景 ...

  8. inputType导致TextView不能多行显示

    今天遇到一个问题很纳闷,那就是TextView不能自动换行多行显示,因为我的印象是TextView默认是可以自动换行多行显示的,今儿个怎么就不行呢. 最终找到原因,是因为设置了inputType属性导 ...

  9. CSS篇之DIV+CSS布局

    <div></div> div与其他标签一样,也是一个XHTML所支持的标签. div是XHTML中指定的,远门用于布局设计的容器标记. 简单的CSS布局 头部 内容 页脚 & ...

随机推荐

  1. sublime配置

    官网:http://www.sublimetext.com/3 下载:Windows 64 bit - also available as a portable version 安装插件:https: ...

  2. Qt 5.3更新无数,更改C++控制台输出最为赞

    迁移至 多色网

  3. Native App、Web App 还是Hybrid App

    Native App.Web App 还是Hybrid App? 技术 标点符 1年前 (2014-05-09) 3036℃ 0评论 一.什么是Native App? Native App即原生应用, ...

  4. 【linux】FTP添加用户,设置权限和目录

    一.目的,新建一个用户 test2,登录ftp,它只有自己的主目录权限,其他同级和上级目录没有权限 二.ftp安装.配置 yum -y install vsftpd //通过yum来安装vsftpd ...

  5. 为MFC中的ListBox添加水平滚动条

    我们知道,MFC中的水平滚动条并不像垂直滚动条那样的智能.当文字超出ListBox的宽度时,水平滚动条并不会自己出现,我们需要手动的调用CListBox中的函数SetHorizontalExtent设 ...

  6. 让你的jenkins能当奴隶主---说说几种Jenkins build框架

    近期又有几个朋友看了俺的文章询问.怎样让Jenkins能做到分布式.我解释了非常久,发现这也是个非常好的topic,就来博客继续念叨念叨. 这个非常easy,所以这篇文章也就介绍简单点. 首先说下Je ...

  7. Json序列化之.NET开源类库Newtonsoft.Json

    上代码: using System; using System.Collections; using System.Collections.Generic; using System.IO; usin ...

  8. XML文件标签名一致,而属性值不同,如何遍历取值写法 摘录

    <EssentialFunctions>      <Qualification description="We Offer" source="AdDe ...

  9. cxf动态调用webservice设置超时,测试线程安全

    Java代码 import java.util.Random; import java.util.concurrent.ArrayBlockingQueue; import java.util.con ...

  10. 每日英语:Why Chinese Companies Lack Homegrown Luxury Brand Power

    Chinese companies build iPads, high-speed trains and world-class telecom gear, but they can't seem t ...