2011-12-14 123 views
0

我正在構建具有自己的標頭集的自定義控件。如何在父級控件的子控件重新繪製之前阻止父級控件的重繪?

標題(另一個自定義控件)作爲上述自定義控件的子控件存在。

當我調整頭部(子控件的一部分)的大小時,子控件本身正在調用Invalidate(),它應該將消息排隊以重新繪製。

在子控件失效後,會通知父控件頭標已調整大小,併發出自己的Invalidate()命令。

這是由該跟蹤所示:

Headers.Invalidate()
List.Invalidate()
Headers.Invalidate()
List.Invalidate()

然而,當它開始重新繪製時,父控件首先收到它的Paint事件,然後是標題控件:

List.Paint
Headers.Paint

當我快速移動鼠標,鼠標移動事件出現在油漆事件的前面排隊,所以無效信號繼續被調用,但父控件的繪製事件總是首先開火:

List.Paint
List.Paint
List.Paint
List.Paint
Headers.Paint
List.Paint
List.Paint
Headers.Paint

這使得頭控制列表落後於基本上。理想情況下,兩個繪畫事件都會一起觸發,並且所有鼠標移動事件都會在繪畫事件之前排隊(這樣繪畫總是同步的,但是鼠標事件都會在繪畫之間刷新)。

我沒有想法從哪裏開始解決這個問題。

從哪裏開始,解決我頭部遇到的滯後問題?

+0

Windows繪畫順序始終爲Z順序,無法更改。 Windows消息順序始終是先輸入,最後塗刷,不能更改。移動鼠標不應該導致繪畫事件。緩慢塗料的標準原因是使用了太多的控制。 – 2011-12-15 00:53:05

+0

@HansPassant,謝謝,我一直在通過反覆試驗來了解這一點。但是,移動鼠標必須導致顏色,因爲我正在調整列的大小。 – 2011-12-15 00:55:16

回答

0

你已經使用雙緩衝? 它可能會比較慢,但它應該同步重新繪製,以便兩者在發生更新時似乎都會更新。

您可以在表格上雙緩衝切換使用:

SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 

此外,您可能也想嘗試:

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

答案是手工繪製,使重畫同步,使用UpdateRefresh方法。

Update方法將簡單地重新繪製控件和所有孩子同步。

Refresh方法將使控件和所有孩子無效,然後將調用Update

相關問題