【发布时间】:2011-12-13 19:41:54
【问题描述】:
我有一个字符串,我需要在绘图时计算矩形大小(文本高度)。我的实现使用带有DT_WORDBREAK or DT_CALCRECT 标志的DrawTextW() 函数。
我的字符串示例:
thisisaverylonglonglonglineoftextthatneedstofitinsideagivenrectwidth
我可以在MSDN docs 中看到DrawTextW() 方法声明:
如果最大的单词比矩形宽,宽度会扩大。如果文本小于矩形的宽度,则宽度会减小。如果只有一行文本,DrawText 会修改矩形的右侧,使其与行中的最后一个字符为界。
但是在 MSDN 文档中,DrawTextExW() 方法并没有说明这一点。
所以我尝试使用DrawTextExW() 方法计算高度,但结果与DrawTextW() 函数相同,它扩展了矩形的宽度以适应最大的文本行。
那么在绘制指定DT_WORDBREAK 和DT_CALCRECT 的大字符串(无空格)时,如何正确计算具有给定(固定)宽度的文本矩形的高度?
编辑:
顺便说一句,有人知道 Microsoft Excel 是如何绘制单元格文本的吗?此文本绘图是否有 API 调用?这是我最初的问题的来源,但是它在 Excel 中实现的方式是在任何字符(不仅仅是空格)上绘制文本和分词/自动换行。
【问题讨论】:
-
自从我使用 Win32 以来已经很久了,但尝试修复 Rect 的宽度,但传递一个非常高的高度。使用 DT_CALCRECT 我认为会保持宽度固定并将底部修剪到正确的大小。
-
不幸的是,无论矩形的高度如何,矩形的宽度仍然被修改
-
我想 Excel 可能会使用 GetTextExtentExPoint 来确定字符串的多少个字符将水平适合您的矩形。然后,您可以重复调用它并构建一个带有回车符的字符串,然后最终使用 DrawText 绘制全部内容,而无需使用 DT_WORDBREAK