如何配置应用程序以在具有高DPI设置(例如150%)的计算机上正确运行?

我在C#中创建了一个简单的Winforms应用程序。 当我在具有高DPI设置(例如150%)的计算机上运行应用程序时,应用程序会按比例放大。 到现在为止还挺好! 但是,不是使用更高的字体大小渲染字体,所有文本也只是按比例放大。 这当然导致非常模糊的文本(在按钮等所有控件上)。

Windows不应该正确地渲染文本吗? 例如,我的应用程序的标题栏呈现清晰明了。

一旦超过100%(或者通过勾选“XP风格的DPI缩放”复选框获得125%),Windows默认会接管UI的缩放。 它通过让您的应用将其输出呈现为位图并将该位图绘制到屏幕来实现。 该位图的重新缩放使得文本不可避免地看起来模糊。 这是一种名为“DPI虚拟化”的function,它可以使旧程序在高分辨率显示器上使用。

您必须通过向清单添加元素,明确告知它可以处理更高的DPI设置。 MSDN页面在这里,但它没有完成,因为它省略了UAC设置。 Project + Add New Item,选择“Application Manifest File”。 编辑清单文本或复制/粘贴此文本:

             true    

您还可以在Main()方法中调用SetProcessDPIAware(),例如,如果使用ClickOnce进行部署,则必需:

  [STAThread] static void Main() { if (Environment.OSVersion.Version.Major >= 6) SetProcessDPIAware(); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); // Edit as needed } [System.Runtime.InteropServices.DllImport("user32.dll")] private static extern bool SetProcessDPIAware(); 

更新,如果您使用VS2015 Update 1或更高版本,这种常见需求最终会更容易一些。 添加的清单已经有相关指令,只需删除注释即可。


搜索关键字所以我可以找到这篇文章:dpiAware

应用程序可以以两种不同的模式开发。

第一个是声明我们的应用程序是非DPI感知的(不会声明任何默认的东西)。 在这种情况下,操作系统将在预期的96 DPI下呈现我们的应用程序,然后将对我们之前讨论过的位图缩放进行处理。 结果将是一个模糊的应用程序,但具有正确的布局。

第二种选择是将应用程序声明为DPI感知。 在这种情况下,操作系统不会进行任何缩放,并会让您的应用程序根据屏幕的原始DPI进行渲染。 如果是每个监视器DPI环境,您的应用程序将以所有屏幕的最高DPI进行渲染,然后该位图将缩小到适合每个监视器的大小。 降尺度会带来比升级更好的观看体验,但您可能仍会注意到一些模糊性。

如果要避免这种情况,则必须将应用程序声明为per-monitor-DPI-aware。 然后,您必须检测何时将应用程序拖过不同的监视器并根据当前DPI的DPI进行渲染。

声明DPI感知是在清单文件中完成的。

请参阅以下链接stackoverflow

这些建议都不适合我,但是,在我从Form.Font = new删除Form.Font = new …之后发生了一些事情,表单开始正确地重新缩放,如果在构造函数中定义了Font,它就有效或者根本没有。 为什么? 其他人也许可以解释一下,我只能谈谈我所做的改变,并花了几分钟才发现这是我正在研究的forms的根本原因。 希望能帮助到你。

使用.NET Framework 4.7和Windows 10 Creators更新或更新版本,您必须执行以下操作才能为Windows窗体应用程序配置高DPI支持:

声明与Windows 10的兼容性。

为此,请将以下内容添加到manifest文件中:

       

app.config文件中启用每个监视器的DPI感知。

Windows Forms引入了一个新的System.Windows.Forms.ApplicationConfigurationSection元素,以支持从.NET Framework 4.7开始添加的新function和自定义。 要利用支持高DPI的新function,请将以下内容添加到应用程序配置文件中。

    

重要

在以前版本的.NET Framework中,您使用清单来添加高DPI支持。 不再推荐使用此方法,因为它会覆盖app.config文件中定义的设置。

调用静态EnableVisualStyles方法。

这应该是应用程序入口点中的第一个方法调用。 例如:

 static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form2()); } 

这样做的好处是支持动态DPI场景,其中用户在启动Windows窗体应用程序后更改DPI或比例因子。

来源: Windows窗体中的高DPI支持