代码之家  ›  专栏  ›  技术社区  ›  MarkP

C WinForms禁用DPI缩放

  •  8
  • MarkP  · 技术社区  · 14 年前

    我有一个WinForm应用程序,它承载许多图像。当我将应用程序放在DPI为120的Win7机器上时,它会完全破坏窗体的外观。是否有方法禁用窗体的缩放?

    我知道这是不建议的,DPI应该是无缝的,由操作系统来处理。但是当涉及到剥皮应用程序时,图像的缩放效果并不好。我没有为所有DPI变种创建图像的奢侈,因此请不要建议作为答案。

    3 回复  |  直到 6 年前
        1
  •  11
  •   Hans Passant    8 年前

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

    由于控件不再调整大小,因此打开的文本(例如,按钮)不再适合。解决这一问题的一种方法是按比例更改控件上的字体大小。如果您让所有控件继承表单字体,那么很容易,只需更改表单的字体属性就会自动更新控件。明显的缺点是,用户阅读文本会比较困难。当dpi达到每英寸150点及以上时,这种情况尤其糟糕,你的用户界面变成了一个不可用的邮票。

    是的,背景图像需要缩放以适应更大的控件或窗体。图像中的一个像素现在不再将一对一映射到监视器的一个像素。默认graphics.interpolationMode值在过滤图像方面做得相当不错。但这取决于图像的类型,结果如何。一张照片几乎总是能很好地缩放。细致入微的线条艺术和文字并没有。选择正确的图像有助于避免创建单独的图像。

    这个问题不会消失,直到显示器开始有打印机的分辨率。对于桌面显示器来说,我们离600 dpi还有很长的路要走。首先是电话。

        2
  •  4
  •   Helper    10 年前

    在对Form1构造函数中的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();
        }
    }
    
        3
  •  3
  •   Jeff Ogata    14 年前

    你可以设置 AutoScaleMode 表单的属性 None .