Високі значення DPI в ОС Windows

Windows, починаючи з Vista, надає два механізму для адаптації програм до моніторів з високою щільністю пікселів (точок на дюйм-DPI): збільшені системні шрифти і повномасштабне збільшення вікон. На жаль, спроба змусити всі ваші програми, працювати в одному з режимів, може виявитися безуспішним, завдяки поєднанню, недбайливих розробників і поганих рішень, прийнятих Microsoft.

Ця сторінка призначена для того, щоб допомогти користувачам зрозуміти і виправити можливі проблеми, при налаштуванні високих значень DPI. Будь ласка, зверніть увагу, що ми розглянемо тільки традиційні додатки Windows, Windows Store («Metro», «Modern UI») додатка. Останні використовують новий API WinRT, який забезпечує власний механізм масштабування.

  1. Від перекладача
  2. Методи масштабування
  3. Як змінити установки DPI
  4. Типи додатків, як вони масштабуються (або не масштабуються)
  5. Подальше читання для розробників (без перекладу)

Від перекладача

У цій статті застосовуються такі скорочення, які, я вважав перекладати не доцільно: Графічний Інтерфейс Користувача (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. Цей метод, насправді, не є методом масштабування додатків з графічним інтерфейсом, як такої. Масштабуються, при більш високих налаштуваннях DPI, тільки, системні шрифти та інші елементи інтерфейсу системи (я б назвав його, «метод НЕ масштабування» в стилі Windows XP).

Всі інші елементи додатків, як і раніше, відображаються в масштабі 1:1. Єдиною різницею в їх зовнішньому вигляді є те, що будь-який текст, що виводиться за допомогою системних шрифтів, раптом, ставати більше, наприклад, текст на кнопках. Це викликає очевидні проблеми, які ми обговоримо трохи пізніше.

Масштабування в стилі 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 точок на дюйм. Тому, 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. Але, цей метод масштабування (який тільки збільшує системні шрифти та інші елементи інтерфейсу системи), завжди включається при виборі високого значення DPI. Насправді, цей параметр керує, буде цей метод єдиним, або також, буде застосовано метод «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-Aware прапор не встановлено DPI-Aware прапор встановлений
Не DPI-Aware Потрібно використовувати DPI віртуалізацію Потрібні виправлення від розробників
DPI-Aware Потрібно використовувати масштабування в стилі Windows XP Завжди масштабується правильно
Програми, взагалі не піклуються про 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 Forms, потрібно вручну позначати свої 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 explorer, виберіть діалогове вікно «Властивості», перейдіть на вкладку «Сумісність», і встановіть прапорець «Відключити масштабування зображення при високому дозволі екрану». От і все, в 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) Chuck and 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. Частина 1 covers basic concepts, and частина 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 прапор додатків.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.