【问题标题】:Draw a line on PictureBox from parent从父级在 PictureBox 上画一条线
【发布时间】:2013-05-13 04:59:20
【问题描述】:

我有一个PictureBox 作为UserControl。我在主窗体上添加了这个User Control。现在我必须按下一个按钮并在用户控件上创建一条线。在我的项目中,每次按下此按钮时,我想向用户发送两个 PointF(x 和 y) 的控制参数,并在现有的基础上绘制一条新线。到目前为止,当图片框加载时,我有 Paint 事件。

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

【问题讨论】:

    标签: c# winforms picturebox


    【解决方案1】:

    假设您想在单击按钮时画线,这里是您的代码的修改版本:

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

    请注意,您可以通过PictureBox 类的CreateGraphics() 方法获取Graphics 对象,该方法与Paint 事件处理程序中的e.Graphics 对象相同。

    【讨论】:

    • CreateGraphicse.Graphics 并不完全相同。如果用户最小化并恢复表单,您的版本将不会保留绘图。
    • 我会同意你的一半。在任何强制窗体或图片框重绘的事件之后,所绘制的所有内容都会消失,但 CreateGraphics 和 e.Graphics 返回相同 Graphics 类的实例。在 Paint 处理程序中所做的更改会持续存在,因为它在每次重绘后被调用。需要做的是保留在 Click 处理程序中绘制的线条并在 Paint 中重新绘制它们。我将更新我的问题以至少保存更改。
    • 谢谢,看起来没问题。请注意,我需要在主窗体上按一个按钮,图片框位于用户控件中。我希望能够向该方法发送参数(x,y,linecolor等)并根据这些参数绘制线条
    • 你需要的似乎是一个 drawLineSegment(p1, p2, linecolor, g) 方法,其中 p1 和 p2 是点,g 是一个图形对象,你应该能够像这样检索:图形 g = userControl.pictureBox.CreateGraphics()。然后您需要在点列表中保留 p1 和 p2。 Paint 处理程序将保持我在响应中指定的方式。
    • 不客气。看看@LarsTech 解释的 Line 类的想法,它应该可以更容易地构建你正在构建的任何东西:)。
    【解决方案2】:

    如果您要添加要绘制的线条,您可能需要一点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;
      }
    }
    

    然后您可以将这些“行”添加到列表中:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      相关资源
      最近更新 更多