需要在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. 关于为什么要在项目中使用FTP文件服务器

    传统的上传一般做法是http上传,后台接收文件流,然后写入到服务器本地硬盘的某个位置. 如果我们想把文件单独存放在别的服务器上,那就可以借助ftp服务器了. 上传的流程则变为,http上传,后台接收文 ...

  2. html <br/>引起的”血案“

    图片一: 图片二: 图片三: 图片四:

  3. Android开发之语音识别

    2013-07-03 语音识别 2008年Google语音搜索在iphone平台上线,Android 1.5 将语音识别应用到搜索功能上. 手动输入是目前主要与手机互动的方式,语音搜索宗旨是最大限度地 ...

  4. mysql的rand函数

    项目中需要动态随机生成一些固定位数的随机数,如8位,5位等. 之前看到的写法是这样 ROUND(ROUND(RAND(),5)*100000) 这样写不太准确,有几率出现4位的情况,Rand() 函数 ...

  5. winform通过网络获取用户信息

    1.获取当前部署: public static NameValueCollection GetQueryStringParameters() { NameValueCollection nameVal ...

  6. 使用URLConnection下载文件或图片并保存到本地

    有时候需要从网络上面下载图片到本地进行保存,代码如下: package com.jointsky.jointframe.test; import java.io.FileOutputStream; i ...

  7. psr-0和psr-4命名规范(未完)

    这些命名规范都是为为自动加载服务(避免项目中有很多的include和require) psr-0: 1.命名空间必须与绝对路径一致 2.类名首字母必须大写 3.除入口文件外,其他“.php”必须只有一 ...

  8. [转]winform程序textbox滚动条保持在最下面 内容不闪烁

    在开发winform程序时,会用到textbox控件来显示信息,当把textbox的Multiline属性改为Ture时(即多行显示状态),ScrollBars属性改为Vertical(内容过多时,显 ...

  9. UIButton 按钮控件-IOS开发 (实例)

    转自:http://justcoding.iteye.com/blog/1467999 UIButton是一个标准的UIControl控件,所以如果你对UIControl不甚了解还是先看一下我的另一篇 ...

  10. 安装CentOS7后,无法联网,用yum安装软件提示 cannot find a valid baseurl for repo:base/7/x86_64 的解决方法

    无法联网的明显表现会有: 1.yum install出现 Error: cannot find a valid baseurl or repo:base 2.ping host会提示unknown h ...