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

47

我创建了一个应用程序,它在用户选择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上,这很好用,但是在中文版上却不起作用,表格会自我毁灭,控件甚至不显示出来,字体非常大而且超出了问题,图片框也被移动了。

那么有没有一种好的方法可以检测Windows字体比例(100%,125%和150%)而不检测DPI? 我需要一些坚实的东西,可以在所有Windows 7操作系统和语言上运行。


我打字速度很快,犯了几个拼写错误。我的意思是“DPI”,而不是“API”。抱歉。 - Landin Martens
只是建议:如果你有大量的中国客户,那么值得投入一些时间来创建至少一个 VirtualBoxVmWare 的虚拟机,这样你就可以在上面测试你的应用程序,以尽可能接近真实操作系统的保真度。 - Tigran
1
您可以使用自己的版本的 Windows,安装中文语言包,将区域设置为客户所在地并进行测试。这可能需要一天或更长时间。 - Tigran
4
为什么150%用96dpi表示,为什么你认为只有3个dpi设置?用户可以设置很多其他值。 为什么150%用96dpi表示:这是因为在计算机图形界面中,常规屏幕分辨率被定义为每英寸像素数(dpi),标准为72dpi。但是,当显示器的缩放比例增加时,例如将显示器缩放为150%,则每英寸的像素数将增加到96dpi。为什么只有3个dpi设置:实际上,并非所有设备和操作系统都只有3个dpi设置,但通常会提供一些预设选项以方便用户选择。此外,因为更高的分辨率通常需要更多的计算资源,过多的选择可能导致性能问题。 - David Heffernan
1
我只想说,我所工作的一款英文应用程序也遇到了这种情况。用户将字体比例设置为125%,Windows 7会在WinForm的中间部分隐藏控件(下拉框、复选框、标签)。开发团队认为存在动态隐藏中间部分的配置问题,但事实证明是字体比例导致用户无法在固定高度的WinForm上看到控件。 - dsum
显示剩余2条评论
4个回答

19

正确处理可变DPI设置的方法不是检测它们并在switch语句中手动调整控件大小(首先,比你在示例if语句中展示的可能性更多)。

相反,您应该将窗体的AutoScaleMode属性设置为AutoScaleMode.Dpi,让框架为您处理此问题。

在窗体的构造函数中添加以下代码(或在设计时设置此属性):

this.AutoScaleMode = AutoScaleMode.Dpi;

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


1
我尝试过那样做,但问题是我的应用程序会因此出现混乱。 - Landin Martens
1
@用户,“messes up”的意思是什么?具体出了什么问题?你尝试过调试吗?你是否使用相对定位来控制,例如将它们放在容器中并设置“Anchor”和“Dock”属性?绝对定位永远不会奏效,即使用户更改了其默认的字体类型/大小,更别说DPI参与其中了。 - Cody Gray
8
使用AutoScaleMode.none解决了我的问题! - Landin Martens
9
@Landin 建议不要使用AutoScaleMode.None,因为这恰恰是你不应该使用的选项。 - Mahmoud Al-Qudsi
3
使用AutoScaleMode.None也解决了我的问题。理论上可能没有什么帮助,但实际上有助于解决125%字体放大引起的问题。 - TaW
显示剩余2条评论

5

这是另一个参考资料 http://technet.microsoft.com/zh-cn/library/dn528846.aspx - airstrike

2

使用以下方法获取系统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
}

对于100%-->值为96,比例为1.0

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

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

现在您可以通过此比例自动调整大小并设置新的字体大小。


1
无论显示设置中的“比例和布局”设置如何,此键始终为96。 - Joan Charmant

-2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接