如何检测CStatic控件文本是否过长?
检测CStatic控件文本是否过长(需显示省略号)
方法一:针对MFC自带SS_ENDELLIPSIS风格的CStatic
如果你的CStatic是通过设置SS_ENDELLIPSIS或SS_PATHELLIPSIS风格实现省略号显示,可按以下步骤判断:
- 获取控件客户区宽度:调用
GetClientRect(CRect& rc),取rc.Width()作为可用显示宽度。 - 获取控件的DC和字体:
CDC* pDC = GetDC(); CFont* pOldFont = pDC->SelectObject(GetFont()); - 用
DrawText结合排版标记计算文本所需的理想宽度:CString strText; GetWindowText(strText); CRect rcCalc(0, 0, 0, 0); pDC->DrawText(strText, rcCalc, DT_CALCRECT | DT_SINGLELINE | DT_END_ELLIPSIS); - 对比宽度:若
rcCalc.Width() > rcClient.Width(),说明文本过长,需要显示省略号。 - 恢复DC状态并释放资源:
pDC->SelectObject(pOldFont); ReleaseDC(pDC);
方法二:针对GDI+自定义绘制的StringTrimmingEllipsisCharacter模式
如果是用GDI+绘制文本并设置了StringTrimmingEllipsisCharacter,可通过GDI+的布局计算接口判断:
- 确保已初始化GDI+(程序启动时调用
GdiplusStartup),并包含头文件:#include <gdiplus.h> using namespace Gdiplus; - 获取控件客户区和文本内容:
CRect rcClient; GetClientRect(rcClient); CString strText; GetWindowText(strText); - 创建GDI+绘图相关对象:
Graphics graphics(GetDC()->GetSafeHdc()); Font font(GetFont()->GetSafeHandle()); StringFormat format; format.SetTrimming(StringTrimmingEllipsisCharacter); format.SetFormatFlags(StringFormatFlagsNoWrap); // 启用单行模式 - 计算文本布局的实际边界:
RectF layoutRect(0, 0, (REAL)rcClient.Width(), (REAL)rcClient.Height()); RectF textRect; graphics.MeasureString(CW2W(strText), strText.GetLength(), &font, layoutRect, &format, &textRect); - 判断是否超出:若
textRect.Width > layoutRect.Width,则文本过长需显示省略号。
关键说明
CDC::GetTextExtent计算的是文本无约束的理想宽度,未考虑省略号的排版规则,因此结果不准。而DrawText(DT_CALCRECT)或GDI+的MeasureString会结合省略号的显示逻辑,计算文本在控件约束下的实际需求宽度,结果更准确。
内容的提问来源于stack exchange,提问作者ssroreo
相关产品推荐
相关产品推荐

