Windows 10 started its journey to simplified display settings with an awkward combination of dialogs in the modern Settings app and the legacy Control Panel, as described in my previous post on the subject. With the recently released “Creators Update” (version 1703) the journey appears to have reached its destination. All display settings, including all DPI settings, are now exclusively handled by the Settings app and have been further streamlined as well.
On the developer side, Microsoft’s Peter Felts details the new High-DPI Scaling Improvements for Desktop Applications and demonstrates them in a short companion video. Most require either developer cooperation or apply to Windows UI elements only, but all users should know about a huge change in per-application compatibility properties which I’ll describe below.
High DPI Desktop Application Development on Windows is Microsoft’s current reference article on the subject. As a reminder, Windows team members have also posted on the evolution of DPI scaling up to the initial release of Windows 10, and on API changes in Windows 10 Anniversary Update.
Earlier Windows 10 Changes
Windows 10 enforces DPI virtualization (i.e. blurry bitmap scaling) at all scaling levels, even at 125% (120 DPI) which had defaulted to XP style scaling in older versions. See my main article, High DPI Settings in Windows, for what this all means. The important point is this: if you’re running at 120 DPI and text that used to look sharp suddenly looks blurry in Windows 10, you need to manually disable DPI virtualization (see below) for each individual blurry-looking application.
If you have multiple monitors, Windows 10 can maintain different DPI scaling levels for each, a feature first introduced in Windows 8.1. The default levels are an estimate for proportional scaling, so as to achieve approximately the same physical display size on each monitor. You can also manually select different levels for any or all monitors. I don’t have a screenshot for this as I don’t currently have multiple monitors attached, but I expect it looks roughly the same as before.
Basic DPI Settings
You can find the basic controls for changing DPI scaling in the modern Settings app, under System: Display: Scale and layout. The available steps are 100–250% in 25% increments, continuing up to 350% in 50% increments. The default guessed by Windows is marked as “Recommended” but this is usually too small for my eyes (e.g. 150% instead of the 200% I prefer). By the way, above the Scale and layout drop-down box appears the nifty new “night light” feature to soften display colors at night.
Custom DPI Settings
The more fine-grained custom controls have been migrated from the Control Panel to the Settings app. Click the “Custom scaling” link under Scale and layout to access a surprisingly simple and informative new dialog. The range of DPI scaling available here is widened to 100–500%, with no fixed steps – you can type any number you choose.
As this dialog now clearly states, using Custom scaling has an additional effect: the entered value applies to all attached monitors equally. Consequently, entering and applying a value here internally changes the registry key
HKEY_CURRENT_USER\Control Panel\Desktop\Win8DpiScaling from 0 to 1, since Windows 8.0 was the last version without per-monitor DPI scaling. Moreover, the Scale and layout section will now show a dedicated link to “Turn off custom scaling and sign out.”
For the record, the ancient and obsolete option to Change only the text size has been removed in the migration to the Settings app. This is a good thing as it was pointless and confusing. See the previous post if you really want to know more about it.
Right-clicking on an application executable lets you open its Properties window. On its Compatibility tab, you can force any desired per-application scaling method under “Override high DPI scaling behavior.” When unchecked Windows will apply DPI virtualization unless the application claims to self-scale, in which case Windows will do nothing. When checked you have three choices, as shown below:
- Application — Disables DPI virtualization (or any other system scaling) and requires the application to scale itself correctly. Try this when an application appears blurry. If it now renders correctly, the developer merely forgot to flag the application as self-scaling.
- System — Enables full DPI virtualization of all display output of the application. Try this when an application appears too small or shows scrambled layout. This option should always fix such problems, although at the expense of some blurriness.
- System (Enhanced) — Enables DPI virtualization of the application’s display output, except for GDI text and line rendering which is re-rendered at the target resolution. If you’re lucky this option will produce correct layout with less blurriness than System.
Older Windows versions featured only a single checkbox here, entitled “Disable display scaling on high DPI settings.” Checking it allowed users to opt out specific applications from DPI virtualization, but not to opt in when the application was marked as self-scaling by its developer. This was a notorious problem for Java Swing applications which were always so marked but hardly ever actually self-scaled. You can now use System or System (Enhanced) to fix such applications on a case-by-case basis.
All in all, the new DPI settings interface is finally one I’m happy with. It’s clear and obvious, free of bizarre legacy cruft, well-documented, and even allows enforcing DPI virtualization. What it won’t magically fix is applications that just don’t care about proper DPI scaling – these will still appear blurry, partly or wholly. Happily not many of these legacy applications are left, as even Apple iTunes has finally fixed its display and Java Swing is expected to properly self-scale in Java SE 9.