Tracez une ligne sur PictureBox à partir du parent

J’ai un PictureBox comme UserControl . J’ai ajouté ce User Control sur le formulaire principal. Maintenant, je dois appuyer sur un bouton et créer une ligne sur le contrôle utilisateur. Sur mon projet, chaque fois que j’appuie sur ce bouton, je souhaite envoyer à l’utilisateur les parameters de contrôle de deux PointF (x et y) et dessiner une nouvelle ligne, en plus de celle existante. J’ai jusqu’à présent l’événement Paint lorsque picturebox est chargé.

 private void pictureBox1_Paint(object sender, PaintEventArgs e) { Pen graphPen = new Pen(Color.Red, 2); PointF pt1D = new PointF(); PointF pt2D = new PointF(); pt1D.X = 0; pt1D.Y = 10; pt2D.X = 10; pt2D.Y = 10; e.Graphics.DrawLine(graphPen, pt1D, pt2D); } 

En supposant que vous souhaitiez tracer la ligne en cliquant sur le bouton, voici une version modifiée de votre code:

 List points = new List(); Pen graphPen = new Pen(Color.Red, 2); private void btnDrawLines_Click(object sender, EventArgs e) { Graphics g = picBox.CreateGraphics(); PointF pt1D = new PointF(); PointF pt2D = new PointF(); pt1D.X = 0; pt1D.Y = 10; pt2D.X = 10; pt2D.Y = 10; g.DrawLine(graphPen, pt1D, pt2D); points.Add(pt1D); points.Add(pt2D); } private void picBox_Paint(object sender, PaintEventArgs e) { for (int i = 0; i < points.Count; i+=2) e.Graphics.DrawLine(graphPen, points[i], points[i + 1]); } 

Notez que vous pouvez obtenir un object Graphics via la méthode CreateGraphics() la classe PictureBox identique à l'object e.Graphics dans le gestionnaire d'événements Paint .

Si vous ajoutez des lignes à dessiner, vous voulez probablement une petite classe Line :

 public class Line { public Point Point1 { get; set; } public Point Point2 { get; set; } public Line(Point point1, Point point2) { this.Point1 = point1; this.Point2 = point2; } } 

Et puis vous pouvez simplement append ces “lignes” à une liste:

 private List _Lines = new List(); 

et ajoutez-leur et dites au contrôle de mettre à jour son dessin:

 _Lines.Add(new Line(new Point(10, 10), new Point(42, 42))); _Lines.Add(new Line(new Point(20, 40), new Point(20, 60))); pictureBox1.Invalidate() 

puis dans votre dessin:

 private void pictureBox1_Paint(object sender, PaintEventArgs e) { e.Graphics.Clear(Color.White); foreach (Line l in _Lines) { e.Graphics.DrawLine(Pens.Red, l.Point1, l.Point2); } }