2015-12-11 3 views
1

J'essaie de mesurer la taille d'un personnage et je ne peux pas obtenir le bon résultat. Nous utilisons DrawText avec l'indicateur DT_CALCRECT pour mesurer les chaînes, et cela semble fonctionner assez bien (pour être juste, nous ne l'avons pas testé pour des mesures parfaites).Windows/GDI- mesure la taille d'un caractère de police (Marlett)

Cependant j'essaie maintenant de mesurer un seul caractère, le symbole 'x' dans Marlett pour dessiner un bouton de fermeture, mais il ne veut vraiment pas me dire la taille réelle du personnage. Il me dit que le personnage est 8x8 quand c'est vraiment un 6x5, et le personnage est alors légèrement décalé par rapport à l'endroit où je le demande. En ce qui concerne la hauteur, je suppose qu'il retourne la hauteur du caractère pour cette police (étant la même pour tous les caractères, la même chose pour toutes les polices). Pour la largeur cependant, il semble y avoir un espace entre les caractères, ce qui ne semble pas être le cas avec d'autres polices (j'ai essayé quelques caractères dans Arial). Dans Marlett, tous les caractères testés semblent avoir la même largeur.

Est-ce qu'il est possible de savoir quel sera l'espacement supplémentaire autour d'un personnage, donc je peux centrer le 'x' dans une case?

+1

N'essayez pas de le faire vous-même. Utilisez à la place [DrawThemeBackground] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb773289.aspx) et appelez [GetThemeBackgroundExtent] (https://msdn.microsoft.com/fr-fr /library/windows/desktop/bb773380.aspx) pour interroger la taille requise. – IInspectable

+0

Les métriques de police sont ridiculement alambiquées. Même si vous extrayez le contour du glyphe, les indications TrueType et l'ajustement de la grille de pixels risquent de gâcher votre journée. Si vous ne voulez pas de surprises, vous devez utiliser un bitmap. Vous aurez besoin d'un couple pour gérer dpiAwareness. –

Répondre

0

La plupart des polices ont un peu d'espace de chaque côté des glyphes afin qu'elles ne se touchent pas lorsque vous les alignez. Vous ne vous attendez peut-être pas à une police de symbole de spécialité comme Marlett, mais elle est là.

Vous pouvez utiliser GetCharABCWidths pour obtenir une mesure approximative de ces espaces (parfois appelée "largeur d'avance"). La valeur A est généralement l'écart avant le glyphe; la valeur B correspond à la largeur du glyphe lui-même et la valeur C correspond à l'espace après le glyphe. Il se peut toutefois que ces mesures ne soient pas précises, car elles visent plutôt à rendre les choses plus belles. Un glyphe arrondi, comme O peut se répandre dans l'espace environnant et la valeur A et C peut effectivement être négative.

Les polices bien faites contiennent également des ajustements de crénage de sorte que les espaces entre certaines paires de caractères semblent équilibrés, mais je ne m'attendrais pas à une police de symbole de spécialité comme Marlett pour les avoir.

Pour votre besoin spécifique, vous pouvez tester si la valeur B est la valeur précise du glyphe et si la valeur A est le décalage approprié. Marlett était un hack cool pour traiter le rendu de bons contrôles à une variété de résolutions; il a certainement mieux fonctionné que les anciennes images OEM que vous pouvez toujours obtenir de LoadImage. Mais l'interface utilisateur moderne repose généralement sur du code (comme Themes as IIinspectable suggéré) et/ou des bitmaps personnalisés (comme suggéré par Hans Passant). Votre meilleur pari est probablement de poursuivre une de ces techniques pour votre but déclaré. Mais j'ai senti que la question que vous avez réellement posée méritait une réponse.