我用 C# 创建了一个简单的 Winforms 应用程序。当我在具有高 DPI 设置(例如 150%)的计算机上运行应用程序时,应用程序会放大。到目前为止,一切都很好!
但所有文本也只是按比例放大,而不是使用更大的字体大小渲染字体。这当然会导致文本非常模糊(在所有控件上,如按钮等)。
Windows 不应该负责正确渲染文本吗?例如,我的应用程序的标题栏呈现清晰明了。
一旦超过 100%(或勾选“XP 样式 DPI 缩放”复选框后的 125%),Windows 默认情况下会接管 UI 的缩放。它通过让您的应用程序将其输出呈现为位图并将该位图绘制到屏幕上来实现这一点。该位图的重新缩放使文本不可避免地看起来模糊。一项称为“DPI 虚拟化”的功能,可以让旧程序在高分辨率显示器上可用。
您必须明确地让它知道您可以通过添加以下命令来处理更高的 DPI 设置<dpiAware>
元素添加到您的清单中。 MSDN 页面is here但它并不完整,因为它省略了 UAC 设置。项目+添加新项目,选择“应用程序清单文件”。编辑清单文本或复制/粘贴以下内容:
<?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 或更高版本,这种常见需求最终会更容易一些。添加的清单已经有相关指令,只需删除注释即可。
搜索关键字,这样我就可以找到这篇文章:dpiAware
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)