2012-01-30 16 views
1

我有一個非常快的循環,它在一個位圖緩衝區中呈現動畫,並在獨立線程中添加過濾器(通過使用LockBits/UnlockBits來訪問原始數據並對其進行封送處理)。如何防止PictureBox內部刷新自身?

我想找出一種方法來實時顯示窗體上的渲染,所以我創建了一個PictureBox並將其圖像鏈接到我創建的位圖上。每次在位圖解鎖後,我都會刷新PictureBox(使用委託來執行交叉線程),以便正確更新渲染。

它完全正常,工作速度非常快,但當我嘗試將窗體拖到屏幕邊框時,出現了一個大問題,看看是否會出現任何錯誤,並且哎呀,應用程序崩潰。位圖被鎖定'當有其他窗口移動到圖片框上方或圖片框被部分拖出屏幕時,會發生這種情況。我懷疑它,因爲PictureBox可以刷新自己需要重繪時,它會在位圖仍然被鎖定時進行刷新。那麼......解決這個問題的任何方法?或者其他方式來渲染動畫效果更好?

回答

0

你不能那樣做。

相反,您應該複製圖像(在後臺線程上)並將副本放入PictureBox。

爲了獲得更好的性能,您可以在兩個圖像之間切換以避免創建太多圖像。

+0

感謝您的提示。我會看看這將如何執行。也謝謝@Tigran你的解決方案確實也很有幫助。 – 2012-01-31 14:27:09

1

一個可能解決方案可以是創建自定義MyPictureBox : PictureBox(說)類覆蓋OnPaintBackground,像這樣:

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

但我不是很肯定,這將工作,你應該自己檢查一下。

我會做什麼,就個人而言,考慮到您的評論:

我有一個非常快速環路這使得動畫位圖緩存和 filter添加到它(通過使用LockBits/UnlockBits到在一個獨立的線程

到它訪問原始數據 和編組變化。)忘掉PictureBox,因爲我找到了,就個人而言,過於籠統和不吹田高性能渲染。只需編寫一個簡單的類來處理指定表面上的指定位圖的繪製。

伊莫,這是一個不錯的選擇。

+0

#2:這只是重新發明'PictureBox';它不會幫助。 – SLaks 2012-01-30 20:26:57

+0

@SLaks:我不會推薦*重新發明一個'PictureBox',但是隻從概念中提取你需要的想法(如果沒有其他解決方案,在這種情況下看起來如此),並實現它們。不要以爲他需要重寫'PB'中可用的所有*函數,只需要他們需要的幾個函數。 – Tigran 2012-01-30 20:28:39

+0

還沒有意義;那會有同樣的問題。您需要能夠按需重繪。 – SLaks 2012-01-30 20:31:03