几次迭代后,Paint事件处理程序停止执行

时间:2009-11-20 12:52:56

标签: c# image graphics gdi+

我有一个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加载并引用新图像时,我正在强制Panel重绘:

_bShowImage = true;
_panel.Refresh();

之后,图像被处理掉并从全局变量中取消引用:

_image.Dispose();
_image = null;

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

2 个答案:

答案 0 :(得分:1)

这完全倒退了。要么就像现在一样使用paint事件处理程序。它很好(我说它比图片框好)但是你需要删除_bShowImage和_image.Dispose的东西。您应该在使用新图像启动之前处置_image。但直到那个。

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

目前的情况 - 这简直令人困惑。另外:.Invalidate()是你几乎总想要的 - 不是.Refresh()。自VB6时代以来,这就是许多人心中的问题。

答案 1 :(得分:0)

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

只是一个想法...