Delphi DrawText with DT_CALCRECT-有没有一种方法可以在不修改宽度的情况下计算矩形的高度(使用大字符串)?

Delphi DrawText with DT_CALCRECT-有没有一种方法可以在不修改宽度的情况下计算矩形的高度(使用大字符串)?,delphi,winapi,drawtext,Delphi,Winapi,Drawtext,我有一个字符串,我需要在绘图时计算Rect大小(文本高度)。我的实现使用带有DT\u WORDBREAK或DT\u CALCRECT标志的DrawTextW()函数 我的字符串的一个示例: thisisaverylonglonglonglineoftextthatneedstofitinsideagivenrectwidth 我可以在中看到,DrawTextW()方法声明: 如果最大的字比矩形宽,则宽度将扩大。如果文本小于矩形的宽度,则宽度将减小。如果只有一行文本,DrawText将修改矩形的

我有一个字符串,我需要在绘图时计算Rect大小(文本高度)。我的实现使用带有
DT\u WORDBREAK或DT\u CALCRECT
标志的
DrawTextW()
函数

我的字符串的一个示例:

thisisaverylonglonglonglineoftextthatneedstofitinsideagivenrectwidth
我可以在中看到,
DrawTextW()
方法声明:

如果最大的字比矩形宽,则宽度将扩大。如果文本小于矩形的宽度,则宽度将减小。如果只有一行文本,DrawText将修改矩形的右侧,以便将该行中的最后一个字符限定在其边界上

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

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

因此,在绘制一个指定了
DT_WORDBREAK
DT_CALCRECT
的大字符串(没有空格)时,如何正确计算具有给定(固定)宽度的文本rect的高度

编辑:


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

您需要使用
uFormat
参数中的
DT\u wordbreak
标志(当然还有
DT\u wordbreak
)。这将防止由于没有空格的长字符串而加宽。虽然它仍然不会打断那些长字符串,但您的宽度问题将得到解决

如果您还指定了
DT_MODIFYSTRING
,那么您可以在最终绘制之前自己确定在何处打断该长字符串


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

我使用Win32已经很久了,但是尝试固定矩形的宽度,但是通过一个非常高的高度。我认为使用DT_CALCRECT可以保持宽度固定,并将底部修剪到正确的大小。遗憾的是,无论rect的高度如何,rect的宽度仍然会被修改。I imagine Excel可能会使用GetTextExtentExPoint来确定字符串的多少个字符将水平地适合您的rect。然后你可以反复调用这个函数,构建一个带回车符的字符串,然后最终使用DrawText绘制整个批次,而不必使用DT_WORDBREAK+1,谢谢NGLN,这确实回答了我原来的问题,但是你知道excel如何绘制文本吗?(参见编辑)@Simon如果这回答了您的原始问题,请将其标记为已接受的答案。然后以一个新问题的形式提出你的新问题。