2009-02-21 12 views
9

Comment faire pour que UserDrawn UserControl respecte les ppp utilisateurs (96/120/xxx) et/ou la taille de police (normal, large, extra large)? Certaines personnes suggèrent d'utiliser les propriétés DpiX et DpiY sur un objet Graphics, mais cela ne semble pas être sous mon contrôle (c'est-à-dire qu'elles sont toujours définies sur 96, quelle que soit la taille de police ou le dpi que je choisis).).C# Mise à l'échelle du contenu UserControl pour correspondre aux utilisateurs Dpi/Taille de police

Il existe une autre question similaire ici sur StackOverflow où il suggère d'utiliser les propriétés AutoScale, mais les solutions suggérées ne font vraiment rien non plus.

Existe-t-il un moyen de le faire dans .NET, sauf pour s'appuyer sur WPF?

Répondre

3

J'ai le même problème, j'ai essayé d'utiliser GetDC + GetDeviceCaps + ReleaseDC, sauf en utilisant Graphics travaillé, au moins sur Vista32. Je n'ai pas encore eu d'expérience avec DPI, mais personne n'y avait répondu et au moins cela pourrait être utile pour d'autres.

Découvrez Creating a DPI-Aware Application. Cette mention indique pourquoi il peut toujours retourner 96 indépendamment du paramètre DPI réel.

Citation de lien ci-dessus:

mise à l'échelle de DPI dans une application Win32

Dans les applications Win32, procédez comme suit:

  • Utilisez la fonction SetProcessDPIAware pour annuler l'échelle dpi.
  • Lors du dimensionnement d'éléments d'interface dessinés, utilisez des mesures physiques, telles que des centimètres. En utilisant des dimensions physiques plutôt que des pixels, vous garantissez un dimensionnement cohérent sur tous les types d'affichage.
  • Pour obtenir le paramètre ppp système, utilisez la fonction CDC :: GetDeviceCaps avec l'indicateur LOGPIXELSX. Si vous n'annulez pas la mise à l'échelle du dpi, cet appel renvoie la valeur par défaut de 96 dpi.
  • Utilisez la fonction GetSystemMetrics pour obtenir les tailles d'éléments d'interface utilisateur, telles que les bordures de fenêtre. Lorsque la mise à l'échelle ppp est désactivée, les valeurs de mesure renvoyées pour les éléments d'interface sont mises à l'échelle du paramètre ppp sélectionné. Si la mise à l'échelle ppp est active, la fonction renvoie des mesures basées sur 96 ppp, quel que soit le paramètre ppp du système.

Answered de: About DPI Issue

Exemple de code réécrite avec en utilisant -Déclaration (original source):

float dpiX = 96, dpiY = 96; 
using(Graphics graphics = this.CreateGraphics()) 
{ 
    dpiX = graphics.DpiX; 
    dpiY = graphics.DpiY; 
} 
11

Vous devrez définir la propriété AutoScaleMode du UserControl à AutoScaleMode. Dpi et pas définissez la propriété AutoScale sur true. Si vous le faites, il réinitialisera le mode AutoScaleMode à None. La propriété AutoScale est obsolète et n'est disponible que pour la rétrocompatibilité (voir la remarque importante dans ce MSDN article).De même, dans Windows Vista/7, à moins que vous n'indiquiez explicitement que votre application est compatible DPI, Windows émule un environnement DPI par défaut afin que votre application affiche 96 DPI, puis redimensionne la bitmap résultante à la taille appropriée. Pour éviter cela, vous pouvez modifier votre manifeste d'application pour informer Windows que vous êtes en fait au courant de la résolution DPI - voir le Utilisation du manifeste pour déclarer la section de sensibilisation DPI dans this article.