[ C# - Débutant] Dessiner des lignes

Dessiner des lignes [ C# - Débutant] - C#/.NET managed - Programmation

Marsh Posté le 03-05-2007 à 11:12:27    

Bonjour,  
 
je cherche a faire un petit programme permettant de tracer des lignes droites,  
en cliquant une fois pour le point de départ, et une deuxième fois pour le point de fin.
 
j'ai compris que je devais mettre les points dans une array
 

Code :
  1. private ArrayList points = new ArrayList();
  2. Pen pen = new Pen( Color.Black );
  3. private void panel1_MouseDown( object sender, MouseEventArgs e )
  4. {
  5. points.Add( new Point( e.X, e.Y ) );
  6. panel1.Invalidate();
  7. }
  8. private void panel1_Paint( object sender, PaintEventArgs e )
  9. {
  10. Graphics graphicsObject = e.Graphics;
  11. ???
  12. ???
  13. graphicsObject.DrawLine( pen, ???, ??? )
  14. }


 
Si quelqu'un peut m'aider... Ce serait vraiment sympa :)
 
Jérôme


Message édité par jeromeke le 03-05-2007 à 11:13:15
Reply

Marsh Posté le 03-05-2007 à 11:12:27   

Reply

Marsh Posté le 03-05-2007 à 20:39:15    

en fait les deux paramètres que tu as besoins, c'est ceux que tu as dans ton arrayList
 
private void panel1_Paint( object sender, PaintEventArgs e )
{
    Graphics graphicsObject = e.Graphics;  
 
    if (points != null && points.count == 2)
    {
       graphicsObject.DrawLine( pen,  (Point)points[0],  (Point)points[1] );
    }
}


Message édité par moi23372 le 03-05-2007 à 20:41:01
Reply

Marsh Posté le 08-05-2007 à 00:23:38    

Merci, j'ai réussi à tracer des traits,
mais j'ai un problème: quand je trace un nouveau trait il efface le précédent...
Quelqu'un à la solution?
 

Code :
  1. // lijst van coördinaten
  2.         private ArrayList points = new ArrayList();
  3.         private int teller = 0;
  4.         private int i = 0;
  5.         // pen instellen
  6.         Pen pen = new Pen(Color.DarkBlue);
  7.         // method drawPanel_MouseDown: teller + 1 & coördinaat wordt opgeslaan
  8.         private void drawPanel_MouseDown(object sender, MouseEventArgs e)
  9.         {
  10.             teller++;
  11.             points.Add(new Point(e.X, e.Y));
  12.             drawPanel.Invalidate(); // refresh panel
  13.         } // einde method drawPanel_MouseDown
  14.         // method drawPanel_Paint
  15.         private void drawPanel_Paint(object sender, PaintEventArgs e)
  16.         {
  17.             // indien 2 punten wordt de figuur getoond
  18.             if (teller == 2)
  19.             {
  20.                 // get graphics object for panel
  21.                 Graphics graphicsObject = e.Graphics;
  22.                 graphicsObject.DrawLine(pen, (Point)points[i], (Point)points[i + 1]);
  23.                 i = i + 2;
  24.                 teller = 0;
  25.             } // einde if
  26.         } // einde method drawPanel_Paint


 
Jérôme

Reply

Marsh Posté le 08-05-2007 à 01:16:37    

  drawPanel.Invalidate(); // refresh panel
-> Tu actualise ton drawPanel donc ça t'efface ce que tu avais déjà dessiné dessus.

Reply

Marsh Posté le 08-05-2007 à 08:40:44    

Bonjour, quand je supprime drawPanel.Invalidate(); il n'affiche plus rien,
une idée?

Reply

Marsh Posté le 08-05-2007 à 13:47:33    

Je me suis mal exprimé.
 
La méthode invalidate provoque l'évènement OnPaint (qui redessine ton control).
 
Voila ce que fait ton code :
A chaque clique tu déclanche le OnPaint
Quand teller = 2 , le Onpaint efface ce que tu vais dessiné et  dessine uniquement une ligne avec les 2 derniers points
Mais quand ta valeur teller ne vaut pas 2, Onpaint efface ce qu'il y avais dessus mais sans rien dessiné.
 

Reply

Marsh Posté le 08-05-2007 à 17:19:52    

Merci beaucoup pour ton aide archimed,
je comprends maintenant le problème,
mais le livre que j'ai ( Deitel - C# for programmers ) n'offre malheureusement pas de solution au problème :-(
Lorsque je mets la method Invalidate sous le if, plus rien ne s'affiche...
Connaitrais-tu la solution?
 

Reply

Marsh Posté le 08-05-2007 à 18:50:28    

Ca dépend de ce que tu veux faire.
 
Si tu veux dessiner tout les lignes avec un point en commun (ligne1 a pour coordonée (point1,point2) ligne2(point2,point3)  ...  )
Dans ton OnPaint tu peux faire :
 

Code :
  1. if (teller >0)
  2.             {
  3.                 for (int index = 0; index < i; index++)
  4.                 {
  5.                     Graphics graphicsObject = e.Graphics;
  6.                     graphicsObject.DrawLine(pen, (Point)points[index], (Point)points[index + 1]);
  7.                 }
  8.              
  9.                 i = i + 1;
  10.               //teller = 0;
  11.             }


 
ou sinon tu peux faire (ligne1 a pour coordonée (point1,point2) ligne2(point3,point4)  ...  ):
 
 

Code :
  1. if (teller >0)
  2.             {
  3.                 for (int index = 0; index < i; index++)
  4.                 {
  5.                     Graphics graphicsObject = e.Graphics;
  6.                     graphicsObject.DrawLine(pen, (Point)points[index], (Point)points[index + 1]);
  7.                     index++;
  8.                 }
  9.              
  10.                 i = i + 1;
  11.               //teller = 0;
  12.             }


 
 
Sachant que ton code peux être simplifié, teller et i ne serve en réalité à rien le code complet :  
 

Code :
  1. private System.Collections.ArrayList points = new System.Collections.ArrayList();
  2. Pen pen = new Pen(Color.DarkBlue);
  3.         private void drawPanel_Paint(object sender, PaintEventArgs e)
  4.         {
  5.             if (points.Count > 1)
  6.             {
  7.                 for (int index = 0; index < points.Count - 1; index++)
  8.                 {
  9.                     Graphics graphicsObject = e.Graphics;
  10.                     graphicsObject.DrawLine(pen, (Point)points[index], (Point)points[index + 1]);
  11.                     //index++;
  12.                 }
  13.             }
  14.         }
  15.         private void drawPanel_MouseDown(object sender, MouseEventArgs e)
  16.         {
  17.             points.Add(new Point(e.X, e.Y));
  18.             this.Invalidate();
  19.         }

Reply

Marsh Posté le 08-05-2007 à 19:10:13    

Je ne sais comment te remercier archimed,
merci beaucoup pour ton aide et pour ton temps...
Si je peux t'aider (programmes graphiques) tu me contactes :)
 
Jérôme

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed