使DrawText中断字符串

Making DrawText break a string

本文关键字:字符串 中断 DrawText      更新时间:2023-10-16

所以如果字符串有空格,或者如果我在字符串的末尾输入rn,我可以使drawtext中断字符串。但是,没有空格或换行符的长字符串将继续越过绘制矩形并被剪切。如果可能的话,我想防止这种情况发生。

对我来说,drawtext的格式标志中没有什么能使这种情况发生。什么好主意吗?

实际上,在大多数情况下,这就是你想要的,从MSDN:

DT_EDITCONTROL

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

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

你通常会做的是使用DT_WORDBREAK标志。从MSDN上的DrawText文档中可以看到:

优惠的话。线路是自动的如果一个词可以的话,就在两个词之间延伸到矩形的边缘由lpRect参数指定。一个回车换行顺序

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

然而,你有一个单一的不可破坏的行 -也就是说,没有单词。你需要自己照顾休息。有两种解决方法:
  • 使用DrawTextDT_CALCRECT来计算矩形循环的大小,缩短字符串,直到找到第一行的字符串,然后重复剩下的字符串。也就是说,从索引0-n中找到一个子集,它水平地适合你的绘图区域的宽度;从n+1-m中找到与水平匹配的弦;重复,直到你打到绳子的末端。将这些子字符串与rn连接在每个子字符串之间以强制手动中断,然后使用DrawText绘制,它将正确包装。

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

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