带有 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_WORDBREAK
和DT_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 - 有没有办法在不修改宽度的情况下计算矩形的高度(使用大字符串)?的主要内容,如果未能解决你的问题,请参考以下文章
带有SpannableString的Android Canvas drawText