記一次換行顯示問題分析

本文記錄在解決換行顯示問題中的分析過程。

背景描述

換行顯示控件 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格式文檔中表示帶有換行的字符串時,需要用 
 當做換行符。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章