如何configuration应用程序在DPI设置较高的机器上正确运行(例如150%)?

我已经在C#中创build了一个简单的Winforms应用程序。 当我在高DPI设置(例如150%)的机器上运行应用程序时,应用程序会被放大。 到现在为止还挺好! 但是,不是使用更高的字体来渲染字体,而是将所有的文字都放大。 这当然会导致非常模糊的文本(像button等所有控件)。

窗户不应该照顾正确地呈现文本? 例如,我的应用程序的标题栏呈现清晰。

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

您必须明确告诉它,您可以通过将<dpiAware>元素添加到清单来处理更高的DPI设置。 MSDN页面在这里,但它是不完整的,因为它是省略UAC设置。 项目+添加新项目,select“应用程序清单文件”。 编辑清单文本或复制/粘贴:

 <?xml version="1.0" encoding="utf-8"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" > <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> <requestedExecutionLevel level="asInvoker" uiAccess="false" /> </requestedPrivileges> </security> </trustInfo> <asmv3:application> <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> <dpiAware>true</dpiAware> </asmv3:windowsSettings> </asmv3:application> </assembly> 

您也可以在您的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或更高版本,这个常见的需求会变得更容易一些。 添加的清单已经有相关的指示,只是删除评论。

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

第一个是宣布我们的应用程序是非DPI的意识(没有声明任何将默认这个)。 在这种情况下,操作系统将使我们的应用程序达到预期的96 DPI ,然后执行我们之前讨论的位图缩放。 结果将是一个模糊的应用程序,但有一个正确的布局。

第二种select是将应用程序声明为DPI。 在这种情况下,操作系统不会做任何缩放,并会让您的应用程序根据屏幕的原始DPI进行渲染。 如果是每个显示器的DPI环境,则应用程序将以所有屏幕的最高DPI进行渲染,然后将该位图缩小到每个显示器的适当大小。 降尺寸会导致更好的视觉体验,但是您可能仍会注意到一些模糊性。

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

声明DPI意识是在清单文件中完成的。

请参阅以下链接计算器