【问题标题】:Calling a function that involves PaintEventArgs when a button is clicked单击按钮时调用涉及 PaintEventArgs 的函数
【发布时间】:2017-05-07 10:44:12
【问题描述】:

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

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

感谢任何和所有的帮助。

【问题讨论】:

  • 您需要处理要在其上绘制的任何控件的 Paint() 事件,并使用在该事件中通过e.Graphics 参数提供给您的图形。您可以在 Class 级别存储有关要绘制的内容的信息,然后通过调用其 Refresh() 方法强制控件绘制自身。
  • 您必须使用容器或表单的 Paint 事件,并使用从中提供的 Graphic 对象。要更新绘图,您只需在容器上调用 Invalidate()。在绘制事件本身中,您只需绘制事物的当前状态,因此如果您需要绘制标记,则您的变量或列表需要该信息。
  • 我有点理解你们在说什么,但我不知道我打算如何将它全部实现到代码中。我对这种类型的东西很陌生。

标签: c# winforms drawing2d


【解决方案1】:

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

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

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

【讨论】:

  • 我不确定如何在我当前的代码中实现这一点,我对这些东西有点菜鸟。
  • 我已经通过快速教程扩展了我的答案。
  • 知道了!感谢您的帮助,您链接的其他页面也非常有用。
【解决方案2】:

如果您将表示单个芯片的 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);

}

【讨论】:

    猜你喜欢
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 2019-10-04
    相关资源
    最近更新 更多