我想在C#中創建一個自定義控件。但是每次我必須完全重新繪製控件時,即使使用雙緩衝(首先繪製圖像,然後進行blitting),它也會閃爍。如何消除Windows.Forms滾動時自定義控件的閃爍?
當我必須完全重新繪製時,如何消除閃爍?
我想在C#中創建一個自定義控件。但是每次我必須完全重新繪製控件時,即使使用雙緩衝(首先繪製圖像,然後進行blitting),它也會閃爍。如何消除Windows.Forms滾動時自定義控件的閃爍?
當我必須完全重新繪製時,如何消除閃爍?
您可以嘗試在InitiliseComponent調用之後在構造函數中放入以下內容。
SetStyle(ControlStyles.OptimizedDoubleBuffer |
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint, true);
編輯:
如果你給這個一去,如果你可以刪除自己的雙緩衝的代碼,只是有控制繪製自身以響應適當的虛擬方法被調用。
你說你已經嘗試了雙緩衝,但是接下來你會說先繪製圖像然後blitting。你有沒有嘗試在構造函數中設置DoubleBuffered = true,而不是自己用Image創建它?
可能不夠好,只是叫
SetStyle(ControlStyles::UserPaint | ControlStyles::AllDrawingInWmPaint, true);
你看到的很可能是因爲Windows繪製控件的背景第一(通過WM_ERASEBKGND)閃爍,然後要求你的控制做任何繪圖你需要做(通過WM_PAINT)。通過禁用背景塗料並在OnPaint覆蓋中進行所有繪製,可以消除99%的情況下的問題,而無需使用雙緩衝所需的全部內存。
我從一個正常工作的C#程序中獲得了這個結果。其他海報語法錯誤和由C顯然複製++而不是C#
SetStyle(ControlStyles.OptimizedDoubleBuffer |
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint, true);
我通常把這些東西在Application.Run之前,但這個啊,我認爲是解決這個問題的最佳解決方案。 – Quibblesome 2008-09-15 16:38:45