2015-06-13 52 views
0

我想,当我点击按钮,一个矩形添加到窗体
我可以在形式上油漆我是多么想加入,但我无法通过点击按钮一样矩形添加形状和我搜索这件事,但是我没有找到它的解决方案
在这里有人知道如何做到这一点?如何在点击按钮上绘制矩形?

这是我在表单代码油漆

private void Form1_Paint(object sender, PaintEventArgs e) 
    { 
      locationX = locationX + 20; 
      locationY = locationY + 20; 
      e.Graphics.DrawRectangle(Pens.Black, 
         new Rectangle(10 + locationX, 10 + locationY, 50, 30)); 
    } 

,这一个是我的按钮代码

private void button1_Click(object sender, EventArgs e) 
    { 
     this.Paint += Form1_Paint; 
    } 

但是当我点击按钮,它不工作。为什么它不工作?

+0

您的按钮单击只是添加事件处理程序,它不会导致该事件被触发。 – kidshaw

+1

替换'this。Paint + = Form1_Paint;'by'Invalidate();'确保Paint事件挂钩。 (一旦)。添加越来越多的矩形需要将它们的坐标添加到列表! – TaW

回答

2

线

this.Paint += Form1_Paint; 

副表单的事件Paint你的函数Form1_Paint。 它不会触发它。这是你想要做的事情,只有一次,而不是每次你点击一个按钮。

要触发Paint事件,通常的方法是调用Form类的Invalidate()方法。事实上,Invalidate是一种方法Control。但是从ControlForm衍生物,所以我们有机会获得在Form太方法。

因此引发Windows窗体重绘的正确方法是放置在Load方法订阅:

private void Form1_Load(object sender, EventArgs e) 
{ 
    this.Paint += Form1_Paint; 
} 

在自动生成的代码应该已经被隐藏。 你的方法Form1_Paint没问题。

最后,按钮点击方法应该是:

private void button1_Click(object sender, EventArgs e) 
{ 
    this.Invalidate(); // force Redraw the form 
} 

From the doc

的Invalidate():该失效控制的整个表面和使控制重绘

编辑:

使用这种方法,你可以一次只绘制1矩形,因为整个表面被重新绘制,所以表面被完全地擦除,然后只消耗你的问Form1_Paint方法。

有关如何绘制多个矩形的答案,你应该创建矩形的名单。在每个单击按钮上,您将一个矩形添加到列表中,然后重绘所有矩形。

List<Rectangle> _rectangles = new List<Rectangle>(); 
private void button1_Click(object sender, EventArgs e) 
{ 
    locationX = locationX + 20; 
    locationY = locationY + 20; 
    var rectangle = new Rectangle(locationX, locationY, 50, 30)); 
    this._rectangles.Add(rectangle); 
    this.Invalidate(); // force Redraw the form 
} 

private void Form1_Paint(object sender, PaintEventArgs e) 
{ 
    foreach(var rectangle in this._rectangles) 
    { 
     e.Graphics.DrawRectangle(Pens.Black, rectangle); 
    } 
} 
+0

谢谢,但还有一个问题,现在当我点击按钮它的工作,但它删除了最后的形状,它使我想要的矩形之前点击没有删除,并通过每次点击只给他们一个 – Salmani

+0

你读过我的评论吗?你到底懂不懂呢? – TaW

+0

它的工作原理,非常感谢你,我认为这是从按钮使它的第一个答案;),请投票了我的问题 – Salmani

-1

打电话给你所需要的parenthesys的方法。

private void button1_Click(object sender, EventArgs e) 
{ 
    Form1_Paint(sender, e); 
} 
+2

因为'Paint'需要一个非常特殊的参数,所以这不起作用(也不能编译)。 'Sender' obvioulsy应该__not__按钮,但形式'this'。 __But__'PaintEventArgs'不是你应该尝试'创建'的东西... – TaW