2017-06-22 8 views
0

Je modifie mon application pour prendre en charge les valeurs PPP élevées (supérieures à 100%/96 ppp).Windows 10 Gestion de DPI et boîtes de dialogue standard

J'ai modifié le fichier manifeste de l'application pour inclure:

<dpiAware>true/PM</dpiAware> 

Je suis capable de gérer tous l'échelle DPI pour mon propre formulaires d'application, mais comment puis-je gérer les fenêtres standards des boîtes de dialogue (sélecteur de polices, fichiers ouverts, navigateur de dossiers, etc) via WinAPI. Existe-t-il un moyen d'informer manuellement Windows que je veux que ces boîtes de dialogue soient automatiquement mises à l'échelle pour le DPI supérieur?

* Mise à jour *

Après avoir utilisé la fonction WinAPI « de SetThreadDpiAwarenessContext », les fenêtres ne semblent gérer la mise à l'échelle, mais il le fait dans le par mise à l'échelle de l'image (texte flou) au lieu de mise à l'échelle des contrôles (rappelez-vous, ce sont des contrôles Windows standard comme ceux générés en appelant "GetOpenFileNameW").

Des idées pour obtenir des fenêtres pour dessiner la boîte de dialogue de fichier ouvert correctement mise à l'échelle sans texte flou?

+1

[Cette réponse] (https://stackoverflow.com/a/41305062/7571258) pourrait vous aider. – zett42

Répondre

0

Merci @ zett42, pour résumer la réponse liée aux futurs visiteurs, Win 10 Aniv. édition a introduit une nouvelle fonction "SetThreadDpiAwarenessContext()" pour définir une prise de conscience PPP par thread, vous permettant d'ouvrir des boîtes de dialogue Windows standard à partir d'un thread distinct et le paramètre PPP Windows gère automatiquement la mise à l'échelle de la boîte de dialogue.

+2

Les boîtes de dialogue système que vous mentionnez dans votre question sont généralement utilisées comme boîtes de dialogue propriétaires, modales ou non modales. En les déchargeant sur un autre thread, vous obtiendrez une hiérarchie de fenêtres croisées avec votre autre interface utilisateur. Ce n'est pas sûr. Voir [Est-il légal d'avoir une relation père/enfant/parent/propriétaire/fenêtre propriétaire entre processus?] (Https://blogs.msdn.microsoft.com/oldnewthing/20130412-00/?p=4683). – IInspectable

+0

@IInspectable Vous avez raison, l'appel de "GetOpenFileNameW" avec hwndOwner handle (la configuration d'une boîte de dialogue modale) à partir du thread principal déclenche un gel. Y at-il une solution élégante à cela (sans avoir à désactiver toutes les entrées du clavier et de la souris sur la fenêtre d'appel)? – bLight

+0

Je pense que vous n'avez pas besoin d'un autre fil. A partir de la réponse liée: _DPI la connaissance d'une fenêtre créée par le thread dépendra de la sensibilité DPI du thread appelant au moment de la création des fenêtres_ ... Si je comprends bien, il suffit d'appeler 'SetThreadDpiAwarenessContext()' avant créer l'un des dialogues communs dans votre * thread principal * et le restaurer au réglage précédent après que la boîte de dialogue a été fermée. – zett42