C#WinForms-绘制方法问题
我不确定使用图形的最佳方式是什么-我应该将我的类附加到主窗体绘制事件,然后进行绘制,还是最好像这样从Overiden OnPaint void调用它?我是说,这样做可以吗: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
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中防止闪烁的正确方法是控件样式。如果你真的想画一个新的背景,你会按照你描述的去做。当然,对于这个问题来说,这些都是没有意义的,因为这个问题是关于油漆的。