【问题标题】:C# WinForms - Paint method questionsC# WinForms - 绘制方法问题
【发布时间】:2010-07-07 23:08:50
【问题描述】:

我不确定使用图形的最佳方式是什么 - 我应该将我的类附加到主窗体 Paint 事件然后进行绘图,还是像这样从覆盖的 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);
}

【问题讨论】:

  • OnPain 不会编译,除非这实际上是支持身体折磨的类的子类 ;)
  • 噢@Thomas,你本来可以编辑的。
  • 不。我太机智了。 (此外,我最近因在某人的代码中编辑了明显的复制/粘贴错误而受到谴责,但这并不是我在此不进行编辑的原因。)
  • 这让我想知道... OnPain 是什么? OnPain 执行!
  • 覆盖 OnPaint 您可以出于性能原因评论 base.OnPaint。但请注意,因为您不会再收到 OnPaint 事件了。

标签: c# winforms onpaint


【解决方案1】:

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

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

From MSDN:

OnPaint 方法还可以启用 处理事件的派生类 没有附加代表。这是 处理的首选技术 派生类中的事件。

继承人须知
覆盖时 OnPaint 在派生类中,请务必 调用基类的 OnPaint 方法 以便注册代表收到 事件。

【讨论】:

  • 通常,覆盖 OnPaint 您不再需要触发 Paint 事件,因此 base.OnPaint 不是强制性的。 MSDN 告诉,但并非一切都完全遵循。以类似的方式覆盖 OnBackgroundPaint 并注释 base.OnBackgroundPaint 不会重新绘制背景 - 防止闪烁。
  • @serhio:防止背景绘制的方法不是覆盖 OnBackgroundPaint(这是从 Win32 继承的老式暴力方法)。相反,您应该将 Control 样式设置为包含 AllPaintingInWmPaint
  • 来自 MSDN:When overriding OnPaintBackground in a derived class it is not necessary to call the base class's OnPaintBackground.msdn.microsoft.com/en-us/library/…
  • @serhio:是的,没错,但仅在 .NET 中防止闪烁的正确方法是控制样式。如果您想实际绘制一个新背景,您将按照您的描述进行。当然,这对于这个问题来说毫无意义,因为这个问题是关于 OnPaint 的。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 2010-11-25
    • 1970-01-01
    相关资源
    最近更新 更多