MeasureString

Résolu
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 - 2 mars 2005 à 22:47
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre 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

5 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
3 mars 2005 à 09:15
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
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
4 mars 2005 à 21:39
Regarde cet article : http://codeproject.com/useritems/ArticleFour.asp
Je pense qu'il explique "l'espace supplementaire" :-)

Cocoricoooooooo !!!!
coq
MVP Visual C#
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
4 mars 2005 à 23:18
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
0
soussous78 Messages postés 47 Date d'inscription mardi 21 novembre 2006 Statut Membre Dernière intervention 5 novembre 2016
24 oct. 2009 à 00:56
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,
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
24 oct. 2009 à 09:03
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
*/
0
Rejoignez-nous