解決自繪制控件閃爍的問題
記得以前用VC開發自繪制控件的時候,遇到的一個很煩人的問題就是控件在paint的時候總是出現flicker(閃爍)。原因其實很簡單,就是你一點一點的向設備上下文環境繪制,中間還有很多邏輯運算,結果就像是動畫了,不過計算機的速度比較快,所以呈現在我們面前的閃爍,而閃爍的出現大大的影響的客戶的使用體驗。后來一個程序員開發了一個后來廣為流傳的類MemDC,這個類首先創建一個兼容的設備上下文環境,將所有的繪制工作放到這個類里完成,最后將繪制好的內容一次性的帖(bitblt)到實際的上下文環境,這樣就解決的閃爍的問題,這就是雙緩存機制。這個類是如此簡潔好用,以至于很多的開源的控件里都用到了這個類。
好了,言歸正傳,說說dotnet控件是怎么解決閃爍問題的。既然雙緩存機制是如此的有效而且實現又不是很復雜,微軟一定是很樂意將它作為自己的標準。最近研究dotnet控件的制作,看了看control的文檔,才發現微軟在dotnet控件的基類Control類里已經提供的這種機制。現在如果你想在自己的控件里實現雙緩存機制,只需要簡單的設置控件的風格就可以了。如果你的控件是派生于Control類的話,你只需要在你的控件造函數里加上下邊幾行代碼:
SetStyle(ControlStyles.DoubleBuffer, true);
SetStyle(ControlStyles.UserPaint, true);
另外你也可以使用下面的代碼:
this.DoubleBuffered =true;
好了,言歸正傳,說說dotnet控件是怎么解決閃爍問題的。既然雙緩存機制是如此的有效而且實現又不是很復雜,微軟一定是很樂意將它作為自己的標準。最近研究dotnet控件的制作,看了看control的文檔,才發現微軟在dotnet控件的基類Control類里已經提供的這種機制。現在如果你想在自己的控件里實現雙緩存機制,只需要簡單的設置控件的風格就可以了。如果你的控件是派生于Control類的話,你只需要在你的控件造函數里加上下邊幾行代碼:
SetStyle(ControlStyles.DoubleBuffer, true);
SetStyle(ControlStyles.UserPaint, true);
另外你也可以使用下面的代碼:
this.DoubleBuffered =true;

浙公網安備 33010602011771號