2016-12-21 113 views
0

对不起,如果这已被问到。单击按钮时调用涉及PaintEventArgs的函数

我在C#Windows窗体一个简单连接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就位只是一个占位符,显然不起作用。

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

+0

您需要处理**的paint()**事件无论您想要控制什么样的控制,并使用通过'e.Graphics'参数在该事件中提供给您的图形。您可以存储关于在Class级别绘制什么的信息,然后通过调用其Refresh()方法强制控件绘制自己。 –

+0

您必须使用容器或表单的Paint事件,并使用由此提供的Graphic对象。要更新图形,只需在容器上调用Invalidate()。在绘画事件本身中,您只需绘制事物的当前状态,因此如果需要绘制令牌,则变量或列表需要该信息。 – LarsTech

+0

我有点理解你在说什么,但我不知道我是如何将它全部实现到代码中的。我对这种类型的东西很陌生。 –

回答

1

通常,在Windows窗体,你想要做自定义绘图应用程序,无论是在Paint事件处理程序直接画上一个FormPictureBox或创建您覆盖OnPaint方法Control一个子类。在Paint事件处理程序或OnPaint,你画一切(即不只是一个圈子,但所有的圆圈)。那么当你的基础数据结构的变化,表明你需要一个重绘,你叫Invalidate()上的控制,其标记为需要重绘,并于下一次通过事件循环,你Paint事件处理程序将运行或者你OnPaint方法叫做。在该方法中,您将获得需要获取Graphics对象的PaintEventArgs对象,以便执行绘制。你不想“画一次又忘记”(例如,当点击一个按钮时),因为有各种各样的事情可能导致你的控件需要重新绘制自己。有关更多详情,请参阅this question and answer

编辑:这里的一些手把手响应您的评论。 (这将是一个评论,但它太长了。)

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

+0

我不知道如何将这个实现到我当前的代码中,我对这个东西有点小气。 –

+0

我用一个快速教程扩展了我的答案。 – adv12

+0

明白了!感谢您的帮助,您链接的其他页面也非常有用。 –

0

如果添加代表单个芯片的形式的用户控件,并重写OnPaint方法,把着色代码到该事件,那么Graphics对象将不能为空当涂料事件触发。

揭开序幕的用户控件的油漆,或者调用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); 

}