Présentation des problèmes de mise à l’échelle de l’écran
Windows Vista et les versions ultérieures du système d’exploitation permettent aux utilisateurs de modifier le paramètre points par pouce (ppp) afin que la plupart des éléments d’interface utilisateur à l’écran apparaissent plus grands. Dans les versions antérieures de Windows, la mise à l’échelle devait être implémentée par les applications. Dans Windows Vista et versions ultérieures, le Gestionnaire de fenêtres de bureau (DWM) effectue la mise à l’échelle par défaut pour toutes les applications qui ne gèrent pas leur propre mise à l’échelle. Les applications clientes Microsoft UI Automation doivent prendre en compte cette fonctionnalité.
Cette rubrique contient les sections suivantes :
- Mise à l’échelle dans Windows Vista et versions ultérieures
- Mise à l’échelle dans les clients UI Automation
Mise à l’échelle dans Windows Vista et versions ultérieures
Le paramètre ppp par défaut est 96, ce qui signifie que 96 pixels occupent la largeur ou la hauteur d’un pouce fictif. La mesure exacte d’un « pouce » dépend de la taille et de la résolution physique du moniteur. Par exemple, sur un moniteur d’une largeur de 12 pouces, pour une résolution horizontale de 1 280 pixels, une ligne horizontale de 96 pixels s’étend sur 9/10e de pouce.
Changer le paramètre ppp et changer la résolution d’écran sont deux choses différentes. Avec la mise à l’échelle ppp, le nombre de pixels physiques à l’écran reste le même. Toutefois, la mise à l’échelle est appliquée à la taille et à l’emplacement des éléments d’IU. Cette mise à l’échelle peut être effectuée automatiquement par le DWM pour le bureau et pour les applications qui ne demandent pas explicitement à ne pas être mises à l’échelle.
En effet, quand l’utilisateur définit le facteur d’échelle à 120 ppp, un pouce vertical ou horizontal à l’écran s’agrandit de 25 %. Toutes les dimensions sont ajustées en conséquence. Le décalage d’une fenêtre d’application par rapport au bord supérieur et au bord gauche de l’écran augmente de 25 %. Si la mise à l’échelle de l’application est activée et si l’application ne prend pas en charge ppp, la taille de la fenêtre augmente dans les mêmes proportions, tout comme les décalages et les tailles de l’ensemble des éléments d’IU qu’elle contient.
Notes
Par défaut, le DWM n’effectue pas de mise à l’échelle pour les applications non prenant en charge les ppp lorsque l’utilisateur définit le ppp sur 120, mais effectue une mise à l’échelle lorsque le ppp est défini sur une valeur personnalisée de 144 ou supérieure. Toutefois, l’utilisateur peut remplacer le comportement par défaut.
La mise à l’échelle de l’écran pose de nouveaux défis pour les applications qui sont concernées d’une manière ou d’une autre par les coordonnées d’écran. L’écran contient maintenant deux systèmes de coordonnées : l’un physique et l’autre logique. Les coordonnées physiques d’un point sont le décalage réel en pixels par rapport à l’angle supérieur gauche du point d’origine. Les coordonnées logiques correspondent aux décalages tels qu’ils seraient si les pixels eux-mêmes étaient mis à l’échelle.
Supposons que vous concevez une boîte de dialogue avec un bouton aux coordonnées (100, 48). Quand cette boîte de dialogue s’affiche avec la valeur par défaut 96 ppp, le bouton se trouve aux coordonnées physiques (100, 48). À 120 ppp, il se trouve aux coordonnées physiques (125, 60). En revanche, les coordonnées logiques sont les mêmes, quel que soit le paramètre ppp : (100, 48).
Les coordonnées logiques sont importantes, car elles rendent le comportement du système d’exploitation et des applications cohérent, quel que soit le paramètre ppp. Par exemple, en général, la fonction GetCursorPos retourne les coordonnées logiques. Si vous déplacez le curseur sur un élément d’une boîte de dialogue, les mêmes coordonnées sont retournées, quel que soit le paramètre ppp. Si vous dessinez un contrôle aux coordonnées (100, 100), il est placé à ces coordonnées logiques et occupe la même position relative, quel que soit le paramètre ppp.
Mise à l’échelle dans les clients UI Automation
L’API UI Automation n’utilise pas de coordonnées logiques. Les méthodes et propriétés suivantes retournent des coordonnées physiques ou prennent des coordonnées physiques en tant que paramètres.
- IUIAutomation::ElementFromPoint
- IUIAutomation::ElementFromPointBuildCache
- IUIAutomationElement::GetClickablePoint
- IUIAutomationElement::CurrentBoundingRectangle
- IUIAutomationElement::CachedBoundingRectangle
- IRawElementProviderFragment::BoundingRectangle
Par défaut, UI Automation applications qui s’exécutent dans un environnement qui n’est pas défini sur 96 ppp n’obtiendront pas les résultats corrects de ces méthodes et propriétés. Par exemple, étant donné que la position du curseur est en coordonnées logiques, le client ne peut pas passer ces coordonnées à IUIAutomation::ElementFromPoint pour obtenir l’élément qui se trouve sous le curseur. En outre, l’application n’est pas en mesure de placer correctement les fenêtres en dehors de sa zone cliente.
La solution comporte deux parties.
Tout d’abord, faites en sorte que l’application cliente prenne en charge ppp. Pour ce faire, appelez la fonction SetProcessDPIAware au démarrage. Cette fonction permet à l’ensemble du processus de prendre en charge ppp, ce qui signifie que toutes les fenêtres qui appartiennent au processus ne sont pas mises à l’échelle.
Ensuite, pour obtenir les coordonnées du curseur, appelez la fonction GetPhysicalCursorPos .