LONGUEUR EN PIXEL D'UNE CHAINE DE CARACTERE

cs_akina Messages postés 19 Date d'inscription lundi 8 décembre 2003 Statut Membre Dernière intervention 27 avril 2006 - 3 sept. 2005 à 12:40
 Utilisateur anonyme - 8 déc. 2010 à 20:07
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/33625-longueur-en-pixel-d-une-chaine-de-caractere

Utilisateur anonyme
8 déc. 2010 à 20:07
bonsoir, j'ai posé cette source en sachant pertinemment qu'il y avait mieux a faire.... Malheuresement ce probleme ne se posera plus puis ... je passe sous java ! Merci pour le complément
blq Messages postés 97 Date d'inscription vendredi 22 octobre 1999 Statut Membre Dernière intervention 13 juin 2016 1
8 déc. 2010 à 16:25
Cet post date un peu, mais effectivement la méthode la plus simple et rapide est d'utiliser MeasureString()

Comme il n'y avait pas d'exemple précis dans cette discussion, en voici un avec l'objet ListView en affichage "Details", pour redimensionner la largeur d'une colonne

' Déclarations
Dim leGraphic As Graphics = laListView.CreateGraphics
Dim unItem as ListViewItem = Nothing
Dim tailleChaine As Integer = 0

' Ajout d'un nouveau texte dans la liste
unItem = laListView.Items.Add("une chaine de longueur variable...")
' Récupération de la taille
tailleChaine = CInt(leGraphic.MeasureString(unItem.Text, unItem.Font).Width)

' Si la largueur de la colonne est inférieur au texte ajouté, alors
' on met à jour la taille de la colonne pour tout afficher
If tailleChaine > laListView.Columns.Item(0).Width Then laListView.Columns.Item(0).Width = tailleChaine

Ce petit code peut-être complété dans une boucle d'ajout de texte, la largeur affichée de la colonne sera toujours calée sur la plus grande chaine. On peut bien évidement varier et ce caler sur la plus petite... c'est libre court à la créativité !
psycho81 Messages postés 84 Date d'inscription mardi 4 mai 2004 Statut Membre Dernière intervention 17 février 2008
11 janv. 2006 à 17:17
Bon sinon, pour la mesure d'un string, partout je vois que Graphics.MeasureString(texte, font) est la meilleure techniques pour des utilisations non répétitives (et de courts textes). Vu que l'on transforme le texte en bitmap ... si cherche à mesurer la taille en pixel d'un livre entier... on va saturer la mémoire.
psycho81 Messages postés 84 Date d'inscription mardi 4 mai 2004 Statut Membre Dernière intervention 17 février 2008
11 janv. 2006 à 17:12
Ah ok, merci à toi :)

J'ai eu souvent à lire tes codes et, bien que l'envie m'en démange, je n'en ferai pas les louanges, les jedis de l'informatique n'ont qu'a bien se tenir :)

Bon sinon, pour faire chier mon monde (il faut bien être un peu critique aussi), ce code n'est pas standard .NET (API = windows) donc pas compatible sous MONO. On ne devrait donc jamais utiliser d'API sous .NET.

Bon je me tais :x
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
11 janv. 2006 à 15:57
Ah non, tu n'as rien compris ;p

Comme dit dans ton texte : "en utilisant comme police celle liée au contexte graphique passé en paramètre", donc si tu lui passe : Picture1.hdc, il utilisera la police de Picture1.hdc et non celle de Form1, et donc, tiendras compte de la taille, du nom, du style de la police, ce qui est quand même bien plus rigoureux que cette source !

DarK Sidious
psycho81 Messages postés 84 Date d'inscription mardi 4 mai 2004 Statut Membre Dernière intervention 17 février 2008
11 janv. 2006 à 11:25
DARKSIDIOUS,
en cherchant des infos sur la fonction GetTextExtentPoint32, j'ai trouvé çà :

<<
La fonction GetTextExtentPoint32 calcule la taille du texte en utilisant comme police celle liée au contexte graphique passé en paramètre. Donc pour que le résultat soit exact, la police de la form doit être la même que celle du label.
>>

à cette adresse : http://vb.developpez.com/faq/?page=Graphisme

Si je comprends bien, en fait c'es tla police du form qui est prise en compte et non la police de l'objet en cours qui est pris pour le calcul ? Ou bien n'ai je pas compris ?
boursicotteur Messages postés 201 Date d'inscription mercredi 25 septembre 2002 Statut Membre Dernière intervention 10 novembre 2007
7 sept. 2005 à 23:06
Je ne travailles pas en .net mais il me semble que ton code donne la largeur du label et non celle du texte écrit sur le label. C'est vraiment pas la même chose.

Pour connaître la largeur d'un mot, j'utilise plutôt la méthode "textwidth" qui est applicable sur des objets Form, PictureBox et Printer mais tu peux toujours jouer d'astuce pour connaître la largeur d'un mot sur un label... Il suffit simplement de créer un picturebox que tu prendras soin de paramétrer de la même façon que ton label (police, taille police, etc) puis d'appliquer la méthode textwidth sur ce picturebox.

Il doit bien y avoir l'équivalent en .net
cs_christoni Messages postés 140 Date d'inscription mardi 25 novembre 2003 Statut Membre Dernière intervention 1 novembre 2010 7
5 sept. 2005 à 13:32
Pour ceux qui veulent un exemple sur MeasureString, regardez là :
http://www.codeproject.com/vb/net/MeasureStrings.asp
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
5 sept. 2005 à 11:20
Ben avec API (sous vb6, en se basant sur la feuille courante ) :

Dim pTextSize As POINTAPI
GetTextExtentPoint32 me.hDC, "Salut", Salut, pTextSize

pTextSize stocke alors : en .X la largeur, en .Y la hauteur

Et surtout : ca gère la font sélectionnée !!! (car c'est surtout cà qui modifie la largeur d'un texte !!!).

DarK Sidious
Utilisateur anonyme
5 sept. 2005 à 11:00
Effectivement, en recopiant la source chez moi pour la mettre en ligne, j'ai oublié le H de nothing. (effectivement, nous n'avons pas internet sur nos postes du bureau, question sécurité)
oui, je sais que c'est bourrin mais quand on touche que dalle aux api.... Mais si vous avez une fonction toute faite avec des api, je suis preneur
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
5 sept. 2005 à 08:23
pour la ligne :
taille_en_pixel_d_une_chaine_de_caractere = label1.width
essaye
return lable1.width
Attention, cela quitte la procédure immédiatement.

Sinon pour graphics, j'avais essayer, mais j'ai eu un pb, s'agit-il d'une fonction shared ? Parce que g pas réussi à y accéder sans devoir créer un objet (me.creategraphics).
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
4 sept. 2005 à 22:51
mais ca... ce n'est pas nouveau, puisqu'on l'avait déjà en VB6.
THE VIPER Messages postés 46 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 19 octobre 2006
4 sept. 2005 à 22:48
je crois que ca servira pour changer la taille d'un label par raport au text ...
on peut utiliser
label1.autosize = true
et ca sera automatiquement redimentione
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
4 sept. 2005 à 20:28
le mot clé noting n'existe pas en VB... c'est Nothing.
Enfin, le Dispose libère toutes les ressources utilisées par l'objet avant de détruire celui-ci. Il faut donc toujours utiliser Dispose à la place de Nothing quand l'objet est Disposable.
Enfin, je trouve que DarkSidious a raison. Il est quand même préférable d'utiliser la méthode MeasureString de l'object System.Drawing.Graphics.
jrbleboss Messages postés 480 Date d'inscription jeudi 6 mai 2004 Statut Membre Dernière intervention 3 septembre 2007 1
3 sept. 2005 à 19:49
Oui c'est un peu bourrin comme technique mais c pas con.

JRB
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
3 sept. 2005 à 15:19
Tiens, on a réactiver le code ?

Donc pour tout ceux à qui ca interesse de connaitre la largeur du texte, je vous conseille plutôt d'utiliser :
Graphics.MeasureString(texte, font)

Voilà pourquoi j'avais désactivé le code...

DarK Sidious
cs_Clem Messages postés 282 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 12 février 2007
3 sept. 2005 à 14:10
perso je me sers de l'api GetTextExtentPoint32, un peu plus fatiguant, mais plus rapide au moins ;)
cs_akina Messages postés 19 Date d'inscription lundi 8 décembre 2003 Statut Membre Dernière intervention 27 avril 2006
3 sept. 2005 à 12:40
exactement ce qu'il me fallait.!merci
Rejoignez-nous