Windows, починаючи з Vista, надає два механізми для адаптації додатків до моніторів з високою щільністю пікселів (точок на дюйм, DPI): збільшені системні шрифти і повномасштабне збільшення вікон. На жаль, спроба змусити деякі ваші програми працювати в якому-небудь з режимів може виявитися безуспішною, завдяки поєднанню недбайливих розробників і поганих рішень прийнятих Microsoft.
- Від перекладача
- Методи масштабування
- Масштабування в стилі Windows XP
- Масштабування у стилі Windows Vista або DPI-віртуалізація
- Як змінити параметри DPI
- Зміни у Windows 8.1, або чому все розмито?
- Допоможіть, мої системні шрифти не правильного розміру!
- Типи програм, як вони масштабуються (або не масштабуються)
- DPI-Aware прапор не встановлено
- DPI-Aware прапор встановлено
- Не DPI-Aware
- DPI-Aware
- Приклад програми, працює тільки при DPI рівному 96
- Приклад такої програми і роздільна здатність 150% (144 DPI)
- Вибір методу масштабування для ваших програм
- Відмова від DPI віртуалізації для окремих програм
Ця сторінка призначена для того, щоб допомогти користувачам зрозуміти і виправити, можливі проблеми при налаштуванні високих значень DPI. Будь ласка, зверніть увагу, що ми розглянемо тільки традиційні програми Windows, не Windows Store («Metro», «Modern UI») програми. Останні використовують новий API WinRT, який забезпечує власний механізм масштабування.
- Від перекладача
- Методи масштабування
- Масштабування в стилі Windows XP
- Масштабування у стилі Windows Vista або DPI-віртуалізація
- Як змінити параметри DPI
- Зміни у Windows 8.1, або чому все розмито?
- Допоможіть, мої системні шрифти не правильного розміру!
- Типи програм, як вони масштабуються (або не масштабуються)
- Вибір методу масштабування для ваших програм
- Відмова від DPI віртуалізації для окремих програм
- Подальше читання для розробників (без перекладу)
Від перекладача
У цій статті застосовуються такі скорочення які я визнав перекладати не доцільно: Графічний інтерфейс Користувача (GUI), Точок На Дюйм (DPI), DPI-Aware програми - програми, які вміють при різних значеннях DPI правильно, без спотворень відображати свій GUI, Графічний Інтерфейс Пристрою (GDI). Мої коментарі (виділені курсивом).
Методи масштабування
Традиційно рідні програми Windows для робочого столу використовують два механізми виведення на екран:
- Функції Графічного інтерфейсу Пристрої (GDI) для доступу до дисплея. Зазвичай, GDI-координати вимірюються безпосередньо в пікселях екрана незалежно від розміру монітора та щільності пікселів.
- І вивід тексту використовуючи системні шрифти Windows. Це не є обов'язковим, але більшість програм використовує системні шрифти для більшої частини їх графічного інтерфейсу користувача (GUI).
Спочатку більшість моніторів було з щільністю пікселів близько 96 точок на дюйм. Так що GUI, що використовує цю особливість, виглядав приблизно однаково на будь-якій системі. Але, як тільки щільність пікселів збільшується, елементи GUI таких програм зменшуються в перерахунку на сантиметри або дюйми (реальні, які вимірюються за допомогою лінійки додатної до монітора). Дрібний текст та інші дрібні деталі стає все важче розгледіти.
Щоб виправити ситуацію, Microsoft вирішила, що непогано вбудувати якийсь метод масштабування в Windows. Один з двох методів описаних нижче (Windows XP або Vista) застосовує, коли користувач встановлює DPI зі значенням вище ніж стандартні 96 точок на дюйм. Обидва методи намагаються збільшити розмір елементів зображення.
Масштабування в стилі Windows XP
Перший з цих методів, як можна здогадатися, з'явився в Windows XP. Цей метод, насправді, не є методом масштабування програм з графічним інтерфейсом як такий. Масштабуються лише системні шрифти та деякі елементи інтерфейсу користувача (я б назвав його «метод не масштабування» в стилі Windows XP).
Всі інші елементи програм, як і раніше, відображаються в масштабі 1:1. Єдиною різницею в їхньому зовнішньому вигляді є те, що будь-який текст і деякі елементи GUI, що виводяться за допомогою системних функцій, раптом ставати більше. Наприклад, текст на кнопках. Це викликає очевидні проблеми які ми обговоримо трохи пізніше.
Масштабування у стилі Windows Vista або DPI-віртуалізація
Windows Vista представила другий варіант з дивною назвою, «масштабування дисплея», без будь-яких уточнень, мабуть, щоб остаточно заплутати користувачів. Ми будемо використовувати більш описове ім'я - метод DPI віртуалізації. Коли цей метод увімкнено, Windows продовжує масштабувати у стилі Windows XP. Крім того, розміри всіх системних шрифтів та деяких елементів інтерфейсу системи збільшуються.
Різниця в тому, що програми, які можуть правильно використовувати високі значення DPI, повинні повідомити про це Windows. Такі програми повинні встановити новий DPI-Aware прапор, або шляхом виклику функції Win32 API «SetProcessDPIAware», або, переважно, шляхом вбудовування маніфесту з прапором dpiAware. А ось якщо у програми відсутній DPI-Aware прапор, Windows веде себе по іншому, спочатку вона формує внутрішнє відображення в масштабі 96 точок на дюйм (емулюючи для програми DPI рівний 96), а потім, масштабує отримане зображення у відповідність з поточними налаштуваннями DPI перед виведенням на екран.
Це було б фантастичним метод масштабування якби всі наші монітори мали щільність пікселів останніх апаратів iPhones (326 точок на дюйм). На жаль це не так. Вікна програм масштабовані таким чином виглядають надто розмито, при популярній роздільній здатності 120 точок на дюйм (@ homm це не роздільна здатність, до речі). Тому Microsoft за замовчуванням вимикає DPI віртуалізацію, якщо ви виберете щільність пікселів менше або рівну 120 DPI.
Як змінити параметри DPI
У Windows 7/8 відкрийте панель керування, а потім виберіть «Вигляд та персоналізація», потім виберіть «Екран», а потім виберіть «Встановити розмір шрифту (DPI)» (Windows 7) або «Параметри користувача розміру» (Windows 8). Ви побачите наступне діалогове вікно (Windows 7, Windows 8 майже ідентично):
У списку розкриття можна вибрати потрібне налаштування DPI у відсотковому співвідношенні, де 100% відповідає 96 DPI, 125% - як на скріншоті, відповідає 120 точкам на дюйм (можна більш точно записати значення вручну). До Windows 8 фактичне значення DPI («пікселів на дюйм») відображалося поряд із розміром системного шрифту. Windows 8, з незрозумілих причин, не показує значення DPI, так що ви повинні розрахувати його самостійно.
Також ви можете додати лінійку (у якій є шкала в дюймах) до екрану, і намагатися поєднати маркування на ній з маркуванням на екрані, змінюючи значення в списку, що розкривається. Прапорець, обведений червоним внизу, визначає, чи слід використовувати тільки масштабування в стилі Windows XP, або також новий спосіб DPI віртуалізації. Якщо позначено цей пункт, як на скріншоті, DPI буде увімкнено віртуалізацію.
Декламація. Це діалогове вікно є прикладом інтерфейсу, який не є дружнім до користувача. На перший погляд, це прапорець для відключення масштабування в стилі Windows XP. Але цей метод масштабування (який тільки збільшує системні шрифти та інші елементи користувацького інтерфейсу системи - масштабування Windows XP) завжди включається при виборі високого значення DPI. Насправді цей прапорець керує, чи буде цей метод єдиним (Використовувати тільки масштаби в стилі Windows XP), або також буде застосовано метод «DPI віртуалізації» для програм, які не мають DPI-Aware прапора. Отже, цей прапорець не контролює метод масштабування вказаний у його назву, а контролює інший метод масштабування, ніде не згаданий - і дозволяє використовувати новий метод, коли прапорець знятий!
Помилка Windows 8. На додаток до цього, Windows 8 - це діалогове вікно з помилкою. Як правило, все працює як і в Windows 7, але стан прапорця не зберігається на значеннях DPI 150% і вище. Коли ви встановили цей параметр, віртуалізація DPI правильно вимикається. Тим не менш, сам прапорець залишається не позначеним, коли ви наступного разу відкриваєте це діалогове вікно.
Зміни у Windows 8.1, або чому все розмито?
У Windows 8.1 прапорець для масштабування Windows XP зник, і тепер «DPI віртуалізація» ніколи не використовується при значеннях DPI до 120 включно, але завжди використовується при більш високих значеннях для тих програм, у яких відсутній DPI-Aware прапор. Якщо деякі програми здаються вам нечіткими, необхідно вручну вимкнути для них DPI віртуалізацію.
Windows 8.1 дозволяє використовувати декілька моніторів з різним значенням DPI. Однак ця функція також змушує використовувати «DPI віртуалізацію» для традиційних програм, які переміщуються між моніторами з різними значеннями DPI. Щоб уникнути цього, ви можете вимкнути масштабування в параметрах DPI за допомогою нового параметра «Я хочу вибрати один масштаб для всіх дисплеїв».
Також Windows 8.1 додає спеціальний перемикач для налаштування 200% і новий API, щоб розробники могли вибірково відключати «DPI віртуалізацію».
Допоможіть, мої системні шрифти не правильного розміру!
Іноді, після зміни параметрів DPI, ви можете зауважити, що деякі системні шрифти стали занадто великими або занадто маленькими для нових установок. Ймовірною причиною є те, що ви використовуєте власну тему стільниці на основі ваших старих налаштувань DPI. Windows не масштабує шрифти теми користувача.
Якщо ви створили власну тему стільниці і хочете зберегти її, вам доведеться самостійно адаптувати шрифти до нових параметрів DPI. Однак, Windows має дратівливу звичку «послужливо» створювати користувальницькі теми без вашого відома, з будь-якої причини. Отже, якщо ви ніколи не створювали власну тему стільниці, просто вилучіть її і поверніться до стандартної теми.
У Windows 7/8 відкрийте Панель керування, виберіть «Вигляд та персоналізація», а потім виберіть «Персоналізація». Якщо ви бачите вибраний запис у рядку «Мої теми», це означає, що ОС Windows використовує тему користувача, системні шрифти якої Windows не буде масштабувати. Виберіть стандартну тему, наприклад, перший запис у розділі «Теми Aero» (Windows 7) або «Windows» «Теми за замовчуванням» (Windows 8) і видаліть небажані записи в розділі «Мої теми». Тепер, всі системні шрифти повинні відображатися правильно.
Типи програм, як вони масштабуються (або не масштабуються)
Тепер розгляньмо, які методи повинні використовуватися для існуючих Windows програм при високих значеннях DPI. Наступна таблиця узагальнююча, пізніше ми розглянемо різні випадки більш детально.
Програми, що взагалі не піклуються про DPI - це або дуже старі або погано написані, але, тим не менш, як і раніше використовуються. Одним відомим прикладом є ITunes від Apple для Windows. Тут розробники використовують системні шрифти для GUI і, не дбаючи про фактичні розміри шрифту, вони жорстко прив'язують розміри вікон до роздільної здатності 96 DPI, природно спотворюючи GUI, коли при більш високих значеннях DPI збільшуються розміри шрифтів.
Такі програми потребують нового способу масштабування «віртуалізації DPI», на жаль, це часто робить інтерфейс розмитим. В іншому випадку ви зіткнетеся з проблемами починаючи, від обрізання тексту до перекриття елементів контролю, іноді, роблячи GUI повністю непридатним (на щастя, це, трапляється рідко). За ці роки я зібрав кілька зразків скріншотів не коректних додатків.
Приклад програми, працює тільки при DPI рівному 96
роздільна здатність 150% (144 DPI)
Програми, що вміють підлаштовувати свій GUI під різні значення DPI, але не мають DPI-Aware прапора - Це типові програми епохи Windows XP. Тут розробники подбали, щоб отримати фактичні розміри шрифтів системи перед створенням GUI. Такі програми відображаються коректно під час масштабування в стилі Windows XP. На жаль, оскільки вони не встановлюють DPI-Aware прапор, щоб повідомити Windows цей факт, для них, за замовчуванням, буде використана «DPI віртуалізація», роблячи їх GUI нечітким. Це може не сподобатися, отже, ви, можливо, захочете примусово використовувати стиль масштабування Windows XP для таких програм.
Приклад такої програми і роздільна здатність 150% (144 DPI)
Програми, що вміють підлаштовувати свій GUI під різні значення DPI, мають DPI-Aware прапор - Це новітній тип програм які повністю безпроблемні, незалежно від налаштувань DPI. DPI-Aware прапор встановлено автоматично для Windows Presentation Foundation (WPF) і GDI + програм, оскільки ці APIs надають вбудовані засоби масштабування. Розробникам, які використовують старий GDI API і (дивно) Windows Ones, потрібно вручну позначати свої DPI-Aware програми.
Програми не пристосовані до зміни DPI, але мають DPI-Aware прапор - це ще гірше ніж повністю ігнорування значення DPI. У прикладах ви знайдете GUI програм, добре масштабованих аж до 120 DPI, але не вище, або програм JavaFX. Тут ми вже нічого зробити не можемо, тому що у нас немає можливості змусити Windows використовувати DPI віртуалізацію, для таких програм. Після того як DPI-Aware прапор встановлено, додаток повинен масштабувати себе самостійно. Ми можемо тільки «пиляти» розробників виправити їх продукт - або використовувати щось інше.
Вибір методу масштабування для ваших програм
Після того як ви вирішили, що хочете використовувати високе значення DPI, ваш вибір методу масштабування залежить від програм, в яких ви працюєте. Майте на увазі, що, вимкнути «DPI віртуалізацію» означає, встановити прапорець (check box) з некоректною назвою «Використовувати масштаби в стилі Windows XP» і навпаки.
- Якщо вам так неймовірно пощастило використовувати тільки ті програми, які є одночасно DPI-Aware і встановлюють потрібний прапор, тоді не має значення який метод масштабування ви виберете. Всі програми будуть використовувати масштабування в стилі Windows XP, а DPI віртуалізація ніколи не буде використовуватися.
- Якщо ви використовуєте тільки добре написані DPI-Aware програми, але деякі з них не встановлюють необхідний прапор, ви можете відключити «DPI віртуалізацію». Таким чином, всі програми будуть відображатися правильно без будь-якого замилювання внаслідок масштабування. Якщо ваш монітор має дуже високу щільність пікселів, таку, що масштабовані растрові зображення більше не виглядають розмитими, ви, можливо, захочете увімкнути DPI віртуалізацію в будь-якому випадку.
- Якщо у вас є один або декілька програм, які не можуть змінювати DPI і не мають DPI-Aware, вам слід увімкнути віртуалізацію DPI, якщо ви не готові миритися з перекошеним GUI додатків. На жаль, тут виникає ще одна проблема, тому що Microsoft реалізувала цю опцію незручно. Ви можете увімкнути віртуалізацію DPI лише для всієї системи, а не для окремої програми, а потім вибірково вимикати для окремих програм.
Нагадуємо, що в Windows 8.1 вже немає можливості вибору в цьому питанні. Якщо ви працюєте при роздільній здатності 120 точок на дюйм (125%), кожна програма буде змушена використовувати масштабування в стилі Windows XP, a якщо ви працюєте з вищою роздільною здатністю, кожна програма, яка не є DPI-Aware, буде використовувати за замовчуванням «DPI віртуалізацію».
Відмова від DPI віртуалізації для окремих програм
Після того як ви вирішили включити DPI віртуалізацію або ви працюєте в Windows 8.1, з роздільною здатністю більш ніж 120 точок на дюйм, ви можете перевірити систему на предмет наявності DPI-Aware додатків, які не мають відповідний прапор. І повернути їм можливість використовувати масштабування в стилі Windows XP, для якого вони призначені. Є два способи зробити це, перший працює тільки для 32-розрядних додатків, другий універсальний і підходить також для 64-бітних додатків.
32-розрядні додатки - Це просто: Клацніть правою кнопкою миші на виконуваному файлі в Провіднику Windows, виберіть діалогове вікно «Властивості», перейдіть на вкладку «Сумісність» і виберіть «Вимкнути масштабування зображення при високій роздільній здатності екрану». Ось і все, в Windows 8.1 це також працює для 64-бітних додатків.
64-розрядні програми - Без всякої видимої причини, можливо щоб позлити користувачів 64-бітних додатків, в Windows 8 і більше ранніх, згаданий вище прапорець, для 64-розрядних додатків відключений, хоча сам варіант цілком функціональний, якщо внести зміни безпосередньо реєстр! Так що, запустіть редактор реєстру і перейдіть до цього ключа:
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
Тепер додайте рядкове значення (REG_SZ), чиє ім'я є повним шляхом до виконуваного файлу програми і значенням якого є HIGHDPIAWARE. Я рекомендую, щоб ви спочатку змінили кілька 32-бітових додатків, як описано вище, щоб ви могли побачити деякі приклади значень в цьому ключі реєстру.
Ми розглянули, як можна використовувати налаштування DPI на Windows Vista і більш пізніх версіях. І якщо ви коли-небудь замислювалися, для чого призначена опція сумісності - «Відключити масштабування зображення при високій роздільній здатності екрану». І чому вона нічого не робить на вашій системі, тепер ви знаєте: вона ефективна, тільки якщо у вас увімкнено загальносистемний параметр «DPI віртуалізації» і тільки для програм, які не встановлюють DPI-Aware прапор належним чином, але при цьому коректно використовують масштабування в стилі Windows XP.
Подальше читання
For more information about both scaling methods from a developer perspective, see the MSDN article Writing High-DPI Win32 Applications. This content has moved to Writing DPI-Aware Desktop and Win32 Applications. This lengthy article also contains a sample manifest to declare an application as DPI-aware, as well as sample screenshots for the various scaling methods and tips on display scaling in native code.
Unfortunately, the article currently only covers Windows XP through 7. See Writing DPI-Aware Desktop Applications in Windows 8.1 Preview (Word DOCX) and Chuck Walbourn’s Manifest Madness for additional information on Windows 8 and 8.1.
Outside of Microsoft, Gastón Hillar has published two articles targeting Windows 8.1 at Dr. Dobb’s. Part 1 covers basic concepts, and part 2 shows C/C++ sample code for the Win32 API.
You might also wish to check out Andrew McKinlay’s The Joys of High DPI for a nice (and terrifying) war story on working with high DPI in Windows 7. Lastly, see DPI Scaling in Windows GUIs for an evaluation of .NET and Java GUI frameworks with regard to DPI scaling.
P.S. Посилання на тему та як переглянути DPI-Aware прапор додатків.
Спасибі homm за допомогу.