一个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+字体
欢迎各位指正优化方法,谢谢!