字体在 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 程序中。如何避免这种情况?的主要内容,如果未能解决你的问题,请参考以下文章

使字体变大或者变小的快捷键是啥?

OFFICE2013-WORD,字体老莫名其妙自己改变回宋体,怎么回事!

wps文档合并完字体变小了怎么办

XP系统装了微软雅黑之后,文字变小

C++ Windows API - 如何检索字体缩放百分比

C语言或C++怎么设置部分字体的颜色