c# - 如何将应用配置为在DPI设置较高(例如150%)的计算机上正确运行?

原文 标签 c# winforms fonts dpi dpi-aware

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

Windows是否应该照顾正确呈现文本?例如,我的应用程序的标题栏变得清晰明了。

最佳答案

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

您必须明确地告诉它,可以通过将<dpiAware>元素添加到 list 中来处理更高的DPI设置。 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();

UPDATE,如果您使用VS2015 Update 1或更高版本,则此通用需求最终会更容易一些。添加的 list 已具有相关指令,只需删除注释即可。

搜索的关键字,因此我可以找到该帖子:dpiAware

相关文章:

c# - WP7列表框项目在滚动时不同步

c# - CurrentUICulture和新创建的CultureInfo实例

c# - 在没有Graph API的情况下,如何在C#Azure B2C身份验证中获取当前登录用户的用户名和电子邮件地址?

c# - 从AutoCompleteStringCollection C#中删除重复项

python - 在Python中测试一个字形是否以相同字体反映了另一个字形

c# - 如何保护asp.net应用程序仅在指定的域上运行?

c# - 如何在RichTextBox中获得单击的单词数(索引)

.net - 如何用默认文本填充空白文本框?

fonts - 将StandardForm I / O的默认字体从“New Courier”更改为“Consolas”?

javascript - Google Doc如何获取PC / Mac上安装的字体列表