没有 CDC 的 MFC 字符串宽度
Posted
技术标签:
【中文标题】没有 CDC 的 MFC 字符串宽度【英文标题】:MFC string width without CDC 【发布时间】:2011-09-08 16:42:59 【问题描述】:有没有办法在不使用 CDC 或使用未与显示器链接的 CDC 的情况下获取以像素为单位的字符串的宽度。需要检索字符串宽度的类没有从 CWnd 继承以使用 CWnd::GetDC() 并且无法将现有 CDC 传递给函数。
我尝试创建一个未与显示器链接的虚拟 CDC,但这会导致 MFC 崩溃。理想情况下是这样的:
m_font = new CFont();
m_font->CreatePointFont(size * 10, _T("Arial"));
m_tempCDC = new CDC();
m_tempCDC->SelectObject(m_font);
return m_tempCDC->GetOutputTextExtent(_T("Test")).cx;
编辑:应该用字体名称变量替换字符串文字。
【问题讨论】:
【参考方案1】:字体的宽度取决于它如何转换为像素,而这取决于渲染它的设备。例如,打印机与显示器显然会有所不同。这就是为什么您需要 DC 来执行此功能的原因。
您可以使用CDC::FromHandle(::GetDC(NULL))
获取桌面版 DC。
【讨论】:
【参考方案2】:如果不知道需要使用的字体,如何计算宽度?
我建议在你看到你需要的设备上下文的地方计算宽度,并将它传递给你需要这个宽度的类。
【讨论】:
我确实知道字体,CFont 对象 m_font?以上是关于没有 CDC 的 MFC 字符串宽度的主要内容,如果未能解决你的问题,请参考以下文章
为啥 CDC::LineTo() 不在 Visual C++ 2015 MFC 对话框中绘制?
MFC PrintWindow(CPaintDC) 有效,但 PrintWindow(CDC) 无效
MFC:CBitmapCreateCompatibleBitmap() 根据传递给它的两个兼容 CDC 给出不同的结果? [复制]