C# 在按钮上绘制形状并单击

C# 在按钮上绘制形状并单击,c#,gdi+,C#,Gdi+,我创建了一个Windows窗体应用程序,并希望在单击按钮时绘制一个形状。 如何在按钮单击事件上调用Form_Paint?下面是一个快速示例,它将每个“形状”作为图形存储在类级列表中。使用表单的Paint()事件中提供的图形绘制每个路径。每次单击按钮都会向列表中添加一个随机矩形,并对表单调用Refresh(),以强制表单重新绘制自身: public partial class Form1 : Form { public Form1() { InitializeCo

我创建了一个Windows窗体应用程序,并希望在单击按钮时绘制一个形状。
如何在按钮单击事件上调用Form_Paint?

下面是一个快速示例,它将每个“形状”作为图形存储在类级列表中。使用表单的Paint()事件中提供的图形绘制每个路径。每次单击按钮都会向列表中添加一个随机矩形,并对表单调用Refresh(),以强制表单重新绘制自身:

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
        this.Paint += new PaintEventHandler(Form1_Paint);
    }

    private Random R = new Random();
    private List<System.Drawing.Drawing2D.GraphicsPath> Paths = new List<System.Drawing.Drawing2D.GraphicsPath>();

    private void button1_Click(object sender, EventArgs e)
    {
        Point pt1 = new Point(R.Next(this.Width), R.Next(this.Height));
        Point pt2 = new Point(R.Next(this.Width), R.Next(this.Height));

        System.Drawing.Drawing2D.GraphicsPath shape = new System.Drawing.Drawing2D.GraphicsPath();
        shape.AddRectangle(new Rectangle(new Point(Math.Min(pt1.X,pt2.X), Math.Min(pt1.Y, pt2.Y)), new Size(Math.Abs(pt2.X - pt1.X), Math.Abs(pt2.Y - pt1.Y))));
        Paths.Add(shape);

        this.Refresh();
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        Graphics G = e.Graphics;
        foreach (System.Drawing.Drawing2D.GraphicsPath Path in Paths)
        {
            G.DrawPath(Pens.Black, Path);
        }
    }

}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
this.Paint+=新的PaintEventHandler(Form1_Paint);
}
私有随机R=新随机();
私有列表路径=新列表();
私有无效按钮1\u单击(对象发送者,事件参数e)
{
点pt1=新点(R.Next(此宽度)、R.Next(此高度));
点pt2=新点(R.Next(此宽度)、R.Next(此高度));
System.Drawing.Drawing2D.GraphicsPath shape=新的System.Drawing.Drawing2D.GraphicsPath();
AddRectangle(新矩形(新点(Math.Min(pt1.X,pt2.X),Math.Min(pt1.Y,pt2.Y)),新大小(Math.Abs(pt2.X-pt1.X),Math.Abs(pt2.Y-pt1.Y));
路径。添加(形状);
这个。刷新();
}
私有void Form1_Paint(对象发送器、PaintEventArgs e)
{
图形G=e.图形;
foreach(System.Drawing.Drawing2D.GraphicsPath路径中的路径)
{
G.绘图路径(钢笔、黑色、路径);
}
}
}

要手动提升油漆,请阅读本文(基本上称为Invalidate()方法)

但是,您可能需要有某种内部“drawshape”标志,您可以在单击按钮并检查paint偶数处理程序方法内部时设置/清除该标志。此标志将通知绘制事件处理程序继续绘制形状或根本不绘制形状(每次调用表单绘制时)