Visual Studio 如何在C#中通过按钮单击事件在窗体上绘图?

ix0qys7i  于 2023-03-19  发布在  C#
关注(0)|答案(2)|浏览(301)

我是C#新手,正在尝试弄清楚如何使用按钮单击事件绘制窗体。我知道绘制事件处理程序所需的参数是PaintEventArgs,而按钮单击事件处理程序传递EventArgs
如何通过单击按钮来绘制窗体?这一切都是在Visual Studio 2022中完成的

5us2dqdw

5us2dqdw1#

下面是一个在窗体单击时画图的最小示例:

void Main()
{
    var form1 = new Form1();
    form1.Show();
}

public class Form1 : Form
{
    public Form1()
    {
        var colour = System.Drawing.Color.Black;
        
        this.Click += (s, e) =>
        {
            colour = System.Drawing.Color.Red;
            this.Invalidate();
        };
        
        this.Paint += (s, e) =>
        {
            using var pen = new System.Drawing.Pen(colour);
            e.Graphics.DrawLine(pen, 0, 0, 10, 20);
        };
    }
}

如果线从黑色变为红色点击然后它的工作。

lg40wkob

lg40wkob2#

你不能。
按钮单击事件无法启动绘制事件。通常,您可以使用.Invalidate()方法告诉系统下次需要重新绘制窗体。按钮单击必须更改“绘制内容”的效果,但不能更改“绘制时间”的效果。
下面是一个如何在表单上绘图的示例。每次按下按钮,就会有一个随机点添加到点列表中。

然后,系统决定何时绘制窗体,在列表中添加新点后,您可以在可能的情况下强制重新绘制。

public partial class Form1 : Form
    {
        readonly static Random rng = new Random();
        readonly List<Point> pointList;

        public Form1()
        {
            InitializeComponent();

            pointList = new List<Point>();

            this.Paint += Form1_Paint;
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

            // Connect points with lines
            if (pointList.Count >= 2)
            {
                e.Graphics.DrawLines(Pens.Red, pointList.ToArray());
            }

            // Add a small square at each point
            foreach (var point in pointList)
            {
                e.Graphics.DrawRectangle(Pens.Black,
                    point.X - 2, point.Y - 2, 4, 4);
            }
            
        }

        private void drawButton_Click(object sender, EventArgs e)
        {
            // Adds a random point on the list
            pointList.Add(new Point(
                rng.Next(this.ClientSize.Width),
                rng.Next(this.ClientSize.Height)));

            this.Invalidate();
        }
    }

还有.Refresh(),它会立即强制重绘,但通常不需要。
准确地说,你可以,但你不应该。下面的代码将触发和绘制事件,而不是调用.Invalidate()

Graphics g = this.CreateGraphics();
    OnPaint(new PaintEventArgs(g, ClientRectangle));

最终效果是相同的,只是现在您正在扰乱Windows任务调度和UI事件的处理。

相关问题