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

标签 c# winforms fonts dpi dpi-aware

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

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

最佳答案

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

你必须明确地让它知道你可以通过添加 <dpiAware> 来处理更高的 DPI 设置。 list 中的元素。 MSDN 页面 is here但它并不完整,因为它省略了 UAC 设置。项目 + 添加新项目,选择“应用程序 list 文件”。编辑 list 文本或复制/粘贴:

<?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 或更高版本,这种常见需求最终会更容易一些。添加的manifest已经有相关指令,去掉注释即可。


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

关于c# - 如何配置应用程序以在具有高 DPI 设置(例如 150%)的机器上正确运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13228185/

相关文章:

c# - 在 Postman 中使用 HTTP PATCH 动词更新数据库表

c# - 如何重命名 TreeView 中的节点?

javascript - 需要替换特定单词的字体

c# - 在 C# 中解压缩存档

c# - 如果文件列表中缺少一个文件,如何评估为 false

c# - 抽象类中的无主体抽象方法有什么问题?

c# - 这是 BindingList 应该工作的方式吗?

c# - ListView 项目大小

c++ - 如何以编程方式创建 TTF 或 OTF 字体 [C/C++]

css - 如何修复不同浏览器中的字体渲染?