C# WinForms禁用DPI缩放

15

我有一个WinForm应用程序,其中包含许多图片。当我将应用程序放在DPI为120的Win7机器上时,它完全破坏了表单的外观。是否有一种方法可以禁用我的表单的缩放?

我知道这是不建议的做法,DPI应该由操作系统无缝处理。但是对于一个皮肤化的应用程序来说,图像不能很好地缩放。我没有创建所有DPI变体的图像的奢侈条件,所以请不要提出那个作为答案。

4个回答

10

更改AutoScaleMode属性后会遇到更大的问题。增加DPI也会改变系统字体大小。这是必然的,因为字体大小用点表示,1/72英寸。当DPI增加时,要获得相同的点大小,字体需要变大,并保持在相同距离观看时文字的可读性。

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

是的,背景图像需要缩放以适应更大的控件或窗体。图像中的一个像素现在不再一对一地映射到监视器的一个像素。默认的Graphics.InterpolationMode值可以很好地过滤图像。但是,这取决于图像的类型,结果如何。照片几乎总是可以很好地缩放。精细的线条和文本则不行。选择正确类型的图像可以有效避免创建单独的图像。

这个问题不会消失,直到显示器的分辨率达到打印机的分辨率。我们离桌面显示器的600dpi还有很长的路要走。手机将是第一批实现的设备。


2
600 DPI屏幕正在成为现实。只需看看您的手机(好吧,不是600而是480在这里)。未来已经到来。 - Hooch

10

这对我有用。表单仍然太大了,无法适应我的笔记本屏幕,但至少现在它不会被缩小并使一些控件无法访问。 - tonyb

9
在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();
    }
}

2
在Windows 10上使用150%缩放的4K显示器根本无法工作。 - Hexo
将此与设置AutoScaleMode为None相结合,问题得到了解决。 - Zarat
2
即使使用 AutoScaleMode = None,也无法在 Windows 10 上的150%或200%下工作。 - Franck
1
我使用 actualPixelSize * 100f / CreateGraphics().DpiY 成功了。这应该可以补偿任何 DPI 缩放。 - Pieter12345
@S.H. actualPixelSize 是您选择组件的像素大小。您实际上是撤销当前的 DPI 缩放,将其恢复到 100%。 - Pieter12345
显示剩余2条评论

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

1
将此与手动缩放控件字体(如此处另一个解决方案中建议的)相结合,解决了我的问题。 - Zarat

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