检测 Windows 字体大小(100%、125% 和 150%)

Posted

技术标签:

【中文标题】检测 Windows 字体大小(100%、125% 和 150%)【英文标题】:Detect Windows font size (100%, 125%, and 150%) 【发布时间】:2012-03-11 12:13:54 【问题描述】:

我创建了一个在用户选择 125% 或 150% 之前都能正常运行的应用程序。它会破坏我的应用程序。后来我找到了一种通过检测DPI来查找字体大小的方法。

在使用中文版 Windows 7 的人开始使用我的应用程序之前,这一直很好用。整个应用程序在中文 Windows 7 上中断。据我所知(我无法真正测试它,因为我只有英文版本并且安装语言包不会导致问题)中文字符导致奇怪的 DPI 破坏了我的应用。

我当前的代码是这样工作的:

if (dpi.DpiX == 120) // For 125% fonts

    // Resize form and set default font to correct problems

else if (dpi.DpiX == 96) // For 100 and 150% fonts

    // Resize form and set default font to correct problems

在英文版的 Windows 7 上运行良好,但不知何故,中文版跳过了这一点,并且表单自行破坏,控件甚至不显示,字体非常大并且克服了问题,图片框被移动。

那么在不检测 DPI 的情况下检测 Windows 字体比例(100%、125% 和 150%)的好方法是什么?我需要可以在所有 Windows 7 操作系统和语言上运行的可靠软件。

【问题讨论】:

我的打字速度非常快,并且出现了一些拼写错误。我的意思是说“DPI”而不是“API”。对不起 你所描述的听起来更像是视频驱动程序和/或安装的字体的问题...... 只是建议:如果你有大量的中国客户,值得花一些时间为VirtualBoxVmWare创建至少VirtualMachine,这样你就可以在上面测试你的应用了尽可能接近真实操作系统。 您可以使用自己的windows 版本,安装中文语言包,将区域设置设置为您的客户位置并进行测试。这需要一天或更长时间 为什么 150% 用 96dpi 表示,为什么你认为只有 3 个 dpi 设置?用户可以设置许多其他值。 【参考方案1】:

处理可变 DPI 设置的正确方法是不要检测它们并在 switch 语句中手动调整控件的大小(对于初学者来说,比您在示例 if 语句中显示的可能性要多得多) .

相反,您应该将表单的AutoScaleMode property 设置为AutoScaleMode.Dpi,并让框架为您处理。

将以下代码添加到表单的构造函数(或在设计时设置此属性):

this.AutoScaleMode = AutoScaleMode.Dpi;

虽然您可能更喜欢使用AutoScaleMode.Font。有关自动缩放的更多信息,请参阅the MSDN documentation。

【讨论】:

我试过这样做,但问题是我的应用程序搞砸了 @user “搞砸”是什么意思?究竟出了什么问题?您如何尝试调试它?您是否对控件使用相对定位,例如将它们放置在容器中并设置AnchorDock 属性?绝对定位永远不会起作用,即使用户更改了他们的默认字体/大小,更不用说涉及 DPI。 使用 AutoScaleMode.none 解决了我的问题! @Landin AutoScaleMode.None 正是你不应该使用的。 使用AutoScaleMode.None 也解决了我的问题。理论上没有希望,实际上它有助于解决 125% 字体放大的问题。【参考方案2】:

对于 C++/Win32 用户,这里有一个很好的参考:Writing High-DPI Win32 Applications。

【讨论】:

这里还有一点参考technet.microsoft.com/en-us/library/dn528846.aspx【参考方案3】:

使用以下方法获取系统 DPI 比例:

从位于Computer\HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics 的注册表AppliedDPI dword 中读取。然后除以96

try

    double scale = 1.0;
    using (RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop\\WindowMetrics"))
    
        if (key != null)
        
            Object o = key.GetValue("AppliedDPI");
            if (o != null)
            
                int value = (int)o;
                scale = (double)value / 96.0;
            
        
    

catch (Exception ex)  //just for demonstration...it's always best to handle specific exceptions

    //react appropriately

for 100% --> value is 96 scale is 1.0

对于 125% --> 值为 120 比例为 1.25

对于 150% --> 值为 144 比例为 1.5

现在您可以自动调整表单大小并按此比例设置新的字体大小;

【讨论】:

【参考方案4】:

如果您使用的是较新版本的 Windows,我建议您重新安装显卡驱动程序(例如安装较新版本),我遇到了同样的问题,我的显示比例设置为 100%,但字体不正确。 希望这能解决您的问题

【讨论】:

以上是关于检测 Windows 字体大小(100%、125% 和 150%)的主要内容,如果未能解决你的问题,请参考以下文章

在我的 C# 应用程序中禁用 Windows 字体大小增加

高分辨率笔记本桌面图标字体显示大小不一致怎么办

不要在 mfc 中更改相对于 windows dpi 的对话框字体?

掉坑日志:Windows Native API与DPI缩放

停止 Firefox DPI 缩放(当 Windows 设置为 125% 时)

windows10字体小模糊怎么调