【问题标题】:How to draw a rectangle on a button click?如何在单击按钮时绘制矩形?
【发布时间】:2015-06-13 19:42:01
【问题描述】:

我想当我点击按钮时,在表单中添加一个矩形
我可以在表单中添加我想要多少,但我无法通过单击按钮添加矩形等形状,我搜索了它,但我没有找到解决方案
有人知道怎么做吗?

这是我的表单绘制代码

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

但是当我单击按钮时它不起作用。为什么它不工作?

【问题讨论】:

  • 您的按钮单击只是添加了一个事件处理程序,它不会导致该事件被触发。
  • 将this.Paint += Form1_Paint; 替换为Invalidate(); 确保已连接Paint 事件。 (一次)。要添加越来越多的 Rectangles 需要将它们的坐标添加到 List!

标签: c# winforms events drawing


【解决方案1】:

线

 this.Paint += Form1_Paint;

将您的表单的事件Paint 与您的函数Form1_Paint 相关联。 它不会触发它。这是您只想执行 1 次的操作,而不是每次按下按钮时执行的操作。

要触发Paint事件,通常的方法是调用Form类的Invalidate()方法。实际上,Invalidate 是Control 的一个方法。但是Form派生自Control,所以我们也可以访问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() :使控件的整个表面无效并导致控件被重绘。

编辑:

使用此方法,您一次只能绘制一个矩形,因为整个表面被重新绘制,所以表面被完全擦除,然后它只绘制您在 Form1_Paint 方法中询问的内容。

关于如何绘制多个矩形的答案,您应该创建一个矩形列表。在每次单击按钮时,都会向列表中添加一个 Rectangle,然后重绘所有矩形。

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

【讨论】:

  • 谢谢,但还有一个问题,现在当我单击按钮时它可以工作,但它会删除它制作的最后一个形状跨度>
  • 它成功了,非常感谢你,我认为这是从按钮制作它的第一个答案;)请投票支持我的问题
【解决方案2】:

要调用一个方法,你需要括号。

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

【讨论】:

  • 这不起作用(也不编译),因为Paint 需要一个非常特殊的参数。 Sender obvioulsy 应该是 not 按钮,而是 this 的形式。 但是 PaintEventArgs 不是你应该尝试“创造”的东西......
猜你喜欢
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多