将您的.Net Framework 4.7应用程序定位为目标,并在Windows 10 v1703(Creators Update Build 15063)下运行它。使用Windows 10(v1703)下的.Net 4.7,MS进行了许多DPI改进。
从.NET Framework 4.7开始,Windows Forms包括针对常见的高DPI和动态DPI方案的增强功能。这些包括:
改进了许多Windows Forms控件的缩放和布局,例如MonthCalendar控件和CheckedListBox控件。
单遍缩放。在.NET Framework 4.6和更早版本中,缩放是通过多次传递来执行的,这导致某些控件的缩放超出了必要。
支持动态DPI方案,在这种情况下,用户在启动Windows Forms应用程序后更改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
并声明“每个监视器可识别”应用程序。现在,这是在app.config中完成的,而不是像以前一样在清单中完成的!
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>
自Windows 10 Creators更新以来,此PerMonitorV2是新的:
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
也称为Per Monitor v2。在原始的按显示器DPI感知模式上进行了改进,该模式使应用程序可以在每个顶级窗口的基础上访问与DPI相关的新缩放行为。
子窗口DPI更改通知 -在Per Monitor v2上下文中,会向整个窗口树通知发生的任何DPI更改。
非客户区域的缩放 -所有窗口将自动以DPI敏感方式绘制其非客户区域。不需要调用EnableNonClientDpiScaling。
小号caling Win32的菜单 -在每个监视器V2上下文创建的所有NTUSER菜单将在每个显示器的方式缩放。
对话框缩放 -在Per Monitor v2上下文中创建的Win32对话框将自动响应DPI更改。
改进了comctl32控件的缩放比例 -各种comctl32控件在Per Monitor v2上下文中具有改进的DPI缩放比例行为。
改进的主题行为 -在Per Monitor v2窗口的上下文中打开的UxTheme句柄将根据与该窗口关联的DPI进行操作。
现在,您可以订阅3个新事件以获取有关DPI更改的通知:
Control.DpiChangedAfterParent,当控件的DPI设置事件发生在其父控件或窗体的DPI更改事件发生后,以编程方式更改该控件的DPI设置时,将触发该事件。
Control.DpiChangedBeforeParent,当控件的DPI设置在其父控件或窗体的DPI更改事件发生之前以编程方式更改时被触发。
Form.DpiChanged,当DPI设置在当前显示表单的显示设备上更改时触发。
您还拥有3种有关DPI处理/扩展的帮助方法:
Control.LogicalToDeviceUnits,将值从逻辑像素转换为设备像素。
Control.ScaleBitmapLogicalToDevice,它将位图图像缩放为设备的逻辑DPI。
Control.DeviceDpi,它返回当前设备的DPI。
如果仍然发现问题,则可以通过app.config条目选择退出DPI改进。
如果您无权访问源代码,则可以转到Windows资源管理器中的应用程序属性,转到兼容性并选择 System (Enhanced)
这会激活GDI缩放比例,从而改善DPI处理:
对于基于GDI的应用程序,Windows现在可以DPI基于每个监视器进行缩放。这意味着,这些应用程序将神奇地成为每个监视器的DPI感知。
完成所有这些步骤,您应该为WinForms应用程序获得更好的DPI体验。但是请记住,您需要将应用程序定位为.net 4.7,并且至少需要Windows 10 Build 15063(创建者更新)。在下一个Windows 10 Update 1709中,我们可能会得到更多改进。
NumericUpDown
也无法Margin
正确缩放。看来保证金被扩大了两倍。如果我将其缩小一次,则看起来不错。