需要在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. Spring 事务传播行为

    事务传播行为 指定是Spring中一个事务方法调用另一个事务方法时.处理的行为 使用方式: @Transactional(propagation=Propagation.REQUIRED) 事务的使用 ...

  2. JDBC 增删改查代码 过滤查询语句

    package test; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; i ...

  3. Linux下 iptables防火墙 放开相关port 拒绝相关port 及查看已放开port

    我用的是fedora 14 1. 查看iptables 防火墙已经开启的port:/etc/init.d/iptables status [root@hzswtb2-mpc ~]#/etc/rc.d/ ...

  4. windows下安装redis及其客户端

    首先下载redis安装包:https://github.com/MSOpenTech/redis/releases 解压安装包到相应文件夹,任何盘符都行. 文件介绍:redis-server.exe: ...

  5. android开发新浪微博客户端 完整攻略 [新手必读]

    开始接触学习android已经有3个礼拜了,一直都是对着android的sdk文档写Tutorials从Hello World到Notepad Tutorial算是初步入门了吧,刚好最近对微博感兴趣就 ...

  6. RESTful Web Service实战 小结1

    1 REST的基本实现形式HTTP+URI+XML,但不是唯一形式.XML后来被Json格式替代.REST是一中架构风格(Representational State Transfer,表述性状态转移 ...

  7. Linux 用 shell 脚本 批量 导入 csv 文件 到 mysql 数据库

    前提: 每个csv文件第一行为字段名 创建的数据库字段名同csv 文件的字段名 1. 批量导入 多个 csv 文件 for file in ./*.csv;do mv $file tablename. ...

  8. jquery常见插件用法表

    一:美化select表单:chosen.jquery.js http://harvesthq.github.io/chosen/ 关于ajax更新列表后需要触发下插件的事件,才会表现出来:(http: ...

  9. CLoadScene类

    #ifndef __LOADSCENE_H__ #define __LOADSCENE_H__ #include "GameFrameHead.h" class CGameScen ...

  10. jq使用自定义属性实现有title的tab切换

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...