MeasureString [Résolu]

Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
- - Dernière réponse : cs_coq
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
- 24 oct. 2009 à 09:03
Je cherche à savoir pourquoi le label2 et le label3 n'affiche pas la même chose dans le petit morceau de code suivant :

Graphics g = label1.CreateGraphics();
string[] words = label1.Text.Split(
new
char[] { ' ' } );

float tot = 0F;



foreach(
string word
in words) tot += g.MeasureString(word, label1.Font).Width;

label2.Text = tot.ToString();
label3.Text = g.MeasureString(
string.Join("", words), label1.Font).Width.ToString();

Merci d'avance aux réponses!

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
3
Merci
Bon, après un bon moment de recherche, j'ai trouvé la solution à mon problème.
Je trouve ce résultat très bizarre, alors si de bonne âme voudront bien m'expliquer plus en détails, je suis preneur.


Voici ce qui j'ai trouvé :
En fait, quand on fait un MeasureString, la longeur du mot est en fait la longueur du mot plus un espace (je ne sais pas pourquoi!).
Donc forcément, si je calcul la longeur du mot "SalutToutLeMonde" ou bien si j'aditionne les longeurs de "Salut" et "Tout" et "Le" et "Monde" et bien j'obtiens pas le même résutat, puisque dans le second cas, j'aurai compter plus de fois l'espace.
Combien de fois plus? Dans l'exemple ci-dessus, j'ai un espace pour "SalutToutLeMonde" et et quatre espace dans l'autre cas, car il y a quatre mot. J'ai trois espaces de trop, ou encore le nombre de mot - 1.


Si je veux corriger mon code pour qu'il marche, je dois donc faire qqch dans ce genre :


Graphics g = label1.CreateGraphics();
float tot = 0F;
float spaceW = g.MeasureString(" ", this.Font).Width; // Longeur d'un espace
string[] words = label1.Text.Split(new char[] { ' ' });


foreach(string word in words) tot += g.MeasureString(word, label1.Font).Width;
tot -= spaceW * (words.Length - 1); // On soustrait les espaces superflus


label2.Text = tot.ToString();
label3.Text = g.MeasureString(string.Join("", words), label1.Font).Width.ToString();


Voilà.

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 99 internautes ce mois-ci

Commenter la réponse de cs_Bidou
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
3
Merci
Regarde cet article : http://codeproject.com/useritems/ArticleFour.asp
Je pense qu'il explique "l'espace supplementaire" :-)

Cocoricoooooooo !!!!
coq
MVP Visual C#

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 99 internautes ce mois-ci

Commenter la réponse de cs_coq
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
Ha oui je vois, merci, je le lirai encore une deuxième fois demain, là c'est un peu tard, j'ai pas tout saisi ;-)

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Commenter la réponse de cs_Bidou
Messages postés
47
Date d'inscription
mardi 21 novembre 2006
Dernière intervention
5 novembre 2016
0
Merci
Bonjour,
J'ai exactement le même problème mais le lien ne fonctionne pas.
Pour ma part je crée un style de TextBox spécial et je voudrai juste ajouter le | en fin de ligne mais
1- plus j'écris plus il s'éloigne (le rendu de width est trop grand)
2- lorsque je fais un espace, il ne le prend pas en compte.
3- lorsque je colle le texte a droite de la box, j'ai un espace (toujours a cause du rendu de width)

Si quelqu'un a la réponse là dessus, je suis entièrement preneur.

Merci,
Commenter la réponse de soussous78
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
0
Merci
Bonjour,

Concernant le lien si je ne me trompe pas il s'agissait de cet article :
Article Four: Building a UI Platform in C# - Painting Text to the Pixel : http://www.codeproject.com/KB/GDI-plus/articlefour.aspx


/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.