【问题标题】:C# WinForms disable DPI scalingC# WinForms 禁用 DPI 缩放
【发布时间】:2010-10-24 16:32:12
【问题描述】:

我有一个承载许多图像的 WinForm 应用程序。当我将应用程序放在 DPI 为 120 的 Win7 机器上时,它完全破坏了表单的外观。有没有办法禁用我的表单的缩放?

我知道这是不建议的,DPI 应该是无缝的并由操作系统处理。但是当涉及到皮肤应用程序时,图像不能很好地缩放。我没有为所有 DPI 变体创建图像的奢侈,所以请不要将其作为答案。

【问题讨论】:

    标签: c# winforms scale dpi


    【解决方案1】:

    更改 AutoScaleMode 属性时会遇到更大的问题。增加 DPI 也会改变系统字体大小。必须如此,字体大小以点表示,1/72 英寸。当 DPI 增加时,字体需要更大才能获得相同的点大小,并在相同距离查看时保持文本同样可读。

    由于控件不再调整大小,因此按钮上的文本不再适合。解决此问题的一种方法是按比例更改控件上的字体大小。如果您让所有控件继承表单字体很容易,只需更改表单的 Font 属性也会自动更新控件。明显的缺点是用户将很难阅读文本。当 DPI 达到每英寸 150 点及以上时,这尤其糟糕,您的 UI 只会变成无法使用的邮票。

    是的,背景图像需要缩放以适应更大的控件或表单。图像中的像素现在不再一对一地映射到显示器的像素。默认的 Graphics.InterpolationMode 值在过滤图像方面做得相当不错。但这取决于图像的种类,结果如何。照片几乎总是可以很好地缩放。精细的线条艺术和文字没有。选择正确类型的图像有助于避免创建单独的图像。

    在显示器开始具有打印机所具有的分辨率之前,这个问题不会消失。我们距离桌面显示器的 600 dpi 还有很长的路要走。手机是第一位的。

    【讨论】:

    • 600 DPI 屏幕正在成为现实。看看你的手机(好吧,这里不是 600 而是 480)。未来已来。
    【解决方案2】:

    在 Form1-constructor 中自动生成的 InitializeComponent 调用之前添加一行代码为我解决了这个问题:

    public partial class Form1 : Form
    {
        public Form1()
        {
            // Make the GUI ignore the DPI setting
            Font = new Font(Font.Name, 8.25f * 96f / CreateGraphics().DpiX, Font.Style, Font.Unit, Font.GdiCharSet, Font.GdiVerticalFont);
            InitializeComponent();
        }
    }
    

    【讨论】:

    • 在具有 150% 缩放 4K 显示器的 Windows 10 上根本无法使用
    • 将此与将 AutoScaleMode 设置为 None 相结合解决了我的问题
    • 即使在 AutoScaleMode = None 下也无法在 150% 或 200% 的 Windows 10 上运行
    • 这在 Windows 10 (1809) 150% 缩放上为我解决了这个问题
    • 使用actualPixelSize * 100f / CreateGraphics().DpiY 为我工作。这应该可以补偿任何 DPI 缩放。
    【解决方案3】:

    创建一个应用程序清单文件(右键单击项目/添加/新项目/应用程序文件)并取消注释此部分:

    <application xmlns="urn:schemas-microsoft-com:asm.v3">
      <windowsSettings>
        <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware
      </windowsSettings>
    </application>
    

    此网站的信用:https://www.telerik.com/blogs/winforms-scaling-at-large-dpi-settings-is-it-even-possible-

    【讨论】:

    • 这对我有用。该表单对于我的笔记本电脑屏幕来说仍然很大,但至少它现在没有被缩小并且使某些控件无法访问。
    【解决方案4】:

    您可以将表单的AutoScaleMode属性设置为None

    【讨论】:

    • 将此与手动缩放控件的字体相结合(如此处的另一个解决方案中所建议的那样)为我解决了这个问题。
    猜你喜欢
    • 2021-12-15
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2014-11-22
    相关资源
    最近更新 更多