Націліть свою програму на .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 та динамічного 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 змінюється на пристрої відображення, де форма відображається в даний час.
Також у вас є три допоміжні методи щодо обробки / масштабування DPI:
Control.LogicalToDeviceUnits , який перетворює значення з логічного в пікселі пристрою.
Control.ScaleBitmapLogicalToDevice , який масштабує зображення растрового зображення на логічний DPI для пристрою.
Control.DeviceDpi , який повертає DPI для поточного пристрою.
Якщо проблеми все ще виникають, ви можете відмовитися від удосконалення DPI за допомогою записів app.config .
Якщо у вас немає доступу до вихідного коду, ви можете перейти до властивостей програми в Windows Explorer, перейти до сумісності та вибрати System (Enhanced)
що активує масштабування GDI, щоб також покращити обробку DPI:
Для програм, що базуються на GDI, Windows тепер може DPI масштабувати їх на основі монітора. Це означає, що ці програми, як магічно, стануть відомими DPI за монітором.
Зробіть усі ці кроки, і ви повинні отримати кращий досвід DPI для додатків WinForms. Але пам’ятайте, що вам потрібно націлити на ваш додаток для .net 4.7 і вам потрібно принаймні Windows 10 Build 15063 (Creators Update). У наступному оновлення Windows 10 1709 ми можемо отримати більше вдосконалень.
NumericUpDown
також не масштабуєMargin
належним чином. Здається, маржа зменшується вдвічі. Якщо я її масштабую один раз, це виглядає добре.