如何在C#中使用OnPaint事件?

5
我看到网站上有一些类似的问题,但它们都没有真正帮助我。
当用户在一些文本框中输入值时,我有一个函数,当点击按钮时,在表单上绘制几条线,这些线的形状会变化。
我的问题是,当我最小化表单时,这些线就消失了,我知道可以通过使用OnPaint事件来解决这个问题,但我不太理解如何做到。
有人能给我一个简单的例子,说明如何使用一个函数在按下按钮时使用OnPaint事件绘制一些东西吗?
2个回答

6

这里是一个简单的 MSDN 用户自绘控件教程。

您必须继承 Button 类并重写 OnPaint 方法。

代码示例:

protected override void OnPaint(PaintEventArgs pe)
{
   // Call the OnPaint method of the base class.
   base.OnPaint(pe);

   // Declare and instantiate a new pen.
   System.Drawing.Pen myPen = new System.Drawing.Pen(Color.Aqua);

   // Draw an aqua rectangle in the rectangle represented by the control.
   pe.Graphics.DrawRectangle(myPen, new Rectangle(this.Location, 
      this.Size));
}

编辑:

在你的类中添加属性,例如public Color MyFancyTextColor {get;set;},并在OnPaint方法中使用它。这样它也会出现在Visual Studio表单设计器的控件属性编辑器中。


但是如果我这样做,并将我的绘图函数放在OnPaint方法中,我如何从表单传递函数参数的值? - Stefan Manciu
好的,我做到了,但我仍然有一个问题:每次鼠标光标悬停在按钮上时,都会调用OnPaint方法。我该如何使其忽略按钮? - Stefan Manciu

3

您可以将负责(重新)绘制场景的所有代码编写到在Paint事件发生时调用的方法中。

因此,您可以像这样注册您的方法以在Paint发生时被调用:

this.Paint += new PaintEventHandler(YourMethod);

当表单需要重绘时,将调用YourMethod方法。

还要记住,您的方法必须具有与委托相同的参数,在本例中为:

void YourMethod(object sender, PaintEventArgs pea)
{
   // Draw nice Sun and detailed grass
   pea.Graphics.DrawLine(/* here you go */);
}

编辑

另一篇回答中提到,您可以重写 OnPaint 方法。这样,您就无需担心添加事件处理程序以调用自己的方法。


那么,如果我把我的绘图函数放在YourMethod中,每次窗体需要重绘时,它就会调用这个函数吗?如果是这样的话,我该如何获取我的函数参数? - Stefan Manciu
是的,会的。你不需要特别关注参数,因为它们会在运行时传递给 YourMethod。 - Miroslav Mares

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接