delphi - DrawText with DT_CALCRECT - 有没有办法计算矩形的高度而不修改宽度(使用大字符串)?

标签 delphi winapi drawtext

我有一个字符串,需要在绘图时计算矩形大小(文本高度)。我的实现使用带有 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_WORDBREAKDT_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/

相关文章:

image - 在 tlistbox 中绘制缩略图

android - 如何在android中定位StaticLayout?

c++ - 除了 SetCursor 之外还有什么可以重置光标形状?

windows - 如何向所有窗口的窗口菜单添加项目?

.net - 如何检测我的应用程序是否在虚拟机中运行?

android - 拍照时在相机上绘制文字

android - 使用 WINGDING.ttf 字体在 Canvas 上绘制文本在 Android 上不起作用

delphi - 如何在 EExternal 异常期间获取 EXCEPTION_POINTERS?

delphi - 这是返回空通用值的正确方法吗?

performance - 为什么绘制小于 1.5 像素粗的线条比绘制 10 像素粗的线条慢两倍?