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

时间:2012-02-21 06:38:26

标签: c# .net winforms windows-7 cjk

我创建了一个完美运行的应用程序,直到用户选择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操作系统和语言上运行的实用程序。

4 个答案:

答案 0 :(得分:19)

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

相反,您应该将表单的AutoScaleMode property设置为if,然后让框架为您处理。

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

AutoScaleMode.Dpi

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

答案 1 :(得分:5)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

使用此获取系统 DPI 比例:

从位于 AppliedDPI 的注册表 Computer\HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics 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

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