我可以自动缩放 DPI 的表单而不会变得模糊吗?



我正在用C#开发一个WinForms应用程序。它使用面板绘制曼德布洛特分形的图像。在程序手册中,每当我在某处发布有关它的信息时,我都建议人们将其缩放设置设置为 100%,否则图像看起来不太好。这是因为在其他设置中,图像在绘制后会放大,并且变得模糊。所有其他控件也都模糊不清。

例如:我的面板是 500x500。我的 Windows 中的缩放比例设置为 125%。当我运行该程序时,面板内部仍然是 500x500,但它显示为 625x625,模糊不清。
相反,当程序运行时,我希望面板在内部调整为 625x625,并显示为 625x625。

我找到了以下解决方案:我发现了SetProcessDPIAware(((从这里(。使窗口不缩放的设置(看起来好像是 100% 缩放设置(,但文本会缩放(并且不会变得模糊(。然后,我可以在程序开始时计算适当的乘数(dpi = DpiX/96(,并将其提供给一个包含命令的巨大方法

xentrylabel.Location = new Point((int)(xentrylabel.Location.X * dpi),(int)(xentrylabel.Location.Y * dpi));
xentry.Location = new Point((int)(xentry.Location.X * dpi), (int)(xentry.Location.Y * dpi));
xentry.Size = new Size((int)(xentry.Width * dpi), (int)(xentry.Height * dpi));

一个用于可能需要更新的每个控件属性。在写这个问题时,我有了这个想法并开始了。但是,我意识到这将需要非常多的代码行,所以我想知道是否有内置的方法可以做到这一点。这似乎是许多人想要选择的选项,而不是他们的应用程序在高 dpi 屏幕上变得模糊或难以阅读。

这种手动校正位置和大小的方法,还是有一种内置方法可以通过实际缩放表单中的所有内容来缩放其他 DPI 设置的表单,而不是缩放最终结果?

编辑:从一些评论来看,似乎SetProcessDPIAware((本身应该扩展所有内容。但根据我的经验,事实并非如此。以下是一些屏幕截图: 100%比例设置的应用: https://i.stack.imgur.com/pws9B.png

在没有 SetProcessDPIAware(( 的情况下在 125% 比例设置上的应用程序: https://i.stack.imgur.com/cE4Wx.png

使用 SetProcessDPIAware(( 在 125% 比例设置上的应用程序: https://i.stack.imgur.com/oVA8W.png

我们通过创建一个 WPF 用户控件来解决在 Chem4Word 中缩放大于 100% 的高 DPI 屏幕呈现控件的问题,该控件承载在 ElementHost 控件中,该控件设置为填充表单。

赢形 +- 元素主机 +- WPFUserControl

查看您上传的图像,这正是使用 WPF 用户控件解决的问题。

最新更新