C#WinForms-绘制方法问题

C#WinForms-绘制方法问题,c#,winforms,onpaint,C#,Winforms,Onpaint,我不确定使用图形的最佳方式是什么-我应该将我的类附加到主窗体绘制事件,然后进行绘制,还是最好像这样从Overiden OnPaint void调用它?我是说,这样做可以吗: protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e) //what is this good for? My app works without it as well Graphics g=e.Graphics; Dr

我不确定使用图形的最佳方式是什么-我应该将我的类附加到主窗体绘制事件,然后进行绘制,还是最好像这样从Overiden OnPaint void调用它?我是说,这样做可以吗:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e)  //what is this good for? My app works without it as well
    Graphics g=e.Graphics;
    DrawEnemies(g);
    UpdateHUD(g);
    DrawSelectedUnit(g);
}

建议控件重写…方法上的
,而不是订阅它们自己的事件

您应该调用
base.OnPaint
,以确保正确激发
Paint
方法

:

OnPaint方法还启用 用于处理事件的派生类 没有附加委托。这是 搬运的首选技术 派生类中的事件

继承人须知
当覆盖 在派生类中,请确保 调用基类的OnPaint方法 以便注册代表收到 这件事


这并不重要;两者都有效。从理论上讲,重写OnPaint
的速度可能会稍微快一点,但任何人都不会注意到这一点。微软建议覆盖OnPaint,但这并不是真正的动机


您需要调用
base.OnPaint
,因为此方法将调用附加到
Paint
事件的处理程序。

OnPain
不会编译,除非它实际上是支持物理折磨的类的子类;)哦,托马斯,你可以编辑一下。不。我太聪明了,不适合那样做。(还有,我最近因为在某人的代码中编辑了一个明显的复制/粘贴错误而受到谴责,但这并不是我不在这里编辑的原因。)这让我感到疑惑。。。什么的痛苦?行刑的痛苦!覆盖OnPaint,您可以出于性能原因对base.OnPaint进行注释。但是请小心,因为您将不再接收OnPaint事件。通常,重写OnPaint您不再需要触发Paint事件,因此base.OnPaint不是必需的。MSDN说明了这一点,但并不是所有的事情都要严格遵循。以类似的方式重写OnBackgroundPaint和comment base。OnBackgroundPaint不基于重新绘制背景-防止闪烁。@serhio:防止背景绘制的方法不是重写OnBackgroundPaint(这是从Win32继承的老式暴力方法)。相反,您应该将控件样式设置为包含
AllPaintingInWmPaint
。从MSDN:
在派生类中重写OnPaintBackground时,不必调用基类的OnPaintBackground。
@serhio:Yup,没错,但仅在.NET中防止闪烁的正确方法是控件样式。如果你真的想画一个新的背景,你会按照你描述的去做。当然,对于这个问题来说,这些都是没有意义的,因为这个问题是关于油漆的。