OVH Cloud OVH Cloud

MeasureString

7 réponses
Avatar
MrChris
Salut !
Je n'arrive pas à récupérer correctement la longueur d'un texte en pixel...
J'ai l'impression que la fonction MeasureString est boguée !!!

Quelqu'un sait comment faire ???

MrChris

7 réponses

Avatar
Zoury
> J'ai l'impression que la fonction MeasureString est boguée !!!



Il semblerait que MeasureString() ne renvoit pas la taille de manière
exact.. elle renvoit plutôt la taille minimum exigée pour permettre
l'affichage complet d'une chaine. De plus il *paraitrait que* plus la chaine
est longue moins la taille retournée est précise (selon un témoignage tiré
d'une discussion dans les archives que j'ai croisé un jour).

tiré de l'aide :
'***
La méthode MeasureString est destinée à une utilisation avec des chaînes
individuelles et comprend une petite quantité d'espace supplémentaire située
avant et après la chaîne pour tenir compte des glyphes surplombants. La
méthode DrawString règle également les points de glyphe afin d'optimiser la
qualité d'affichage et peut afficher une chaîne dans un format plus étroit
que ce qui est indiqué par MeasureString. Pour obtenir des métriques
appropriées pour des chaînes adjacentes dans la mise en page (par exemple,
lors de l'implémentation d'un texte mis en forme), utilisez la méthode
MeasureCharacterRanges.
'***


--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
MrChris
Ok, super...
Mais je fais comment moi maintenant pour mesurer ma chaine ???
Tans pis si ce n'est pas exact, mais au moins que ca fonctionne !
Une idée ???

Merci
MrChris
Avatar
Zoury
> Mais je fais comment moi maintenant pour mesurer ma chaine ???



voici un exemple d'utilisation de MeasureString(), dis le nous si ce n'est
pas assez précis..
'***
Dim siz As Size = Label1.CreateGraphics().MeasureString(Label1.Text,
Label1.Font).ToSize()
'***

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
MrChris
Ok, ca à l'air d'être mieux...
Je faisait de la façon suivante :

Dim b As New Bitmap(1, 1)
Dim Graph As Graphics = System.Drawing.Graphics.FromImage(b)
Dim Format As StringFormat = StringFormat.GenericTypographic
TailleFen.Width = Graph.MeasureString(Texte, Fnt, 1000, Format).Width + 8
TailleFen.Height = Graph.MeasureString(Texte, Fnt, 1000, Format).Height + 2

Seulement, la mesure devenait imprécise avec un texte long !!!
Le fait de passer par un label me semble plus stable...
A confirmer !

Merci !!!
@+MrChris
Avatar
MrChris
Mais c'est un bug de la fonction measurestring ou c'est un comportement
normal ???
J'ai des doutes...

@+MrChris
Avatar
Ludovic SOEUR
Ce n'est pas un bug de la fonction MeasureString qui ne fait qu'une
approximation (bonne au passage quand même) de la taille et de façon rapide.
Pour être très précis, il faut utiliser la méthode
SetMeasurableCharacterRanges et fournir les paramètres appropriés à
StringFormat.

Donc au lieu d'utiliser
private Size stringSize_old(string s,Graphics g,Font f) {
return g.MeasureString(s,f).ToSize();
}

vous pouvez utiliser les lignes suivantes :
private Size stringSize(string s,Graphics g,Font f) {
if ((s==null)||(s=="")) return new Size(0,0);
StringFormat stringFormat=new
StringFormat(StringFormatFlags.NoWrap|StringFormatFlags.NoClip);
stringFormat.SetMeasurableCharacterRanges(new CharacterRange[]{new
CharacterRange(0,s.Length)});
RectangleF rect=g.MeasureCharacterRanges(s,Font,new
RectangleF(0,0,0,0),stringFormat)[0].GetBounds(g);
return new Size((int)rect.Width,(int)rect.Height);
}

Regardez l'aide de StringFormatFlags qui permet en plus par exemple de
prendre en compte les espaces de fin de chaine.

J'espère que c'est ce que vous recherchiez.

Cordialement,

Ludovic Soeur.

"MrChris" a écrit dans le message de
news:
Mais c'est un bug de la fonction measurestring ou c'est un comportement
normal ???
J'ai des doutes...

@+MrChris




Avatar
MrChris
Oui, j'avais en premier lieu utilisé MeasureCharacterRanges
suivant les conseils dans le lien ci dessous...

http://www.codeproject.com/cs/media/measurestring.asp

Mais je ne connaissait pas SetMeasurableCharacterRanges,
La solution de Zoury me convient, mais si j'ai des soucis,
j'essayerais la tienne !

Merci Beaucoup !
@+MrChris