DrawText的DT_CALCRECT格式能否返回文本适配RECT所需宽度?
关于DrawText() DT_CALCRECT模式的宽高获取问题
DT_CALCRECT模式下,DrawText()的返回值确实仅为格式化文本的高度,但文本所需的宽度会通过你传入的RECT结构体返回——你之前忽略了这一点。
你的初始代码里rectCheck被初始化为{0,0,0,0},调用DrawText()后,rectCheck.right字段会被填充为文本适配所需的宽度值,实际宽度可通过rectCheck.right - rectCheck.left计算得到。
修改代码验证这一点:
LPCWSTR textCheck = L"12345"; RECT rectCheck = { 0, 0, 0, 0 }; int textHeight = DrawText( hdc, textCheck, -1, &rectCheck, DT_CALCRECT); int textWidth = rectCheck.right - rectCheck.left; // textWidth即为文本适配所需的宽度,textHeight是返回的文本高度
你两次调用返回高度都是16,是因为当前DC使用的字体行高固定为16,单行文本的高度不受文本长度影响。如果启用多行模式(比如添加DT_WORDBREAK标志),返回的高度会根据换行后的总行数变化。
总结:
- DrawText()在DT_CALCRECT模式下的返回值仅代表文本高度(多行则是总高度)
- 文本所需宽度需从传入的
RECT结构体的right字段推导 - 你之前仅关注了返回值,未读取
RECT的修改后的值,才误以为没获取到宽度
内容的提问来源于stack exchange,提问作者user22157294
相关产品推荐
相关产品推荐

