线
this.Paint += Form1_Paint;
副表单的事件Paint
你的函数Form1_Paint。 它不会触发它。这是你想要做的事情,只有一次,而不是每次你点击一个按钮。
要触发Paint
事件,通常的方法是调用Form
类的Invalidate()
方法。事实上,Invalidate是一种方法Control。但是从Control
Form
衍生物,所以我们有机会获得在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);
}
}
您的按钮单击只是添加事件处理程序,它不会导致该事件被触发。 – kidshaw
替换'this。Paint + = Form1_Paint;'by'Invalidate();'确保Paint事件挂钩。 (一旦)。添加越来越多的矩形需要将它们的坐标添加到列表! –
TaW