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

Sim*_*mon 6 delphi winapi drawtext

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

我的字符串的一个例子:

thisisaverylonglonglonglineoftextthatneedstofitinsideagivenrectwidth
Run Code Online (Sandbox Code Playgroud)

我可以在MSDN文档中看到,该DrawTextW()方法指出:

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

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

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

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

编辑:

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

NGL*_*GLN 7

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

如果你还指定了DT_MODIFYSTRING,那么你可以在最终抽签之前找出自己打破长串的地方.

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