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

时间:2011-10-24 02:19:28

标签: delphi winapi drawtext

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

我的字符串示例:

thisisaverylonglonglonglineoftextthatneedstofitinsideagivenrectwidth

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

  

如果最大的单词比矩形宽,则展开宽度。如果文本小于矩形的宽度,则宽度减小。如果只有一行文本,DrawText会修改矩形的右侧,以便它绑定行中的最后一个字符。

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

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

那么当绘制一个指定DT_WORDBREAKDT_CALCRECT的大字符串(没有空格)时,如何正确计算具有给定(固定)宽度的文本rect的高度?

修改

作为附注,有没有人知道Microsoft Excel如何进行单元格文本绘制?是否有对此文本绘图的API调用?这是我的原始问题源于此,但在Excel中实现的方式是在任何字符(而不仅仅是空格)上绘制文本和wordbreak / wordwrap。

1 个答案:

答案 0 :(得分:7)

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

如果您还指定了DT_MODIFYSTRING,那么您可以在最终抽奖之前弄明白在哪里打破那条长字符串。

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