使用DrawText的DT_CALCRECT结合DT_WORDBREAK时无法获取文本尺寸的问题求助
DrawText的DT_CALCRECT结合DT_WORDBREAK时无法获取文本尺寸的问题求助
嗨,我之前也碰到过一模一样的问题,其实根源在于DT_WORDBREAK这个标志的工作逻辑:
当你同时使用DT_CALCRECT和DT_WORDBREAK时,DrawText需要知道文本允许的最大宽度才能计算换行后的总高度。而你初始把rc2设成{0,0,0,0},相当于告诉系统没有可用的宽度空间,它自然无法计算出有效的文本尺寸,所以返回的还是初始的空矩形。
解决方法很简单,只需要调整初始矩形的设置:
- 给
rc2设置一个有效的右边界值(也就是文本允许的最大宽度),比如你要在某个控件里显示,就用控件的客户区宽度;如果是自定义绘制区域,就设一个符合需求的固定值,左、上、下边界可以保持0。 - 再调用
DrawText时,就能得到正确的换行后文本尺寸了。
给你一个具体的代码示例:
CRect rc2{ 0, 0, 500, 0 }; // 这里设置最大宽度为500,根据你的实际场景调整 dc.DrawText(txt, &rc2, DT_CALCRECT|DT_WORDBREAK); // 此时rc2的bottom就是文本换行后的总高度,right会保持你设置的最大宽度(或根据文本实际宽度调整)
额外提醒几个注意点:
- 如果你的文本容器宽度是动态变化的(比如窗口resize时),记得每次计算前都要更新
rc2.right为当前的可用宽度。 - 如果你需要配合其他对齐标志(比如
DT_LEFT、DT_CENTER),可以直接和这两个标志组合使用,不会影响尺寸计算的结果。
备注:内容来源于stack exchange,提问作者Сергей Соколов
相关产品推荐
相关产品推荐

