记一次换行显示问题分析
本文记录在解决换行显示问题中的分析过程。
背景描述
换行显示控件 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
。因此,可在需要换行的地方,加上 

即可达成效果。
问题拓展


又是怎么来的呢?
从上图可以看出,xD是回车符CR的十六进制表示,xA是换行符LF的十六进制表示。
在这篇 List of XML and HTML character entity references 文档中,可以找到在 XML
文档格式中定义的标准公用实体字符集合:
&
表示 & 符号<
表示 小于号>
表示 大于号'
表示 单引号"
表示 双引号
除了上述标准实体字符集合外,还支持自定义其他符号,格式如下:
&#nnn;
&#xhhh;
nnn
是符号的十进制表示,hhh
是十六进制表示,当以十六进制表示时,x
必须为小写。
小结
想要在XML格式文档中表示带有换行的字符串时,需要用 

当做换行符。