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