0

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

我正在用 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 in place 只是一个占位符,显然这不起作用。

任何和所有的帮助表示赞赏。

4

2 回答 2

1

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

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

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

于 2016-12-21T21:56:58.450 回答
0

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

要开始绘制 UserControl,请调用 Refresh 方法或 InvalidateRectangle 方法 - 两者都将触发 OnPaint 方法。

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

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

}
于 2016-12-21T21:59:54.550 回答