Настройте свое приложение для .Net Framework 4.7 и запустите его под Windows 10 v1703 (Creators Update Build 15063). В .Net 4.7 под Windows 10 (v1703) MS сделала много улучшений DPI .
Начиная с .NET Framework 4.7, Windows Forms включает улучшения для общих сценариев с высоким и динамическим DPI. Это включает:
Улучшения в масштабировании и компоновке ряда элементов управления Windows Forms, таких как элемент управления MonthCalendar и элемент управления CheckedListBox.
Однопроходное масштабирование. В .NET Framework 4.6 и более ранних версиях масштабирование выполнялось за несколько проходов, в результате чего некоторые элементы управления масштабировались больше, чем это было необходимо.
Поддержка динамических сценариев DPI, в которых пользователь изменяет DPI или масштабный коэффициент после запуска приложения Windows Forms.
Для его поддержки добавьте манифест приложения в свое приложение и сообщите, что ваше приложение поддерживает 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 Creators:
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
Также известен как Per Monitor v2. Улучшение по сравнению с оригинальным режимом осведомленности о DPI для каждого монитора, который позволяет приложениям получать доступ к новым режимам масштабирования, связанным с DPI, для каждого окна верхнего уровня.
Уведомления об изменении DPI дочернего окна - в контекстах Per Monitor v2 все дерево окон уведомляется о любых изменениях DPI, которые происходят.
Масштабирование не-клиентской области - все окна будут автоматически иметь свою не-клиентскую область, нарисованную с учетом DPI. Вызовы EnableNonClientDpiScaling не нужны.
S caling из меню Win32 - Все NTUSER меню , созданное в Per Monitor v2 контексты будет масштабирование в моде на-монитора.
Масштабирование диалогов - диалоговые окна Win32, созданные в контекстах Per Monitor v2, будут автоматически реагировать на изменения DPI.
Улучшенное масштабирование элементов управления comctl32. Различные элементы управления comctl32 улучшили масштабирование DPI в контексте Per Monitor v2.
Улучшенное поведение тем - дескрипторы UxTheme, открытые в контексте окна Per Monitor v2, будут работать с точки зрения DPI, связанного с этим окном.
Теперь вы можете подписаться на 3 новых события, чтобы получать уведомления об изменениях DPI:
Control.DpiChangedAfterParent , который запускается Происходит, когда параметр DPI для элемента управления программно изменяется после того, как произошло событие изменения DPI для его родительского элемента управления или формы.
Control.DpiChangedBeforeParent , который запускается, когда параметр DPI для элемента управления программно изменяется до того, как произошло событие изменения DPI для его родительского элемента управления или формы.
Form.DpiChanged , который запускается при изменении настройки DPI на устройстве отображения, где в данный момент отображается форма.
У вас также есть 3 вспомогательных метода для обработки / масштабирования DPI:
Control.LogicalToDeviceUnits , который преобразует значение из логических пикселей в пиксели устройства.
Control.ScaleBitmapLogicalToDevice , который масштабирует растровое изображение до логического DPI для устройства.
Control.DeviceDpi , который возвращает DPI для текущего устройства.
Если вы по-прежнему видите проблемы, вы можете отказаться от улучшений DPI с помощью записей app.config .
Если у вас нет доступа к исходному коду, вы можете перейти к свойствам приложения в проводнике Windows, перейти к совместимости и выбрать System (Enhanced)
который активирует масштабирование GDI, чтобы также улучшить обработку DPI:
Для приложений на основе GDI Windows теперь может масштабировать их по DPI для каждого монитора. Это означает, что эти приложения, как ни странно, получат поддержку DPI для каждого монитора.
Выполните все эти шаги, и вы должны получить лучший опыт DPI для приложений WinForms. Но помните, что вам нужно ориентировать свое приложение на .net 4.7 и по крайней мере Windows 10 Build 15063 (Creators Update). В следующем обновлении Windows 10 1709 мы можем получить больше улучшений.
NumericUpDown
тоже неMargin
правильно масштабирует . Кажется, маржа масштабируется дважды. Если я уменьшу его один раз, это выглядит хорошо.