字体在 Windows 8 上变小 - 在 C++/MFC 程序中。如何避免这种情况?
Posted
技术标签:
【中文标题】字体在 Windows 8 上变小 - 在 C++/MFC 程序中。如何避免这种情况?【英文标题】:Fonts get smaller on Windows 8 - in C++/MFC-program. How avoid this? 【发布时间】:2015-03-12 11:52:42 【问题描述】:也许这是一个愚蠢的问题,但我找不到解决方案......
我维护一个 C++ 系统 - 使用 MFC,符合 VS2010。系统包含两个EXE文件。
其中一个 EXE 文件在 Windows 8 上运行良好。对话框中文本的字体大小在 Window 8 上与在 Vista/Windows 7 上相同。但是在 Windows 8 上运行另一个 EXE 文件时,所有字体都是小多了。 (该程序是基于对话框的,使用 CPropertySheet/CPropertyPage。)
我已阅读有关“DPI 意识”的信息,并且在 Windows 8 中对此的处理方式有所不同。但我看不出这是如何导致此问题的 - 或者如何解决它。两个 EXE 文件的工作方式相同:使用 CreateFontIndirect(指定字体名称和大小)创建 CFont:s,然后在 SetFont-calls 中使用该 CFont:s。
有什么想法吗?为什么这在一个程序中有效,而在另一个程序中无效?我只是想关闭此行为,以便 GUI 在 Windows 8 上看起来相同。我将非常感谢您的帮助! :-)
/来自瑞典的安德斯
【问题讨论】:
【参考方案1】:当您使用 CreateFontIndirect 创建 CFont 时,您应该像这样提供 DPI 比例因子:
// From CDPI: convert a point size (1/72 of an inch) to raw pixels.
int PointsToPixels(int pt) return MulDiv(pt, _dpiY, 72);
LOGFONT lf;
lf.lfHeight = -g_metrics.PointsToPixels(12);
// Fill in the rest of the structure.
HFONT hfont = CreateFontIndirect(&lf);
该代码取自 MSDN article,详细介绍了创建 DPI 感知桌面应用程序。
此TechNet article 解释了如何为特定应用程序禁用 Windows 8 DPI 缩放。这可能对您有用。
【讨论】:
谢谢!毕竟应用程序之间存在差异。这个计算没有在一个不起作用的地方完成。以上是关于字体在 Windows 8 上变小 - 在 C++/MFC 程序中。如何避免这种情况?的主要内容,如果未能解决你的问题,请参考以下文章