重回MFC之关于获取文本宽度【思源黑体 CN】

一个MFC需求,动态创建的自定义CStatic中需要实现自适应宽度。

 现象与思路:

 首选想到的是GetTextExtent,

遇到的问题是,

1.SetWindowText之后获取到的文字宽度不准确,应该是没有使用到我们指定的字体来计算宽度,

2.在重绘时遇到文本宽度,重绘时再次调整宽度、位置会产生循环重绘,故不能用(SWP_NOREDRAW解决不了多个动态控件排序的问题,会产生文字重叠)。

处理办法

int cx = 0;
int cy = 0;
CDC memDC;
memDC.CreateCompatibleDC(this->GetDC());
if (memDC != NULL)
{
memDC.SelectObject(cStatic->m_font);
CSize size = memDC.GetTextExtent((CString)displayStr.c_str());
memDC.DeleteDC();
cx = size.cx;
cy = size.cy;
}
 //防止CreateCompatibleDC失败使用默认字体宽度并加个系数。
if (cx <= 0)
{
CSize siz = cStatic->GetDC()->GetTextExtent((CString)displayLen.c_str());
cx = siz.cx*1.5;
cy = 30;
}
 
 
 
备注说明:
cStatic->m_font 是需要指定的字体,试过可以是GDI+字体 
欢迎各位指正优化方法,谢谢!
 
 
 

原文地址:https://www.cnblogs.com/yangshaoqing/p/15665877.html