MeasureString () remplit le texte à gauche et à droite
J'utilise GDI+ en C++. (Ce problème peut exister en C#).
J'ai remarqué qu'à chaque fois que j'appelle Graphics::MeasureString() ou de la carte Graphique::DrawString(), la chaîne est rembourré avec un espace vide à gauche et à droite.
Par exemple, si je suis en utilisant une police Courier, (pas d'italique!) et je mesure le "P" - je obtenir 90, mais "PP" me donne 150. Je m'attends à une police à espacement fixe de donner exactement le double de la largeur de la "PP".
Ma question est: est-ce prévu ou comportement documenté, et comment puis-je désactiver cette option?
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;
source d'informationauteur Tim Cooper
Vous devez vous connecter pour publier un commentaire.
C'est de par sa conception, cette méthode n'utilise pas le réel glyphes de mesurer la largeur, et ajoute un peu de rembourrage dans le cas de surplombs.
MSDN suggère d'utiliser une autre méthode si vous avez besoin de plus de précision:
C'est vrai que c'est par la conception, mais le lien sur le acceptées réponse est effectivement pas parfait. Le problème est l'utilisation de flotteurs dans toutes ces méthodes lorsque tout ce que vous voulez vraiment être à l'aide de est de pixels (ints).
La Classe TextRenderer est destiné à cet effet et fonctionne avec le vrai tailles. Voir ce lien à partir de msdn procédure pas à pas de l'utilisation de ce.
Ajouter
StringFormat.GenericTypographic
permettra de résoudre votre problème:Appliquer le même attribut pour
DrawString
.Sonne comme il pourrait également être connecté à l'affinage, fondée sur le présent article, Pourquoi le texte s'affiche différents lorsqu'ils sont dessinés avec GDIPlus contre GDI
TextRenderer est idéal pour obtenir la taille de la police. Mais dans le dessin de la boucle, à l'aide de TextRenderer.DrawText était atrocement lent par rapport à des graphiques.Cordon de serrage().
Étant donné que la largeur d'une chaîne est le problème, votre beaucoup mieux, en utilisant une combinaison de TextRenderer.Savoir measuretext et des graphiques.Cordon de serrage..