将您的应用程序定位到 .Net Framework 4.7 并在 Windows 10 v1703(Creators Update Build 15063)下运行它。与.Net 4.7 under Windows 10 (v1703), MS made a lot of DPI improvements。
从 .NET Framework 4.7 开始,Windows 窗体包括
针对常见的高 DPI 和动态 DPI 场景的增强功能。这些
包括:
改进了许多 Windows 窗体控件的缩放和布局,例如 MonthCalendar 控件和
CheckedListBox 控件。
单程缩放。在 .NET Framework 4.6 及更早的版本中,缩放是通过多次传递执行的,这会导致
一些控件的扩展超出了必要的范围。
支持动态 DPI 方案,在这种方案中,用户在 Windows 窗体应用程序运行后更改 DPI 或比例因子
启动。
要支持它,请将应用程序清单添加到您的应用程序并表明您的应用程序支持 Windows 10:
<compatibility xmlns="urn:schemas-microsoft.comn:compatibility.v1">
<application>
<!-- Windows 10 compatibility -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
接下来,添加 app.config 并声明应用程序 Per Monitor Aware。 现在是在 app.config 中完成,而不是像以前那样在清单中完成!
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>
此PerMonitorV2 是自 Windows 10 创意者更新以来的新内容:
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
也称为 Per Monitor v2。比原来的进步
每显示器 DPI 感知模式,使应用程序能够访问
基于每个顶级窗口的新 DPI 相关缩放行为。
子窗口 DPI 更改通知 - 在 Per Monitor v2 上下文中,通知整个窗口树任何 DPI 更改
发生。
非客户区缩放 - 所有窗口将自动以 DPI 敏感方式绘制其非客户区。来电
EnableNonClientDpiScaling 是不必要的。
SWin32 菜单的缩放 - 在每监视器 v2 上下文中创建的所有 NTUSER 菜单都将以每监视器的方式缩放。
对话框缩放 - 在 Per Monitor v2 上下文中创建的 Win32 对话框将自动响应 DPI 更改。
改进了 comctl32 控件的缩放 - 各种 comctl32 控件改进了 Per Monitor v2 中的 DPI 缩放行为
上下文。
改进的主题行为 - 在 Per Monitor v2 窗口的上下文中打开的 UxTheme 句柄将根据 DPI 运行
与该窗口相关联。
现在您可以订阅 3 个新事件以获得有关 DPI 更改的通知:
Control.DpiChangedAfterParent,在 DPI 之后以编程方式更改控件的 DPI 设置时触发
已发生其父控件或表单的更改事件。
Control.DpiChangedBeforeParent,当控件的 DPI 设置在 DPI 更改之前以编程方式更改时触发
其父控件或窗体的事件已发生。
Form.DpiChanged,当 DPI 设置在当前显示表单的显示设备上发生更改时触发。
您还有 3 个关于 DPI 处理/缩放的辅助方法:
Control.LogicalToDeviceUnits,将值从逻辑像素转换为设备像素。
Control.ScaleBitmapLogicalToDevice,将位图图像缩放为设备的逻辑 DPI。
Control.DeviceDpi,返回当前设备的 DPI。
如果您仍然发现问题,您可以opt-out of the DPI improvements via app.config entries。
如果您无权访问源代码,您可以在 Windows 资源管理器中转到应用程序属性,转到兼容性并选择 System (Enhanced)
激活 GDI 缩放以改善 DPI 处理:
对于基于 GDI 的应用程序,Windows 现在可以在 DPI 上进行缩放
每个监视器的基础。这意味着这些应用程序将
神奇地,成为每个显示器的 DPI 感知。
执行所有这些步骤,您应该会为 WinForms 应用程序获得更好的 DPI 体验。但请记住,您需要将您的应用程序定位为 .net 4.7,并且至少需要 Windows 10 Build 15063(Creators Update)。在下一个 Windows 10 更新 1709 中,我们可能会得到更多改进。