2010-07-07 48 views
5

我不知道什么是使用图形的最佳方式 - 我应该将我的类附加到主窗体Paint事件,然后执行绘制,或者最好从overidden OnPaint调用它像void这个?我的意思是,是不是确定是这样做的:C#WinForms - 绘制方法问题

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); 
} 
+4

'OnPain'不会编译,除非这实际上是一个类的子类,它支持遭受身体上的折磨; – Thomas 2010-07-07 14:00:36

+2

Aw @Thomas,你可以编辑它。 – Lazarus 2010-07-07 14:01:19

+1

Nah。我对此太诙谐了。 (另外,我最近因为在某人的代码中编辑了一个明显的复制/粘贴错误而受到了谴责,但这不是我在此避免编辑的原因。) – Thomas 2010-07-07 14:13:12

回答

6

建议控制覆盖On...方法,而不是订阅自己的事件。

您应该致电base.OnPaint以确保Paint方法正确启动。

From MSDN

OnPaint方法还允许 派生类对事件进行处理 不附加委托。这是 在派生类中处理事件的首选技术。

给继承
在派生类中重写 OnPaint中,一定要 调用基类的OnPaint方法 以便注册的委托接收 事件。

+0

通常,重写OnPaint,不需要再触发Paint事件,所以base.OnPaint不是必需的。 MSDN告诉,但并非所有事情都要严格遵循。以类似的方式,你可以重写OnBackgroundPaint和注释base.OnBackgroundPaint不要重新绘制背景 - 避免闪烁。 – serhio 2010-07-07 14:59:07

+0

@serhio:防止背景画的方法不是重写OnBackgroundPaint(这是从Win32继承的旧式蛮力方法)。相反,您应该将控件样式设置为包含“AllPaintingInWmPaint”。 – 2010-07-07 15:10:32

+0

从MSDN:'在派生类中重写OnPaintBackground时,不需要调用基类的OnPaintBackground.' http://msdn.microsoft.com/en-us/library/system.windows.forms.control.onpaintbackground。 aspx – serhio 2010-07-07 15:24:49

3

它并不重要;都工作。在理论上覆盖OnPaint的速度可能会稍微快一些,但任何人都会注意到这并不是什么区别。微软建议覆盖OnPaint,但并没有真正激发这一点。

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