我有一个字符串,我需要在绘制时计算Rect大小(文本高度)。我的实现使用带有DrawTextW()
标志的DT_WORDBREAK or DT_CALCRECT
函数。
我的字符串示例:
thisisaverylonglonglonglineoftextthatneedstofitinsideagivenrectwidth
我可以在MSDN docs中看到DrawTextW()
方法声明:
如果最大的单词比矩形宽,则展开宽度。如果文本小于矩形的宽度,则宽度减小。如果只有一行文本,DrawText会修改矩形的右侧,以便它绑定行中的最后一个字符。
但是在MSDN文档中,DrawTextExW()
方法没有说明这一点。
所以我尝试使用DrawTextExW()
方法计算高度,但结果与DrawTextW()
函数相同,其中它扩展了rect的宽度以适合最大的文本行。
那么当绘制一个指定DT_WORDBREAK
和DT_CALCRECT
的大字符串(没有空格)时,如何正确计算具有给定(固定)宽度的文本rect的高度?
修改
作为附注,有没有人知道Microsoft Excel如何进行单元格文本绘制?是否有对此文本绘图的API调用?这是我的原始问题源于此,但在Excel中实现的方式是在任何字符(而不仅仅是空格)上绘制文本和wordbreak / wordwrap。
答案 0 :(得分:7)
您需要在DT_WORD_ELLIPSIS
参数中使用uFormat
标记(当然还有DT_WORDBREAK
)。这将防止由于没有空格的长字符串而扩大。但它仍然不会破坏那些长串,但你的宽度问题将会得到解决。
如果您还指定了DT_MODIFYSTRING
,那么您可以在最终抽奖之前弄明白在哪里打破那条长字符串。
至于DrawText(W)
和DrawTextEx(W)
之间的区别:后者提供标签格式,设置边距并返回实际绘制的字符数。 (尺寸标注)功能没有区别。