2008-10-08 344 views
3

我有一個用作繪圖表面的簡單面板。這裏的目標是在某些情況下圍繞子ListView繪製一個4像素寬的輪廓。我想在可以拖入某些內容時使輪廓起伏不定。如何在C#中不斷重新繪製控件時避免屏幕閃爍?

我只是圍繞ListView繪製一個簡單的矩形並更新計時器滴答事件中矩形的不透明度。當不透明度改變時,邊框被重新繪製。在這一點上,我正在對這幅畫進行雙緩衝。我也只允許每15次左右重繪一次(定時器間隔爲20毫秒)。畢竟,繪圖過程還是閃爍了一下。這是不可接受的,所以我需要一些關於如何避免這種情況的指導。

我沒有看到周圍的繪畫控制經常。需要從不透明到堅實再平穩過渡。當我將刻度間隔降低到足夠低時(降至約300-500毫秒),閃爍停止,但刷新率太慢。

我願意接受任何想法。也許我接近這一點的方式顯然是錯誤的,或者你們中的一個已經創造了一種發光效果並且知道該做什麼。感謝您提前提供任何幫助。

回答

4

我偶然發現了一個解決方案,如果有人感興趣。事實證明,閃爍是由背景的繪製造成的。我用SetStyle告訴控件我將處理所有的繪畫。

SetStyle(ControlStyles.SupportsTransparentBackColor | 
     ControlStyles.Opaque | 
     ControlStyles.UserPaint | 
     ControlStyles.AllPaintingInWmPaint, true); 

然後我首先在區域上繪製一個透明顏色,然後繪製我的邊框。我有點破解,但它像一個魅力。

編輯:並記住雙緩衝圖像以及。

1

我沒有一個強大的答案,但因爲你沒有,無論如何,我會發布:

首先,我從來沒有使用過的System.Drawing.ImageAnimator類,但會是一個更好的辦法爲你?

二,如果失敗了,你試過不是使用雙緩衝?這是一個漫長的過程,但是也許你的雙緩衝代碼實際上讓它變得更糟。

+0

+1因爲您提醒我ImageAnimator類對我的另一個項目很有用。 – 2008-10-09 00:25:45

0

遠投,但你有沒有試過

SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 

面板上的控制?

3

在窗體上設置DoubleBuffered = true。

0

您也可能想要查看位圖上的圖形,然後只顯示位圖,如果它已更改。只是我的2c。

+0

這是我一直在使用的雙緩衝方法。 – 2008-10-08 23:14:26

1

事先對不起,這可能不會幫助,但:WPF有動畫,至少在理論上可以做到這一點順利。