调试一个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。