因此,如果字符串有空格,或者如果我在字符串末尾放入 \r\n,我可以让 drawtext 打破字符串。但是,其中没有空格或换行符的长字符串继续通过绘图矩形并被剪裁。如果可能的话,我想防止这种情况发生。
在我看来,drawtext 的格式标志中没有任何东西可以使这种情况发生。有任何想法吗?
实际上,这是您在大多数情况下想要的,来自MSDN:
DT_EDITCONTROL
复制多行编辑控件的文本显示特征。具体来说,平均字符宽度的计算方式与编辑控件相同,并且该函数不显示部分可见的最后一行。
它没有提到的是,如果需要,它还会在中间打断单词,就像编辑控件一样。它确实具有不显示部分可见底线的其他效果,但在大多数用法中,我认为这并不重要,因为您可能提前使用 DT_CALCRECT 以确保您有足够的空间(如果没有,则不绘制部分可见线可能是最好的)。如果它真的很重要,你总是可以做一些剪裁,比如给 DrawText 一个更高的矩形,但已经在设备上下文上设置了一个更小的剪裁矩形。
您通常会使用DT_WORDBREAK
标志。从MSDN 上的 DrawText 文档,这:
断词。如果单词超出 lpRect 参数指定的矩形边缘,则单词之间会自动换行。回车换行序列也会换行。
如果未指定,则输出为一行。
然而,你有一条牢不可破的线——也就是说,没有文字。 您需要自己照顾休息时间。 您可以通过两种方式解决此问题:
使用DrawText
withDT_CALCRECT
计算矩形的大小 - 循环,缩短字符串,直到找到第一行的字符串,然后对剩余的字符串重复。也就是说,从索引 0-n 中找到水平适合绘图区域宽度的子集;从 n+1-m 中找到再次水平匹配的字符串;重复直到你击中你的字符串的末尾。在每个子字符串之间连接这些子字符串\r\n
以强制手动中断,然后绘制 withDrawText
并且它将正确换行。
使用DrawTextEx
并传入指向DRAWTEXTPARAMS
结构的指针。它有一个uiLengthDrawn
成员是“DrawTextEx 处理的字符数,包括空白字符。该数字可以是字符串的长度或位于绘图区域下方的第一行的索引。” 你不应该通过DT_NOCLIP
。这可能(未经测试)将为您提供与没有循环的第一种方法大致相同的信息:让我不确定的关键位是绘图区域“下方”的短语,如果您的线牢不可破,它可能会认为它处理了整个文本。
第一种方法将始终有效,并且是我用于自己的富文本处理的简单版本。