調試一個bug時發現一直以來對DrawText的 DT_WORDBREAK 參數理解有誤。
MSDN的原文如下:
DT_WORDBREAK | Breaks words. Lines are automatically broken between words if a word extends past the edge of the rectangle specified by the lprc parameter. A carriage return-line feed sequence also breaks the line. |
這里說明如果有一個word超過了rectangle的邊界,會在這個詞和下一個詞中間斷為兩行。
GDI認為 連續的英文字符為一個word,每一個數字或每一個漢字為一個word。假設要在寬為100的rect中使用 DT_WORDBREAK 繪制“dddddddddddddddddddddddddddddddddddddddd”會發現字符沒有換行,同時最后有的字符沒有完全顯示。這個是符合msdn的描述的。同樣的,如果繪制的是"dddddddddddddddddddddddddddddddddddddddddddddddddd aa"會發現實際繪制的是兩行,第一行是沒有完全顯示的“ddd”第二行就是“aa”,這是因為根據斷字的規則,第一個word“ddddddd”超過了rect的邊界,會在這個word和下一個word("aa")間換行。
如果想要不根據word換行,需要同時指定另一個標志DT_EDITCONTROL。