我有一个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()方法周围,该方法执行正常。好像对处理程序的调用已被删除。有没有人遇到过这个问题?
答案 0 :(得分:1)
这完全倒退了。要么就像现在一样使用paint事件处理程序。它很好(我说它比图片框好)但是你需要删除_bShowImage和_image.Dispose的东西。您应该在使用新图像启动之前处置_image。但直到那个。
或者,如果absolutley必须在绘制之后立即处理_image,那么您应该使用Panel.CreateGraphics来获取Graphichs对象,您可以使用它来立即绘制_image并删除事件。
目前的情况 - 这简直令人困惑。另外:.Invalidate()是你几乎总想要的 - 不是.Refresh()。自VB6时代以来,这就是许多人心中的问题。
答案 1 :(得分:0)
将图片放在图片框中并以这种方式遍历它们会不会更聪明,这样您每次都不会在整个窗口强制重新绘制?
只是一个想法...贝