Windows 窗体中的高 DPI 支持

非专业开发Five 2018-06-12 04:19:40
加精
‎Windows 窗体中的高 DPI 支持
2017‎年‎05‎月‎16‎日
来源MSDN

从.NET Framework 4.7 开始,Windows 窗体包括增强功能的常见高 DPI 和动态 DPI 方案。 这些方法包括:
缩放和多个 Windows 窗体的布局中的改进控件,如MonthCalendar控件和CheckedListBox控件。
缩放的单个传递。 在.NET Framework 4.6 和早期版本中,通过多个通过,这导致某些控件可按比例超过时需要执行缩放。
动态 Windows 窗体应用程序已启动后用户更改的 DPI 或缩放系数的 DPI 方案的支持。
在从.NET Framework 4.7 的.NET framework 的版本,增强高 DPI 支持是一项可以选择使用的功能。 你必须配置应用程序以充分利用它。
配置 Windows 窗体应用程序以高 DPI 支持
支持高 DPI 感知的新 Windows 窗体功能是仅在面向.NET Framework 4.7 和从 Windows 10 创建者更新开始的 Windows 操作系统上运行的应用程序中可用。
此外,若要在 Windows 窗体应用程序中配置高 DPI 支持,你必须执行以下操作:
声明与 Windows 10 的兼容性。
为此,请将以下添加到你的清单文件:
<compatibility xmlns="urn:schemas-microsoft.com:compatibility.v1">
<application>
<!-- Windows 10 compatibility -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>


Windows 窗体中的高 DPI 支持
启用中的每个监视器 DPI 感知app.config文件。
Windows 窗体引入了新 <System.Windows.Forms.ApplicationConfigurationSection> 元素以支持新功能和自定义项添加从.NET Framework 4.7 开始。 若要利用支持高 DPI 的新功能,请将以下添加到应用程序配置文件。

<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>

重要
在以前版本的.NET Framework 中,你可以使用清单来添加高 DPI 支持。 不再建议使用此方法,因为它会替代在 app.config 文件中定义的设置。
调用静态EnableVisualStyles方法。
这应该是你的应用程序入口点中的第一个方法调用。 例如:

static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form2());
}

选择退出各个高 DPI 功能
设置DpiAwareness值赋给PerMonitorV2使支持的.NET Framework 4.7 开头的.NET Framework 版本的所有高 DPI 感知功能。 通常情况下,这足以满足大多数 Windows 窗体应用程序。 但是,你可能想要选择取消一个或多个各项功能。 执行此操作的最重要原因是现有的应用程序代码已经处理该功能。 例如,如果你的应用程序处理自动缩放,你可能想要禁用自动调整大小功能,如下所示:

<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
<add key="EnableWindowsFormsHighDpiAutoResizing" value="false" />
</System.Windows.Forms.ApplicationConfigurationSection>

有关各个键及其值的列表,请参阅Windows 窗体添加配置元素。
新的 DPI 更改事件
从.NET Framework 4.7 开始,三个新事件允许你以编程方式处理动态 DPI 更改:
DpiChangedAfterParent这在父控件的 DPI 更改事件后已以编程方式更改控件的 DPI 设置或窗体发生时激发。
DpiChangedBeforeParent其中在控件的 DPI 设置已在其父控件的 DPI 更改事件之前以编程方式更改,或窗体发生时被激发。
DpiChanged其中 DPI 设置更改,则当前显示的格式显示设备上时激发。
新的帮助器方法和属性
.NET Framework 4.7 还添加了大量新的帮助器方法和属性,提供有关 DPI 缩放信息,并允许你执行 DPI 缩放比例。 这些方法包括:
LogicalToDeviceUnits它将值从逻辑转换为设备像素为单位。
ScaleBitmapLogicalToDevice其缩放到设备的逻辑 DPI 位图图像。
DeviceDpi它返回有关当前设备 DPI。
版本控制注意事项
除了在.NET Framework 4.7 和 Windows 10 创建者更新上运行,你的应用程序可能还在环境中运行它不与高 DPI 改进兼容。 在这种情况下,你将需要开发的应用程序的回退。 你可以这样做来执行自定义绘制来处理缩放。
若要执行此操作,还需要确定你的应用程序正在其运行的操作系统。 你可以实现与代码如下所示:


// Create a reference to the OS version of Windows 10 Creators Update.
Version OsMinVersion = new Version(10, 0, 15063, 0);

// Access the platform/version of the current OS.
Console.WriteLine(Environment.OSVersion.Platform.ToString());
Console.WriteLine(Environment.OSVersion.VersionString);

// Compare the current version to the minimum required version.
Console.WriteLine(Environment.OSVersion.Version.CompareTo(OsMinVersion));
请注意,是否它未被列出为应用程序清单中受支持的操作系统,你的应用程序不会成功检测 Windows 10。
你还可以检查生成应用程序所针对的.NET framework 版本:

Console.WriteLine(AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName);




想不到微软还在更新窗体应用
...全文
3682 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 11 楼 daixf_csdn 的回复:
不了解,这东西干什么用?百度了下也不知所以。一般应用于什么场景?
高分辨率下的窗体统一样式等等
TOFEMALE 2018-08-02
  • 打赏
  • 举报
回复
微软没有放弃Winform,但也没有把Winfrom做到与MFC一样的功能强大
圣殿骑士18 2018-08-01
  • 打赏
  • 举报
回复
不了解,这东西干什么用?百度了下也不知所以。一般应用于什么场景?
萱爸比 2018-07-31
  • 打赏
  • 举报
回复
好奇,我学习了
qq_42504374 2018-06-21
  • 打赏
  • 举报
回复
需要有经验的才能看出来.
SoulRed 2018-06-14
  • 打赏
  • 举报
回复
winform非常好用的
jjlmsy 2018-06-13
  • 打赏
  • 举报
回复
学习了哈。哦哦哦哦哦
exception92 2018-06-13
  • 打赏
  • 举报
回复
必须顶一波
正怒月神 2018-06-13
  • 打赏
  • 举报
回复
想不到微软还在更新窗体应用
  • 打赏
  • 举报
回复
搬运技术没人理我啊,@hanjun0612 求个精华扩散一下新技术。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧