如何防止PictureBox内部刷新自己?

时间:2012-01-30 20:19:41

标签: c# .net bitmap gdi+

我有一个非常快速的循环,它在一个Bitmap缓冲区中呈现动画,并在一个独立的线程中添加过滤器(通过使用LockBits / UnlockBits访问原始数据并对其进行Marshaling更改)。

我想找出一种在Form上实时显示渲染的方法,所以我创建了一个PictureBox并将其Image链接到我创建的位图。每次在解锁位图后立即刷新PictureBox(使用委托,进行交叉线程),以便正确更新渲染。

它非常好并且工作速度非常快,但是当我尝试将表单拖动到屏幕的边框时,出现了一个大问题,看看是否会出现任何错误,并且oops,应用程序崩溃......显示位图被锁定'当有任何其他窗口移动到PictureBox上方或PictureBox被部分拖出屏幕时,就会发生这种情况。我怀疑它是因为当重绘是必要的时候,PictureBox可以刷新自己,并且当位图仍然被锁定时它会这样做。所以...任何解决这个问题的方法?或者更好地渲染我的动画的其他方法?

2 个答案:

答案 0 :(得分:1)

可能的解决方案之一可能是创建覆盖MyPictureBox : PictureBox的自定义OnPaintBackground(比赛)类,如下所示:

protected override OnPaintBackground(...)
{
   // nothing, an empty method
}

但我不太确定这会有效,你应该自己检查一下。

  

我有一个非常快速的循环,它在Bitmap缓冲区中渲染动画   添加过滤器(通过使用LockBits / UnlockBits访问原始   数据和封送改变它。)在一个独立的线程

忘了PictureBox,因为我发现它,个人而言,太通用,不适合高性能渲染。只需编写一个简单的类来处理指定表面上指定位图的绘制。

Imo,这是最好的选择。

答案 1 :(得分:0)

你做不到。

相反,您应该复制图像(在后台线程上)并将副本放在PictureBox中。

为了获得更好的性能,您可以在两个图像之间切换,以避免创建太多图像。