我可以使drawtext在字符串中有空格或者在字符串末尾加入\r\n时进行换行。然而,如果一个没有空格或者换行符的长字符串超出了绘制矩形,那么它将被剪切。如果可能的话,我想要避免这种情况发生。
在drawtext的格式标志中,没有任何能够解决这个问题的标志。你有什么想法吗?
我可以使drawtext在字符串中有空格或者在字符串末尾加入\r\n时进行换行。然而,如果一个没有空格或者换行符的长字符串超出了绘制矩形,那么它将被剪切。如果可能的话,我想要避免这种情况发生。
在drawtext的格式标志中,没有任何能够解决这个问题的标志。你有什么想法吗?
实际上,大多数情况下您需要的是来自MSDN的以下内容:
DT_EDITCONTROL
复制多行编辑控件的文本显示特性。特别地,平均字符宽度的计算方式与编辑控件相同,并且该函数不显示部分可见的最后一行。
它未提到的是,如果需要,它也会在单词中间打断,就像编辑控件一样。它确实有另外一个效果,即不显示部分可见的底部行,但在大多数用法中,我认为这并不重要,因为您可能会事先使用DT_CALCRECT来确保有足够的空间(如果没有,则不绘制部分可见的线条可能更好)。 如果真的很重要,您总是可以通过剪切等操作来处理,例如给DrawText一个更高的矩形,但已经在设备上下文中设置了较小的剪辑矩形。
DT_EDITCONTROL
与 DT_WORDBREAK
一起使用时,无论空格如何都会换行,因此在我看来这是(最)正确的答案。 - SpeedFreakDT_WORDBREAK
标志。根据MSDN上的DrawText文档,它会自动在单词之间断开行,如果一个单词超出了lpRect参数指定的矩形边缘,则会自动换行。回车换行序列也会换行。DT_CALCRECT
的DrawText
来计算矩形的大小-循环缩短字符串,直到找到第一行的字符串,然后重复处理剩余的字符串。也就是说,在绘图区域宽度内找到从索引0-n的子集;再次找到适合水平的n + 1-m字符串;重复此过程,直到到达字符串的末尾。将这些子字符串连接起来,每个之间用\r\n
强制手动换行,然后使用DrawText
进行绘制,它将正确地换行。DrawTextEx
并传入指向DRAWTEXTPARAMS
结构的指针。它有一个uiLengthDrawn
成员,它是“DrawTextEx处理的字符数,包括空格字符。该数字可以是字符串的长度或第一行落在绘图区域以下的索引。”您不应该传递DT_NOCLIP
。这可能(未经测试)会为您提供与第一种方法相同的信息,而无需循环:使我不确定的关键部分是短语“在”绘图区域下方,并且如果您的行无法打断,则可能认为它已处理了整个文本。