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