无法在循环中绘制到pictureBox

时间:2010-12-23 08:43:28

标签: c#

我有List<Point>,其中Point包含X和Y。

我想要的是循环一个这样的列表并画一个点到点,我这样做:

foreach (List<Point> wps in map.waypoints)
{
  System.Drawing.Pen myPen;
  myPen = new System.Drawing.Pen(System.Drawing.Color.Black);
  System.Drawing.Graphics formGraphics = this.pictureBox1.CreateGraphics();

  Point startPos = new Point(wps[0].X, wps[0].Y);

  foreach (Point p in wps)
  {
    formGraphics.DrawLine(myPen, startPos.X, startPos.Y, p.X, p.Y);
    startPos = p;
  }

  myPen.Dispose();
  formGraphics.Dispose();
}

但没有得到任何东西!我对pict​​ureBox的on_click事件做了同样的事情,但是如果循环一些Points我只使用鼠标X和Y.我已经验证了他们不包含rubish的点列表:D

2 个答案:

答案 0 :(得分:5)

在paint事件中编写代码,以便它会引用。 picturebox.Invalidate()将调用Paint()。

     private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
       Pen pen = new Pen(Color.AliceBlue);
        PointF p = new PointF();
     e.Graphics.DrawLine(pen,p.X,p.Y);

    }

它适合您的代码

      private void pictureBox1_Paint(object sender, PaintEventArgs e) 
   { 
         System.Drawing.Pen myPen; 
            myPen = new System.Drawing.Pen(System.Drawing.Color.Black);
        foreach (List<Point> wps in map.waypoints)
        {  
            Point startPos = new Point(wps[0].X, wps[0].Y);  
            foreach (Point p in wps)  
            {      
                e.Graphics.DrawLine(myPen, startPos.X, startPos.Y, p.X, p.Y);
                startPos = p;  
            }   
        } 
}

如果你想在某个功能中画线

       public void DoFunction()
       { 
         .....
         .....
         pictureBox1.Invalidate() /* here automatic call to pictureBox1_Paint(object sender, PaintEventArgs e) */

         . . . . 

         } 

得到了吗?

答案 1 :(得分:1)

不要忘记调用pictureBox1.Invalidate()或pictureBox1.Refresh(),以确保调用paint事件。