带有 DT_CALCRECT 的 DrawText - 有没有办法在不修改宽度的情况下计算矩形的高度(使用大字符串)?

Posted

技术标签:

【中文标题】带有 DT_CALCRECT 的 DrawText - 有没有办法在不修改宽度的情况下计算矩形的高度(使用大字符串)?【英文标题】:DrawText with DT_CALCRECT - Is there a way to calculate the height of the rect WITHOUT modifying the width (with large strings)? 【发布时间】:2011-12-13 19:41:54 【问题描述】:

我有一个字符串,我需要在绘图时计算矩形大小(文本高度)。我的实现使用带有DT_WORDBREAK or DT_CALCRECT 标志的DrawTextW() 函数。

我的字符串示例:

thisisaverylonglonglonglineoftextthatneedstofitinsideagivenrectwidth

我可以在MSDN docs 中看到DrawTextW() 方法声明:

如果最大的单词比矩形宽,宽度会扩大。如果文本小于矩形的宽度,则宽度会减小。如果只有一行文本,DrawText 会修改矩形的右侧,使其与行中的最后一个字符为界。

但是在 MSDN 文档中,DrawTextExW() 方法并没有说明这一点。

所以我尝试使用DrawTextExW() 方法计算高度,但结果与DrawTextW() 函数相同,它扩展了矩形的宽度以适应最大的文本行。

那么在绘制指定DT_WORDBREAKDT_CALCRECT 的大字符串(无空格)时,如何正确计算具有给定(固定)宽度的文本矩形的高度?

编辑:

顺便说一句,有人知道 Microsoft Excel 是如何绘制单元格文本的吗?此文本绘图是否有 API 调用?这是我最初的问题的来源,但是它在 Excel 中实现的方式是在任何字符(不仅仅是空格)上绘制文本和分词/自动换行。

【问题讨论】:

自从我使用 Win32 以来已经很久了,但尝试修复 Rect 的宽度,但传递一个非常高的高度。使用 DT_CALCRECT 我认为会保持宽度固定并将底部修剪到正确的大小。 不幸的是,无论矩形的高度如何,矩形的宽度仍然被修改 我想 Excel 可能会使用 GetTextExtentExPoint 来确定字符串的多少个字符将水平适合您的矩形。然后,您可以重复调用它并构建一个带有回车符的字符串,然后最终使用 DrawText 绘制全部内容,而无需使用 DT_WORDBREAK 【参考方案1】:

您需要在uFormat 参数中使用DT_WORD_ELLIPSIS 标志(当然还有DT_WORDBREAK)。这将防止由于没有空格的长字符串而扩大。虽然它仍然不会破坏那些长字符串,但你的宽度问题将得到解决。

如果您还指定DT_MODIFYSTRING,那么您可以在最终抽签之前弄清楚在哪里断开长字符串。

至于DrawText(W)DrawTextEx(W)的区别:后者提供制表符格式,设置边距,返回实际绘制的字符数。 (尺寸标注)功能没有区别。

【讨论】:

+1,谢谢 NGLN,这确实回答了我原来的问题,但是你知道 excel 是如何绘制文本的吗? (见编辑) @Simon 如果这回答了您的原始问题,请将其标记为已接受的答案。然后将您的新问题作为新问题提出。

以上是关于带有 DT_CALCRECT 的 DrawText - 有没有办法在不修改宽度的情况下计算矩形的高度(使用大字符串)?的主要内容,如果未能解决你的问题,请参考以下文章

Win GDI DrawText 渲染错误

在 MFC 中使用 DrawTextEx 自动换行

带有SpannableString的Android Canvas drawText

FFmpeg drawtext - 无法从文件中加载字体[关闭]

安卓画布drawText

Windows API一日一练 24 DrawText函数