本文記錄在解決換行顯示問題中的分析過程。
背景描述
換行顯示控件 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格式文檔中表示帶有換行的字符串時,需要用 

當做換行符。