julienorion666
Messages postés38Date d'inscriptionvendredi 6 juillet 2007StatutMembreDernière intervention24 juin 2008
-
20 févr. 2008 à 13:55
julienorion666
Messages postés38Date d'inscriptionvendredi 6 juillet 2007StatutMembreDernière intervention24 juin 2008
-
20 févr. 2008 à 19:44
Bonjour,
Je fait de l'impression d'un tableau de 3 colonnes , je mesure la taille de mon text pour calculer la hauteur de ma cellule ou plutot de la ligne.
float largeur_co;
for (int i = 0; i < listViewCarr.Items.Count; i++)
{
// taille des chaine a mettre ds les 3 cellules
float tailleDomaine = e.Graphics.MeasureString(listViewCarr.Items[i].SubItems[0].Text ,imprFont).Width;
float tailleProfession = e.Graphics.MeasureString(listViewCarr.Items[i].SubItems[1].Text, imprFont).Width;
float tailleSecteur = e.Graphics.MeasureString(listViewCarr.Items[i].SubItems[2].Text , imprFont).Width;
// taille du text le plus grand
float tailleMax = Math.Max(Math.Max(tailleDomaine, tailleProfession), tailleSecteur);
//largeur des colonnes
largeur_col = e.MarginBounds.Width/3
// taille d'une ligne text
int hauteur = (int)MyGr.MeasureString("X", imprFont).Height;
// nombre de lignes text
int nb_lignes_txt = (int) (tailleMax / largeur_col) + 1;
//hauteut de ma ligne
hauteur = hauteur * nb_lignes_txt
tableCase = new Rectangle(0, Ypos, largeur_col, hauteur);
e.Graphics.DrawString(listViewCarr.Items[i].SubItems[0].Text, imprFont, imprBrush, tableCase, imprFormat);
e.Graphics.DrawRectangle(stylo, tableCase);
tableCase = new Rectangle(xBase + largeur_col, Ypos, largeur_col, hauteur);
e.Graphics.DrawString(listViewCarr.Items[i].SubItems[1].Text, imprFont, imprBrush, tableCase, imprFormat); e.Graphics.DrawRectangle(stylo, tableCase);
tableCase = new Rectangle(xBase + largeur_col*2, Ypos, t largeur_col, hauteur);
e.Graphics.DrawString(listViewCarr.Items[i].SubItems[2].Text, imprFont, imprBrush, tableCase, imprFormat);
e.Graphics.DrawRectangle(stylo, tableCase);
Ypos += hauteur;
}
le probleme c'est que dans certain cas ma varaible "nb_lignes_txt" n'est pas exacte 1.9... au lieu 2.0124. et il me manque donc une ligne et il coupe, je ne vois pas ou est l'erreur de calcul.
peut etre a cause des blanc qu'il rajoute dans la mise en forme:
"il fait beau ce matin" :21 caractere
il fait beau ce __
matin_________ : 32 caractere.
mais si c est ca comment mesurer la taille du text mise en forme a la fin. :heink:
oximoron
Messages postés149Date d'inscriptionmercredi 23 juillet 2003StatutMembreDernière intervention30 janvier 2009 20 févr. 2008 à 17:50
tu peut être arrondir à l'entier supérieur avec un Math.Ceiling(), moi c'est ce que j'avais fait, il vaut mieux avoir de l'espace perdu que des données perdues. la fonction MeasureString est parfois assez étrange et son fonctionnment obscure.
oximoron
Messages postés149Date d'inscriptionmercredi 23 juillet 2003StatutMembreDernière intervention30 janvier 2009 20 févr. 2008 à 19:31
je chipote un peu mais Math.Ceiling() c est pas pareil que le +1 tout bêtement car si quun reprend ton code c'est sera toute de suite logique que c'est l'entier supérieur et que c'est pas un +1 mis la car sinon ca marhce pas. Imagine je dois débugger ton code : je vois le +1 mais (par ex 2.98 + 1 = 3.98) donc je vais me demander si je dois encore l'arrondir ou pas. Je dis ca parce que j'ai vu du code ou il y a des +2 voir des +3 tu ne sais pas pourquoi. Donc dans le fonctionnement c'est logique, dans le principe c'est moins bon ;)
julienorion666
Messages postés38Date d'inscriptionvendredi 6 juillet 2007StatutMembreDernière intervention24 juin 2008 20 févr. 2008 à 18:39
c est bon j'ai trouve dans un tutoriel.
C est bien les espace qu il rajoute apres ds la cellule
je mesure une chaine elle a une taille x.
quand je la met ds une cellule a cause des saut de lignes qui cree des blanc sa taille va augmenter.
il faut faire comme ceci :
[cpp]
hauteur = (int)e.Graphics.MeasureString(strMax, imprFont, largeur_col).Height;
/cpp strMax : chaine la plus grande des 3.
nb:pour Math.Ceiling() c est pareil que le +1
nb_lignes_txt = (int) (tailleMax / largeur_col) + 1
nb_lignes_txt = (int)Math.Ceiling(tailleMax / largeur_col_max);
c est pareil
julienorion666
Messages postés38Date d'inscriptionvendredi 6 juillet 2007StatutMembreDernière intervention24 juin 2008 20 févr. 2008 à 19:44
faire une division entier avec un plus 1 c est un basique de la programmation, apres c est sur c est bien d avoir des methode qui le fond mais c est pas moin propre.