没有 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 字符串宽度的主要内容,如果未能解决你的问题,请参考以下文章

MFC CString转换为字符数组

为啥 CDC::LineTo() 不在 Visual C++ 2015 MFC 对话框中绘制?

MFC PrintWindow(CPaintDC) 有效,但 PrintWindow(CDC) 无效

更改 SysLink 控件的背景颜色 - MFC

VS2010-MFC(图形图像:CDC类及其屏幕绘图函数)

MFC:CBitmapCreateCompatibleBitmap() 根据传递给它的两个兼容 CDC 给出不同的结果? [复制]