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