单击按钮时调用涉及 PaintEventArgs 的函数

Calling a function that involves PaintEventArgs when a button is clicked

抱歉,如果之前有人问过这个问题。

我正在使用 C# windows 表单开发一个简单的 connect 4 游戏,因为我之前没有做过任何涉及图形的工作。为此,我需要程序在按下按钮时绘制圆圈,但我不知道如何调用该函数来执行此操作。

public void printToken(PaintEventArgs pe, int x)
    {
        Graphics g = pe.Graphics;
        Pen blue = new Pen(Color.Blue);
        Pen red = new Pen(Color.Red);

        Rectangle rect = new Rectangle(50 + ((x-1) * 100), 50, 50, 50);
        g.DrawEllipse(blue, rect);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        printToken(null, 1);
    }

null 只是一个占位符,显然它不起作用。

感谢任何帮助。

通常在要进行自定义绘图的 Windows Forms 应用程序中,您可以直接在 Paint 事件处理程序中的 FormPictureBox 上绘图,或者创建 Control 的子类,您可以在其中覆盖 OnPaint 方法。在 Paint 事件处理程序或 OnPaint 中,您绘制 所有内容 (即不只是一个圆圈,而是所有圆圈)。然后,当您的底层数据结构发生变化时,表明您需要重绘,您在控件上调用 Invalidate(),将其标记为需要重绘,并在下一次通过事件循环时,您的 Paint 事件处理程序将 运行 或您的 OnPaint 方法将被调用。在该方法中,您将拥有 PaintEventArgs 对象,您需要获得 Graphics 对象来进行绘图。您不想 "draw once and forget" (例如,当单击按钮时),因为有各种各样的事情会导致您的控件需要重新绘制自身。有关详细信息,请参阅 this question and answer

编辑: 这是对您评论的回应。 (这将是一个评论,但它太长了。)

如果我暂时假设您在 Visual Studio 的 Windows Forms Designer 中从空白 Form 开始,那么最快捷的方法就是select Form,然后在 VS 的“属性”窗格中,单击闪电工具栏按钮以查看窗体的事件。向下滚动到 Paint 事件并双击标签右侧空白 space 中的任意位置。这将为表单连接一个 Paint 事件处理程序,并将您带到表单代码文件中新添加的方法。使用名为 ePaintEventArgs 对象进行绘图。然后,如果您需要更改某些按钮单击时绘制的内容,请在您的单击处理程序中更改确定绘制内容的数据(例如,游戏块的位置和颜色),完成后,调用 Invalidate().

如果您将表示单个芯片的 UserControl 添加到您的窗体,并重写 OnPaint 方法并将着色代码放入该事件,那么当触发 Paint 事件时,Graphics 对象将不会为 null。

要启动 UserControl 的绘制,调用 Refresh 方法或 InvalidateRectangle 方法 - 两者都将触发 OnPaint 方法。

确保首先调用 OnPaint 的 class 层次结构,以确保首先绘制对象的背景:

protected override void OnPaint(PaintEventArgs e) {
    base.OnPaint(e);
    Graphics g = e.Graphics;
        Pen blue = new Pen(Color.Blue);
        Pen red = new Pen(Color.Red);
        Rectangle rect = new Rectangle(50 + ((x-1) * 100), 50, 50, 50);
        g.DrawEllipse(blue, rect);

}