我已经在C#中创建了一个简单的Winforms应用程序。当我在具有较高DPI设置(例如150%)的计算机上运行该应用程序时,该应用程序会按比例放大。到目前为止,一切都很好!但是,除了渲染具有更大字体大小的字体外,所有文本也只是按比例放大。当然,这会导致文本非常模糊(在按钮等所有控件上)。
Windows是否不应该正确显示文本?例如,我的应用程序的标题栏变得清晰明了。
一旦超过100%(或选中“ XP样式DPI缩放”复选框为125%),Windows默认将接管UI的缩放。通过让您的应用将其输出呈现为位图并将该位图绘制到屏幕上来实现。该位图的重新缩放使文本不可避免地看起来模糊。一种称为“ DPI虚拟化”的功能,可以使旧程序在高分辨率监视器上可用。
您必须明确告知它可以通过将<dpiAware>元素添加到清单中来处理更高的DPI设置。MSDN页面在这里,但是由于它省略了UAC设置,因此它并不完整。项目+添加新项,选择“应用程序清单文件”。编辑清单文本或复制/粘贴以下内容:
<dpiAware>
<?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();
UPDATE,如果您使用VS2015 Update 1或更高版本,则此通用需求最终会更容易一些。添加的清单已具有相关指令,只需删除注释即可。
搜索的关键字,因此我可以找到该帖子:dpiAware