C#WinForms禁用DPI缩放

C#WinForms禁用DPI缩放,c#,winforms,scale,dpi,C#,Winforms,Scale,Dpi,我有一个WinForm应用程序,它承载许多图像。当我将应用程序放在DPI为120的Win7机器上时,它完全破坏了表单的外观。有没有办法禁用我的表单的缩放 我知道这是不建议的,DPI应该是无缝的,由操作系统处理。但是,对于蒙皮应用程序,图像的缩放效果不好。我没有为所有DPI变体创建图像的特权,因此请不要建议将此作为答案。您可以将表单的AutoScaleMode属性设置为None更改AutoScaleMode属性时,您会遇到更大的问题。增加DPI也会更改系统字体大小。当然,字体大小以点表示,1/72

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


我知道这是不建议的,DPI应该是无缝的,由操作系统处理。但是,对于蒙皮应用程序,图像的缩放效果不好。我没有为所有DPI变体创建图像的特权,因此请不要建议将此作为答案。

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

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

由于控件不再调整大小,因此按钮上的文本不再适合。解决这个问题的一种方法是按比例更改控件上的字体大小。如果让所有控件都继承表单字体,那么很容易,只要更改表单的字体属性,也会自动更新控件。明显的缺点是,用户在阅读文本时会遇到困难。尤其是当DPI达到每英寸150点甚至更高时,你的用户界面就会变成一张无法使用的邮票

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


直到显示器的分辨率达到打印机的分辨率,这个问题才会消失。我们离台式显示器的600 dpi还有很长的路要走。首先是电话。

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

创建应用程序清单文件(右键单击project/add/new item/application file)并取消对该部分的注释:

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

600 DPI屏幕正在成为现实。只要看看你的手机(好的,这里不是600而是480)。未来就在这里。在具有150%缩放的4K监视器的Windows 10上根本不起作用结合将AutoScaleMode设置为None解决了Medoe的问题在具有150%或200%缩放的Windows 10上不起作用,即使使用
AutoScaleMode=None
这为我在Windows 10上解决了这个问题(1809)使用
actualPixelSize*100f/CreateGraphics()进行150%的缩放。DpiY
适合我。这将补偿任何DPI缩放。结合手动缩放控件的字体(如本文另一个解决方案中所建议的),解决了我的问题。这对我很有效。这个表单对于我的笔记本电脑屏幕来说还是太大了,但至少现在它没有被缩小,也没有让一些控件无法访问。