我有一个字符串,需要在绘图时计算矩形大小(文本高度)。我的实现使用带有 DT_WORDBREAK 或 DT_CALCRECT
标志的 DrawTextW()
函数。
我的字符串示例:
thisisaverylonglonglonglineoftextthatneedstofitinsideagivenrectwidth
我可以在 MSDN docs 中看到,该 DrawTextW()
方法指出:
If the largest word is wider than the rectangle, the width is expanded. If the text is less than the width of the rectangle, the width is reduced. If there is only one line of text, DrawText modifies the right side of the rectangle so that it bounds the last character in the line.
但是在 MSDN 文档中,DrawTextExW()
方法没有说明这一点。
因此,我尝试使用 DrawTextExW()
方法计算高度,但结果与 DrawTextW()
函数相同,它扩展了适合最大文本行的矩形。
那么,在绘制一个大字符串(没有空格)时,如何正确计算具有给定(固定)宽度的文本矩形的高度,其中 DT_WORDBREAK
和 DT_CALCRECT
有指定吗?
编辑:
顺便说一句,有谁知道 Microsoft Excel 如何绘制单元格文本?是否有针对此文本绘制的 API 调用?这是我最初的问题的根源,但是它在 Excel 中的实现方式是在任何字符(不仅仅是空格)上绘制文本和断字/自动换行。
最佳答案
您需要在 uFormat
参数中使用 DT_WORD_ELLIPSIS
标志(当然还有 DT_WORDBREAK
)。这将防止由于没有空格的长字符串而变宽。虽然它仍然不会破坏那些长字符串,但你的宽度问题将得到解决。
如果您还指定了DT_MODIFYSTRING
,那么您可以在最终绘制之前找出自己在哪里中断该长字符串。
至于DrawText(W)
和DrawTextEx(W)
之间的区别:后者提供制表符格式、设置边距并返回实际绘制的字符数。 (尺寸)功能没有差异。
关于delphi - DrawText with DT_CALCRECT - 有没有办法计算矩形的高度而不修改宽度(使用大字符串)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7870766/