2010-11-15 130 views
1

我正在试图制作一个程序,它将使用鼠标单击鼠标点击线条的位置来绘制线条。这是我目前的代码:在C中使用鼠标点击画框上的线条画线#

public partial class Form1 : Form 
{ 
    int Drawshape; 

    private Point p1, p2; 
    List<Point> p1List = new List<Point>(); 
    List<Point> p2List = new List<Point>(); 

    public Form1() 
    { 
     InitializeComponent(); 
     pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Drawshape = 1; 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     Drawshape = 2; 
    } 

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (Drawshape == 1) 
     { 
      if (p1.X == 0) 
      { 
       p1.X = e.X; 
       p1.Y = e.Y; 
      } 
      else 
      { 
       p2.X = e.X; 
       p2.Y = e.Y; 

       p1List.Add(p1); 
       p2List.Add(p2); 

       Invalidate(); 
       p1.X = 0; 
      } 
     } 
    } 

    private void pictureBox1_Paint(object sender, PaintEventArgs e) 
    { 
     Graphics G = Graphics.FromImage(pictureBox1.Image); 
     if (Drawshape == 1) 
     { 
      using (var p = new Pen(Color.Blue, 4)) 
      { 
       for (int x = 0; x < p1List.Count; x++) 
       { 
        G.DrawLine(p, p1List[x], p2List[x]); 
       } 
      } 
     } 
    } 

目前它不允许我在绘图箱上绘图。这怎么可能?

回答

5

变化Invalidate();pictureBox1.Invalidate();

+0

而且您还需要创建一个鼠标移动处理程序并调用pictureBox1.Invalidate();以便您的图纸反馈即时。 – 2010-11-15 18:45:42

0

您需要在创建线条后在Image对象上绘制每条线(使用Graphics.FromImage)。

您还需要将Graphics对象置于using块中。

+0

,我没有做过graphics.fromimage在我的代码,还是我写了错了吗?此外,我需要在我的代码中处理图形? – 2010-11-15 18:26:16

+0

完成后应该处理图形。您不应该在绘画事件中绘制图像;你应该提前画一次。您可能还需要刷新()PictureBox。如果你想这样做,你应该直接在没有PictureBox或Bitmap的'Panel'(在Paint事件中)绘制。 – SLaks 2010-11-15 18:33:15

+0

问题是我需要在一个picturebox上做这件事,所以我需要让它在它上面工作。也正是在我现在的代码中,我应该把picturebox1.refresh()和picturebox1.dispose()?谢谢 – 2010-11-15 18:40:02