2017-06-22 1 views
0

Ich modifiziere meine Anwendung, um hohe DPI-Werte zu unterstützen (über 100%/96dpi).Windows 10 DPI-Handhabung und Standarddialoge

Ich veränderte die Manifest-Datei der Anwendung enthalten:

<dpiAware>true/PM</dpiAware> 

Ich bin in der Lage all DPI-Skalierung für meine eigenen App-Formen zu handhaben, aber wie kann ich Standard-Windows-Dialoge (Fontauswahl, offene Dateien verarbeiten, Ordner-Browser usw.) über WinAPI. Gibt es eine Möglichkeit, Windows manuell zu informieren, dass nur diese Dialoge automatisch für die höhere DPI skaliert werden sollen?

* Update *

Nach der Verwendung der „SetThreadDpiAwarenessContext“ WinAPI Funktion, Fenster scheinen die Skalierung zu handhaben, aber es tut dies in dem durch das Bild (verschwommenen Textes) Skalierung statt die Bedienelemente der Skalierung (Denken Sie daran, dies sind Standard-Windows-Steuerelemente, wie sie beim Aufruf von "GetOpenFileNameW" generiert werden.

Irgendwelche Ideen, wie man Fenster erhält, um den offenen Dateidialog richtig zu zeichnen, ohne unscharfen Text?

+1

[Diese Antwort] (https://stackoverflow.com/a/41305062/7571258) könnte helfen. – zett42

Antwort

0

Vielen Dank @ zett42, um die verknüpfte Antwort für zukünftige Besucher zusammenzufassen, Win 10 Aniv. edition hat eine neue "SetThreadDpiAwarenessContext()" - Funktion eingeführt, um eine DPI-Erkennung pro Thread zu definieren, mit der Sie Standard-Windows-Dialoge aus einem separaten Thread öffnen können und die Windows DPI-Einstellung automatisch die Skalierung des Dialogs übernimmt.

+2

Die Systemdialoge, die Sie in Ihrer Frage erwähnen, werden häufig als eigene Dialoge verwendet, entweder modal oder nicht. Wenn Sie sie in einen anderen Thread laden, entsteht eine Cross-Thread-Fensterhierarchie mit Ihrer anderen Benutzeroberfläche. Das ist nicht sicher. Siehe [Ist es zulässig, eine prozessübergreifende Beziehung zwischen Eltern/Kind oder Besitzer/Eigentümer-Fenster zu haben?] (Https://blogs.msdn.microsoft.com/oldnewthing/20130412-00/?p=4683). – IInspectable

+0

@IInspectable Sie sind korrekt, wenn Sie "GetOpenFileNameW" mit dem HwndOwner-Handle (Einrichten eines modalen Dialogs) vom primären Thread aufrufen, wird ein Einfrieren ausgelöst. Gibt es dafür eine elegante Lösung (ohne alle Tastatur- und Mauseingaben im aufrufenden Fenster deaktivieren zu müssen)? – bLight

+0

Ich denke du brauchst keinen anderen Thread. Von der verknüpften Antwort: Die DPI-Kenntnis eines durch den Thread erzeugten Fensters hängt von der DPI-Kenntnis des aufrufenden Threads zu der Zeit ab, zu der Windows erzeugt wurde. Wenn ich dies richtig verstehe, muss man 'SetThreadDpiAwarenessContext()' vorher aufrufen Erstellen eines der allgemeinen Dialoge in Ihrem * Haupt-Thread * und Wiederherstellen der vorherigen Einstellung, nachdem das Dialogfeld geschlossen wurde. – zett42