单击按钮时调用涉及 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
事件处理程序中的 Form
或 PictureBox
上绘图,或者创建 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
事件处理程序,并将您带到表单代码文件中新添加的方法。使用名为 e
的 PaintEventArgs
对象进行绘图。然后,如果您需要更改某些按钮单击时绘制的内容,请在您的单击处理程序中更改确定绘制内容的数据(例如,游戏块的位置和颜色),完成后,调用 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);
}
抱歉,如果之前有人问过这个问题。
我正在使用 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
事件处理程序中的 Form
或 PictureBox
上绘图,或者创建 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
事件处理程序,并将您带到表单代码文件中新添加的方法。使用名为 e
的 PaintEventArgs
对象进行绘图。然后,如果您需要更改某些按钮单击时绘制的内容,请在您的单击处理程序中更改确定绘制内容的数据(例如,游戏块的位置和颜色),完成后,调用 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);
}