3 votes

Déterminer les paramètres DPI de Windows par programme ?

Nous avons un problème avec l'une de nos applications MFC qui n'est pas adaptée à la résolution des problèmes de ppp.
Si vous modifiez les paramètres du système pour obtenir une résolution élevée (par exemple 120 ou 144 dpi), l'icône de l'application dans la barre des tâches est déformée. Malheureusement, nous devons enregistrer nos propres WNDCLASS pour l'ordinateur central, et dans le WNDCLASS.hIcon vous devez définir une icône. Cette icône est chargée à l'aide de la fonction LoadIcon fonction. Cette fonction tente de charger l'image dans une taille standard (la même que celle renvoyée par la fonction GetSystemMetrics(SM_CXICON) ), ce qui, pour 120 dpi, correspond à 40x40 pixels. C'est regrettable, car nous ne fournissons pas d'icône de cette taille. Mais il existe une solution de contournement : Puisque, étrangement, la virtualisation des ppp semble ne pas être en vigueur pour 120 ppp, GetDeviceCaps(..., LOGPIXELSX) renvoie effectivement 120 dpi et GetSystemMetrics(SM_CXICON) les retours 40. Nous pouvons donc l'attraper et charger l'icône dans une taille différente. Mais pour 144 dpi, cela ne fonctionne pas, parce que la virtualisation semble maintenant être en vigueur, et nous obtenons 96 dpi et 32 pixels, ce qui donne à nouveau à l'icône un aspect très laid.
J'ai découvert qu'il suffisait de définir le WNDCLASS.hIcon au membre NULL L'icône s'affiche correctement. Mais je me demande si c'est correct car selon MSDN :

hIcon
Poignée de l'icône de la classe. Ce membre doit être une poignée vers une icône de la ressource. Si ce membre est NULL, le système fournit une icône par défaut.

Puis-je donc compter sur le fait que l'icône s'affichera toujours, même si j'attribue à ce membre la valeur NULL ? L'autre solution consisterait à charger l'icône dans la bonne taille, mais pour cela, il faudrait que je sache que le système est effectivement réglé sur 144 dpi. Et voilà où en est ma question initiale. Quelqu'un sait-il s'il est possible de déterminer le réglage DPI du système (à partir d'une application virtualisée dpi) ? Notez que j'ai aussi pensé à faire quelque chose de sale, comme avoir une application dpi aware qui me dise le dpi réel et des choses comme ça, mais je veux éviter ce genre de choses si possible.

Je vous prie d'agréer, Madame, Monsieur, l'expression de mes salutations distinguées,

humbagumba

Mise à jour :
J'ai découvert que le réglage de la WNDCLASS.hIcon au membre NULL n'est pas une bonne idée, car l'icône de l'unité centrale est alors remplacée par une icône par défaut (même si elle apparaît bien dans la barre des tâches...) - je n'ai pas remarqué cela lors de mon premier test.

5voto

Hans Passant Points 475940

Vous devrez ajouter un manifeste à votre programme (ou modifier le manifeste existant) pour désactiver la virtualisation DPI. Il devrait ressembler à ceci :

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
  <asmv3:application>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>

Il n'est pas improbable que cela entraîne plusieurs nouveaux problèmes. Tout ce que vous voudriez savoir à ce sujet est très bien couvert dans ce document. Article de la bibliothèque MSDN .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X