我有一个WinForm应用程序,其中包含许多图片。当我将应用程序放在DPI为120的Win7机器上时,它完全破坏了表单的外观。是否有一种方法可以禁用我的表单的缩放?
我知道这是不建议的做法,DPI应该由操作系统无缝处理。但是对于一个皮肤化的应用程序来说,图像不能很好地缩放。我没有创建所有DPI变体的图像的奢侈条件,所以请不要提出那个作为答案。
更改AutoScaleMode属性后会遇到更大的问题。增加DPI也会改变系统字体大小。这是必然的,因为字体大小用点表示,1/72英寸。当DPI增加时,要获得相同的点大小,字体需要变大,并保持在相同距离观看时文字的可读性。
由于控件不再被调整大小,因此按钮上的文本等不再适合。解决这个问题的一种方法是按比例更改控件上的字体大小。如果让所有控件继承窗体字体,则只需更改窗体的Font属性即可自动更新控件。明显的缺点是用户将难以阅读文本。特别是当DPI达到150个点每英寸及以上时,您的UI将变成无法使用的邮票。
是的,背景图像需要缩放以适应更大的控件或窗体。图像中的一个像素现在不再一对一地映射到监视器的一个像素。默认的Graphics.InterpolationMode值可以很好地过滤图像。但是,这取决于图像的类型,结果如何。照片几乎总是可以很好地缩放。精细的线条和文本则不行。选择正确类型的图像可以有效避免创建单独的图像。
这个问题不会消失,直到显示器的分辨率达到打印机的分辨率。我们离桌面显示器的600dpi还有很长的路要走。手机将是第一批实现的设备。
<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-
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();
}
}
AutoScaleMode = None
,也无法在 Windows 10 上的150%或200%下工作。 - FranckactualPixelSize * 100f / CreateGraphics().DpiY
成功了。这应该可以补偿任何 DPI 缩放。 - Pieter12345actualPixelSize
是您选择组件的像素大小。您实际上是撤销当前的 DPI 缩放,将其恢复到 100%。 - Pieter12345AutoScaleMode
属性设置为None
。