Betreibe ich mein ThinkPad X1 Carbon an meinem USB Dock (onelink pro dock) muss ich jedesmal Neustarten, damit die externen Bildschirmen (angehängt am Dock) scharf sind.
Ab- und wieder anmelden statt Neustart müßte reichen.
Dasselbe Problem beobachte ich mit einem T410s an einem externen Bildschirm. Es hängt mit der technischen Umsetzung der Displayskalierung in Windows zusammen.
Die technische Grundlage für High-DPI-Unterstützung in Windows gibt es schon ewig (müßte schon in Win95 vorhanden gewesen sein), und sie funktioniert etwa so:
- einige visuelle Elemente, die vom System gezeichnet werden (z.B. Menus), skalieren immer automatisch
- Dialogressourcen skalieren ebenfalls automatisch, wenn die Anwendung das nicht explizit unterbindet
- für die Skalierung aller anderen Programminhalte muß die Anwendung selbst Sorge tragen
Für lange Jahre testeten praktisch alle Entwickler ihre Programme nur mit der Standardeinstellung ("96 dpi"). Das führte dazu, daß viele Programme bei höherer DPI-Zahl teils skaliert, teils unskaliert daherkamen, mit sehr unschönen Folgen: Abgeschnittener Text, zu kleine Symbole, unbenutzbare, weil aus dem sichtbaren Bereich hinausgerutschte Schaltflächen etc. Dazu kommt, daß schon länger fast niemand mehr Dialogressourcen benutzt, um sein UI zu konstruieren. (Auch in Windows selbst gibt es nur noch wenige Fälle, wo Dialogressourcen verwendet werden, z.B. beim "Eigenschaften"-Dialog im Explorer oder dem "Internetoptionen"-Dialog. Fun fact: der "Internetoptionen"-Dialog ist strukturell unverändert seit Windows 3.1.)
Weil viele Programme sich in der Praxis als mit Skalierung unbenutzbar erwiesen, führte man in Vista die DWM-Skalierung ein: wenn ein Programm nicht ausdrücklich erklärt, mit höheren DPI-Werten zu funktionieren, dann wird es bei 96 dpi gezeichnet und vom System hochskaliert. Dann sieht es zwar unscharf aus, aber wenigstens funktioniert es. (Sicherlich sollte das zugleich Motivation für die Programmierer sein, ihre Programme zu reparieren, wenn deren Benutzer sich über die unscharfe Darstellung beklagten.)
Das Grundproblem bleibt aber, daß das oben beschriebene Skalierungsmodell die volle Kooperation der Anwendung erfordert. Und erstaunlich oft machen Programme implizite Annahmen über Pixelgrößen (z.B. wird eine dünne Linie gerne einfach 1px breit dargestellt; bei 100% Skalierung ist das okay, aber bei 200% sieht man die praktisch nicht mehr; oder das Programm verwendet Icons, für die es nur 16x16-Bitmapgraphiken hat). Immer mehr Programme lernen damit umzugehen, aber es ist ein mühevoller, zeitaufwendiger Prozeß.
Noch schlimmer wird das ganze nun dadurch, daß es immer üblicher wird, an einem Gerät mehrere Displays mit unterschiedlichen DPI-Zahlen zu betreiben. Du hast vermutlich ein Hi-DPI-Display in deinem Notebook, bei dem du auf 150% oder 200% skalierst, und einen Monitor, den du mit 100% betreiben willst; und bei dem T410s hier ist es genau andersrum (das Notebook braucht 100%, der externe Bildschirm 125%). Und natürlich kann der Benutzer jederzeit Fenster zwischen den beiden Bildschirmen hin- und herschieben. Eigentlich müßte ein Programm also seine Skalierung jedesmal anpassen, wenn es auf einen anderen Bildschirm verschoben wird. Du kannst dir vorstellen, daß es für das System praktisch unmöglich ist, ein bestehendes Programm, dem der Entwickler gerade mühevoll die korrekte DPI-Skalierung beigebracht hat, auch noch dazu zu bringen, mitten im Betrieb seine Skalierung zu ändern.
Deshalb wiederholt sich jetzt die ganze Geschichte. Windows unterstützt seit Version 8.1 das Umschalten der Skalierung im laufenden Betrieb ("per-monitor DPI"), aber noch kann kaum eine Anwendung damit richtig umgehen. Nicht mal der Explorer, Notepad oder andere systemeigene Programme können das. Und mangels besserer Alternativen entscheidet sich das System eben beim Logon für eine DPI-Zahl, die davon abhängt, welche Monitore gerade angeschlossen sind, welche Einstellungen du vorgenommen hast etc., und behält diese während der Session bei. Wenn ich also den T410s am externen Bildschirm hängen habe und mich anmelde, wählt Windows 125% (120 dpi) und teilt das dem Explorer und allen anderen Programmen mit. Wenn ich also ein Explorerfenster öffne, wird es mit 120 dpi dargestellt; wenn ich es auf den Bildschirm vom T410s verschiebe, schaut das System nach, ob explorer.exe "per-monitor DPI" unterstützt, und weil das nicht der Fall ist, wird es vom System runterskaliert und also unscharf. Nehme ich nun das Notebook aus dem Dock, so gibt es nur noch das integrierte Display; aber für das System und alle laufenden Anwendungen ist es schon zu spät, weil sie alle auf 120 dpi eingestellt sind. Deshalb sieht dann eben alles unscharf aus.
In den nächsten Jahren und mit Windows 10 wird die Unterstützung für "per-monitor DPI" sicherlich besser werden, sowohl vom System als auch von Drittprogrammen. Aber es wird einige Zeit dauern, bis es im Alltag nicht mehr stört, und das Problem wird wohl immer wahrnehmbar bleiben (so wie heute zwar die meisten Anwendungen mit Hi-DPI umgehen können, man aber doch immer mal einzelne Programme findet, die das nicht tun).
Man könnte natürlich sagen, es wäre besser gewesen, Microsoft hätte das Problem an der Wurzel gepackt und die DPI-Skalierung "richtig" gemacht, also so, daß die Anwendung davon gar nichts mitbekommen muß, so wie sie eigentlich gar nicht wissen sollte, wie groß ein Pixel gerade ist. Das haben sie auch gemacht: Windows 8-Apps skalieren i.d.R. problemlos, weil das Problem hier von vorneherein vermieden wurde, und das überträgt sich auf die technisch verwandten Universal Apps in Windows 10. Desgleichen gilt für Anwendungen, die mit WPF gemacht wurden. Aber es ist auch klar, daß man an den Grundprinzipien der Skalierung für gewöhnliche Win32-Anwendungen nicht rütteln kann, weil es so unglaublich viele Programme gibt, die sich auf den
status quo verlassen. Deshalb wird es, wie oben beschrieben, noch einiges an Geduld erfordern, bis "per-monitor DPI" im Alltag keine Probleme mehr macht.