Нарисуйте линию на PictureBox от родителя - PullRequest
1 голос
/ 20 января 2012

У меня есть PictureBox как UserControl. Я добавил это User Control в основной форме. Теперь мне нужно нажать кнопку и создать строку на пользовательском элементе управления. В моем проекте, каждый раз, когда я нажимаю эту кнопку, я хочу отправить пользователю контрольные параметры двух PointF (x и y) и нарисовать новую линию, в дополнение к существующей. У меня пока что событие Paint при загрузке Picturebox.

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);
}

Ответы [ 2 ]

1 голос
/ 21 января 2012

Предполагая, что вы хотите нарисовать линию по нажатию кнопки, вот модифицированная версия вашего кода:

List<PointF> points = new List<PointF>();
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]);
}

Обратите внимание, что вы можете получить объект Graphics с помощью метода CreateGraphics() класса PictureBox, который совпадает с объектом e.Graphics в обработчике событий Paint.

0 голосов
/ 21 января 2012

Если вы добавляете линии для рисования, вы, вероятно, захотите немного Line class:

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;
  }
}

И тогда вы можете просто добавить эти «строки» в список:

private List<Line> _Lines = new List<Line>();

и добавьте к ним и сообщите элементу управления, чтобы он обновил чертеж:

_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()

затем на вашем рисунке:

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);
  }
}
...