Nombre de ligne sur le graphics

Signaler
Messages postés
48
Date d'inscription
lundi 23 février 2009
Statut
Membre
Dernière intervention
30 avril 2009
-
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
-
Salut tout le monde,
je travaille sur le graphics. dans mon form j'ai plusieurs textBox qui sont crées dynamiquent en choisissant un numero.
mon but est de dessiner ses chaines de caractères dans une panel avec drawstring. aprés chaque textBox.text je doit dessiner un rectangle.
mais je ne sait pas qu'elles sont les cordonnées de chaque rectangle.
il faut de calculer le nombre de ligne sur le graphics pour chaque chaine de caractère.
je suis essayer avec :
for (int i = epreuve.getNbq() - 1; i >= 0; i--)
{

g.DrawString("Question" + (i - 1) + " :" + epreuve.getQuestion()[i], new Font(FontFamily.GenericMonospace, 8), Brushes.Black, new Rectangle(30,110, panel1.Width / 2 - 25, panel1.Height));
Font myFont = new Font(FontFamily.GenericMonospace, 8);
float y =g.MeasureString(epreuve.getQuestion()[i], myFont).Width;
SolidBrush p = new SolidBrush(Color.Black);
g.DrawRectangle(new Pen(p), new Rectangle(new Point(40,(int)y*50), new Size(10,10)));
}
mais ça ne me donne pas de résultat .
S.V.P
pouvez vous m'aidez?
merci d'avance

1 réponse

Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
32
Bonjour Fayrous

je n'ai toujours pas bien compris ce que tu cherche à faire,
mais voici un example de code.
il est supposé avoir 4 TextBox, un panel et un bouton.
Le panel est ancré sur la forme pour suivre ses dimentions :// <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>

// panel1

//

this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)

                                                               | System.Windows.Forms.AnchorStyles.Left)

                                                               | System.Windows.Forms.AnchorStyles.Right)));

this.panel1.Location = new System.Drawing.Point(280, 0);

this.panel1.Name = "panel1";

this.panel1.Size = new System.Drawing.Size(200, 280);

this.panel1.TabIndex = 0;

this.panel1.Resize += new System.EventHandler(this.panel1_Resize);

this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint);

Les TextBox n'ont rien de particulier

le principe:

le panel est dessiné manuellement (evenement paint) on récupere les chaines on calcul les tailles et on dessine
on dessine aussi un rectanlge autour des chaines
on calcul la position verticale du prochaine traçage.

L'action Paint doit être appelée si la taille du panel à changée, et si les textBox ont changées, dans l'exemple j'utilise le bouton1 pour simuler le changement.
j'ai utilisé un tableau pour les textbox, ceci pour simuler ton exemple.

tu peux vérifier que si la taille de la forme change, les textes sont redessinés en fonction de la nouvelle taille du panel.

J'espere que tu vas trouver ce qu'il te faut.

///<summary>

/// The main entry point for the application.

///</summary>

[STAThread]
staticvoid<?xml:namespace prefix st1 ns "urn:schemas-microsoft-com:office:smarttags" /??><st1:place w:st="on">Main</st1:place>()

{

                Application.Run(new Form1());

}

 

TextBox[] myTextBoxArray=new TextBox[4];

privatevoid Form1_Load(object sender, System.EventArgs e)

{

                myTextBoxArray[0]=textBox1;

                myTextBoxArray[1]=textBox2;

                myTextBoxArray[2]=textBox3;

                myTextBoxArray[3]=textBox4;

                textBox1.Text="Ceci est la question numéro 1";

                textBox2.Text="Ceci est la question numéro 2";

                textBox3.Text="Ceci est la question numéro 3";

                textBox4.Text="Ceci est la question numéro 4";

 

}

privatevoid button1_Click(object sender, System.EventArgs e)

{

                // force le rafraichissement du panel

panel1.Invalidate();



privatevoid panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)

{

                Graphics g=e.Graphics;

                Font myFont = new Font(FontFamily.GenericMonospace, 8);

 

                // Ecrire la chaine au plus prés du rectangle

                StringFormat stringFormat=new StringFormat();

                stringFormat.Alignment=StringAlignment.Near;

                stringFormat.LineAlignment=StringAlignment.Near;

 

                float yPos=0; //position vertical des rectangles graphic, on commence à 0

                for (int i=0; i< myTextBoxArray.Length; i++)

                {

                               string StringToDraw = string.Format("Question {0} : {1}",i,myTextBoxArray[i].Text);

// I dentification de la hauteur de la chaine avec une longueur donnée max (largeur du panel)

SizeF size =g.MeasureString(StringToDraw, myFont,panel1.Width,stringFormat);

                              

                               // traçage de la chaine dans son rectangle

                               g.DrawString(StringToDraw,

                                               myFont,

                                               Brushes.Black,

                                               new RectangleF(2,yPos+2,size.Width,size.Height));

                               // traçage d’un rectangle

                               g.DrawRectangle(Pens.Black,0,yPos,size.Width+4,size.Height+4);

                               yPos += size.Height+6; // prochaine position verticale

                }

}

privatevoid panel1_Resize(object sender, System.EventArgs e)

{

                // force le rafraichissement du panel

                panel1.Invalidate();

}

C# is amazing, enjoy it!