【问题标题】:Paint event handler stops executing after a few iterations绘画事件处理程序在几次迭代后停止执行
【发布时间】:2009-11-20 12:52:56
【问题描述】:

我有一个 Windows 窗体,它通过在窗体上以幻灯片形式显示的图像进行循环。我这样做的方法是让 Panel 控制它所在的窗体的大小,并添加一个事件处理程序来绘制内存中存在的 Image 对象。

void panel_Paint(object sender, PaintEventArgs e)
{
  if (_bShowImage)
  {
    Point leftCorner = new Point((this.Bounds.Width / 2) - (_image.Width / 2), (this.Bounds.Height / 2) - (_image.Height / 2));

    e.Graphics.DrawImage(_image, leftCorner);

    _bShowImage = false;
  }
}

当 _image 加载和引用新图像时,我强制面板重绘:

_bShowImage = true;
_panel.Refresh();

紧接着,图像被释放并从全局变量中解引用:

_image.Dispose();
_image = null;

我已经看到它工作了一段时间,比如 5 次迭代,然后 panel_Paint() 处理程序没有被调用。我使用 2-3 JPG 进行显示,我知道它们没有损坏,因为它们在前 x 次显示良好。我已经在面板的 Refresh() 方法周围放置了调试行,它们执行得很好。就好像对处理程序的调用已被丢弃。有没有人遇到过这个问题?

【问题讨论】:

  • 您不使用 PictureBox 有什么原因吗?每次必须重新绘制一点点时,以这种方式绘制整个图像都会产生 很多 开销...如果您要自己动手,我建议您至少注意该区域应该从 PaintEventArgs 中重新绘制。

标签: c# image graphics gdi+


【解决方案1】:

这完全是倒退。您可以像现在一样使用绘画事件处理程序。很好(我说它比图片框好)但是你需要删除 _bShowImage 和 _image.Dispose 的东西。相反,您应该在使用新图像启动它之前处置 _image。但在那之前。

或者,如果您绝对必须在 _image 绘制后立即对其进行处理,那么您应该改用 Panel.CreateGraphics 来获取一个 Graphichs 对象,您可以使用它来立即绘制 _image 并删除事件。

就目前而言 - 这真是令人困惑。另外:.Invalidate() 是您几乎总是想要的,而不是 .Refresh()。这只是自 VB6 时代以来一直困扰着许多人的事情。

【讨论】:

  • 我现在将 Paint 事件处理放在一边,并接受了这个建议。现在至少我们得到了一个实际异常的地方:System.Runtime.InteropServices.ExternalException:GDI+ 中发生了一般错误。在 System.Drawing.Graphics.CheckErrorStatus(Int32 status) 在 System.Drawing.Graphics.DrawImage(Image image, Int32 x, Int32 y) 在 System.Drawing.Graphics.DrawImage(Image image, Point point) 我认为它可能是内存泄漏,但我处理了图像。另外,Graphics 对象是一个全局对象,所以我只在最后处理一次。
  • 这听起来也倒退了——要么保持全局,将其处理掉,并确保立即将其设置为 null,这样如果您尝试使用它,至少会得到一个 null 引用异常。或者你把它本地化。将“全局”处理的引用放在周围是没有用的。您几乎总是可以忘记 .Dispose()。但永远不要处理仍在使用的东西。至少对于您现在的错误跟踪:删除 .Dispose()。
【解决方案2】:

将图片放在图片框中并以这种方式循环浏览它们不是更聪明,这样您就不会每次都在整个窗口上强制重新绘制?

只是一个想法......

托尼

【讨论】:

  • 一开始我用的是 PictureBox,但它会出现同样的问题,所以我决定自己做。
猜你喜欢
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 2020-02-15
相关资源
最近更新 更多