使DrawText打破一个字符串

时间:2011-05-01 20:21:30

标签: c++ winapi drawtext

因此,如果字符串有空格,或者如果我在字符串的末尾放入\ r \ n,我可以使drawtext断开字符串。但是,一个没有空格或换行符的长字符串会继续经过绘图矩形并被剪裁。如果可能的话,我想阻止这种情况。

drawtext的格式标志中没有任何内容可以突显我的意思。有什么想法吗?

2 个答案:

答案 0 :(得分:8)

实际上,在大多数情况下,这都是您想要的,来自MSDN

  

DT_EDITCONTROL

     

复制多行编辑的文本显示特征   控制。具体而言,计算平均字符宽度   与编辑控件的方式相同,但功能没有   显示部分可见的最后一行。

它没有提到的是,如果需要,它也会在中间打破单词,就像编辑控件那样。它确实具有不显示部分可见底线的其他效果,但在大多数用法中我认为这不重要因为您可能提前使用DT_CALCRECT以确保您有足够的空间(如果没有,则不会部分绘制无论如何,可见线可能是最好的)。如果真的很重要,你总是可以做一些剪辑,例如给DrawText一个更高的矩形,但在设备上下文中设置一个更小的剪辑矩形。

答案 1 :(得分:5)

通常做的是使用DT_WORDBREAK标志。从DrawText documentation on MSDN开始,这个:

  

打破话语。线条是自动的   如果一个单词会在单词之间断开   延伸超过矩形的边缘   由lpRect参数指定。一个   回车换行顺序   也打破了界限。

     

如果未指定,则输出已打开   一行。

但是,你有一个单一的牢不可破的行 - 也就是说,没有单词。 您需要自己照看休息时间。您可以通过以下两种方式解决问题:

  • 使用DrawTextDT_CALCRECT计算矩形的大小 - 循环,缩短字符串,直到找到第一行的字符串,然后重复剩下的字符串。也就是说,找到索引0-n中的子集,该子集水平地适合绘图区域的宽度;从n + 1-m找到再次水平放置的字符串;重复,直到你到达字符串的末尾。在每个子串之间用\r\n连接这些子串以强制手动中断,然后用DrawText绘制它将正确包装。

  • 使用DrawTextEx并传入指向DRAWTEXTPARAMS结构的指针。它有一个uiLengthDrawn成员,它是“由DrawTextEx处理的字符数,包括空格字符。数字可以是字符串的长度或第一行的索引低于绘图区域。”您应该传递DT_NOCLIP。这可能(没有测试它)将为你提供与第一种方法相同的信息而没有循环:使我不确定的关键位是绘图区域“下方”的短语,如果你的线是牢不可破的,它可能会想到它处理了整个文本。

第一种方法将始终有效,并且是我用于自己的富文本处理的简单版本。