Question

J'utilise GDI + en C ++. (Ce problème peut également exister en C #).

Je remarque que chaque fois que j'appelle Graphics :: MeasureString () ou Graphics :: DrawString (), la chaîne est complétée par un espace vide à gauche et à droite.

Par exemple, si j’utilise une police Courier (pas en italique!) et que je mesure "P". J'en ai 90, mais "PP" me donne 150. Je pense qu'une police monospace donnera exactement le double de la largeur de "PP".

Ma question est la suivante: s'agit-il d'un comportement prévu ou documenté et comment puis-je le désactiver?

RectF Rect(0,0,32767,32767);
RectF Bounds1, Bounds2;
graphics->MeasureString(L"PP", 1, font, Rect, &Bounds1);
graphics->MeasureString(L"PP", 2, font, Rect, &Bounds2);
margin = Bounds1.Width * 2 - Bounds2.Width;
Était-ce utile?

La solution

C'est par conception, cette méthode n'utilise pas les glyphes réels pour mesurer la largeur et ajoute donc un peu de remplissage dans le cas de dépassements.

MSDN suggère d'utiliser une méthode différente si vous avez besoin de plus de précision. :

  

Pour obtenir des mesures adaptées aux chaînes adjacentes de la présentation (par exemple, lors de l'implémentation de texte mis en forme), utilisez MeasureCharacterRanges ou l’une des méthodes MeasureString méthodes prenant StringFormat , puis transmettez GenericTypographic . Assurez-vous également que TextRenderingHint est activé pour le < a href = "http://msdn.microsoft.com/en-us/library/system.drawing.graphics.aspx" rel = "nofollow noreferrer"> Les graphiques sont AntiAlias ??.

Autres conseils

Il est vrai que cela est voulu par la conception, mais le lien sur la réponse acceptée n’est pas parfait. Le problème est l’utilisation de floats dans toutes ces méthodes lorsque vous voulez vraiment utiliser des pixels (ints).

La la classe TextRenderer est destinée à cet objectif et travaille avec les vraies tailles. Consultez ce lien à partir de msdn pour savoir comment l'utiliser.

Ajouter StringFormat.GenericTypographic résoudra votre problème:

graphics->MeasureString(L"PP", 1, font, width, StringFormat.GenericTypographic);

Appliquez le même attribut à DrawString .

On dirait qu'il pourrait également s'agir d'une indication, d'après cet article de kb, Pourquoi le texte est-il différent? lorsque dessiné avec GDIPlus contre GDI

TextRenderer était idéal pour obtenir la taille de la police. Mais dans la boucle de dessin, l’utilisation de TextRenderer.DrawText était extrêmement lente par rapport à graphics.DrawString ().

La largeur d'une chaîne étant le problème, il est préférable d'utiliser une combinaison de TextRenderer.MeasureText et graphics.DrawString ..

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top