记一次换行显示问题分析

本文记录在解决换行显示问题中的分析过程。

背景描述

换行显示控件 CToolTipCtrl 在显示时,没有按照预期进行换行

问题分析

该控件是系统控件,正常来说不会有什么问题,因此,应该是使用的问题。在网上搜罗一大圈,都说这个控件在默认情况下,只会显示单行,如要支持多行显示,需要设置 SetMaxTipWidth 成员函数,也照着这么做了,可还是显示单行。这就很奇怪的。

接着,在测试小工程中,单独测试 CToolTipCtrl 控件,设置内容中包含换行符 \r\n 或者 \r\n,都能达到换行效果,那为什么在工程中就不行了呢?

在这个点上卡了好几天,先暂用多加空行的方式,强制第二行内容显示在实际第二行上,这是不优雅的做法,就先这么用吧,等测试发现问题再说。

过了几天,果然测试报问题了,上述这种做法不能适应显示宽度跟随DPI变化的场景,一旦显示宽度改变,增加的空格个数不够,第二行的内容就有部分会显示在第一行末尾,这下到了不得不解决的时候了。

在工程中,先将显示内容固定写死,如 "中国\r人们\n共和国\r\n",发现换行效果正常,载入从 xml 文件中读取到的内容,显示不正常,问题定位到了。带有换行符的同样的字符串,从xml文件中解析出来时,会将 \r\n 解析为字符串,而不是转义字符。

接下来的问题就变成,如何正确的从 xml 文件中读取包含换行符的字符串?

经过一顿 google,发现答案 how-to-add-a-newline-line-break-in-an-xml-file,在xml文件中,使用 
 表示 LF, 使用 
 表示 CR。因此,可在需要换行的地方,加上 
 即可达成效果。

问题拓展


又是怎么来的呢?
image.png

从上图可以看出,xD是回车符CR的十六进制表示,xA是换行符LF的十六进制表示。

在这篇 List of XML and HTML character entity references 文档中,可以找到在 XML 文档格式中定义的标准公用实体字符集合:

  1. & 表示 & 符号
  2. < 表示 小于号
  3. > 表示 大于号
  4. ' 表示 单引号
  5. " 表示 双引号

除了上述标准实体字符集合外,还支持自定义其他符号,格式如下:

	&#nnn;
    &#xhhh;

nnn是符号的十进制表示,hhh是十六进制表示,当以十六进制表示时,x必须为小写。

小结

想要在XML格式文档中表示带有换行的字符串时,需要用 
 当做换行符。

posted @ 2023-05-19 14:12  浩天之家  阅读(91)  评论(0编辑  收藏  举报