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

  显示原文与译文双语对照的内容
137 5

我在 C# 中创建了一个简单的Winforms应用程序。 当我在具有高DPI设置的计算机上运行应用程序( 比如 。 150 %), 应用程序被放大。 到目前为止,不过不用呈现字体大小更高的字体,所有文本都会被缩放。 这当然会导致非常模糊的文本( 。在按钮 等等 之类的所有控件上) 。

Windows 不应该正确地处理文本? 例如我的应用程序栏标题呈现清晰的&清晰。

时间: 原作者:

110 2

一旦你过去了 100% ( 或者 125 %,带有"xp样式的j2ee扩展"复选框勾),默认情况下,Windows 会接受你的UI的缩放。 它由 Having 这样做,它将输出渲染到位图并将位图绘制到屏幕上。 位图的重新缩放使文本看起来是模糊的。 一个叫做"dpi虚拟化"的特性,它使旧程序在高分辨率显示器上可用。

你必须明确地告诉它,你可以通过将 <dpiAware> 元素添加到清单中来处理较高的DPI设置。 MSDN页在这里,但是它没有完成,因为它忽略了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>



例如,如果你使用ClickOnce部署,也可以在你的Main() 方法中对 SetProcessDPIAware() 进行重新设置:


 [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更新 1或者更高版本,这种常见的需求就会更容易。 已经添加的清单已经有了相关的指令,只需删除注释。

关键字搜索,以便我可以找到这里帖子: dpiAware

原作者:
111 0

应用程序可以在两种不同的。

第一个是将我们的应用程序声明为 non-DPI-aware ( 不声明任何内容将默认为) 。 在这种情况下,操作系统将按照预期的96 DPI render应用程序,然后对我们之前讨论过的位图缩放进行处理。 结果将是一个模糊的应用程序,但有一个正确的布局。

第二个选项是将应用程序声明为 dpi 。 在这种情况下,操作系统不会做任何缩放,并且会让你的应用程序按照屏幕的原始DPI进行渲染。 在per-monitor-DPI环境中,应用程序将呈现所有屏幕的最高值,然后将该位图缩放为每个监视器的大小。 缩放效果比放大效果更好,但你仍然可以注意到一些模糊。

如果要避免这种情况,必须将应用程序声明为 per-monitor-DPI-aware 。 然后,你必须检测到应用程序是否在不同的监视器上拖动,并根据当前的j2ee进行渲染。

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

请参见下面的链接链接 stackoverflow 。

原作者:
148 0

这些建议都对我有效,但在删除 Form.Font = new 之后发生了一些事情。 从 Form.Design.cs 开始,窗体开始正确缩放,如果字体在构造函数中定义,则它工作正常。 为什么它的他人可以解释,我只能谈论我所做的改变,花了我几分钟的时间。 希望有帮助。

原作者:
113 2

使用. NET 框架 4.7和 Windows 10创建者更新或者更新你必须为 Windows 窗体应用程序配置高分支支持:

与 Windows 10声明兼容。

为此,请将以下内容添加到 manifest file:


<compatibility xmlns="urn:schemas-microsoft.com:compatibility.v1">


 <application>


 <!-- Windows 10 compatibility -->


 <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>


 </application>


</compatibility>



app.config 文件中为每个监视器的DPI感知启用

Windows 表单引入了新的 System.Windows.Forms.ApplicationConfigurationSection 元素,以支持从框架 4.7开始添加的新特性和自定义。 若要利用支持高DPI的新特性,请将以下内容添加到应用程序配置文件中。


<System.Windows.Forms.ApplicationConfigurationSection>


 <add key="DpiAwareness" value="PerMonitorV2"/>


</System.Windows.Forms.ApplicationConfigurationSection>



重要

在. NET 框架的早期版本中,你使用了清单来添加高DPI支持。 不再推荐这种方法,因为它重写了 app.config 文件上定义的设置。

调用 static EnableVisualStyles方法。

这应该是应用程序入口点中的第一个方法调用。 例如:


static void Main()


{


 Application.EnableVisualStyles();


 Application.SetCompatibleTextRenderingDefault(false);


 Application.Run(new Form2()); 


}



这种方法的优点是支持动态lte场景,用户在 Windows 窗体应用程序启动后更改j2ee或者比例因子。

源:Windows 窗体中的高DPI支持。

原作者:
...