2008-09-15 53 views

回答

13

您可以嘗試在InitiliseComponent調用之後在構造函數中放入以下內容。

SetStyle(ControlStyles.OptimizedDoubleBuffer | 
     ControlStyles.UserPaint | 
     ControlStyles.AllPaintingInWmPaint, true); 

編輯:

如果你給這個一去,如果你可以刪除自己的雙緩衝的代碼,只是有控制繪製自身以響應適當的虛擬方法被調用。

+0

我通常把這些東西在Application.Run之前,但這個啊,我認爲是解決這個問題的最佳解決方案。 – Quibblesome 2008-09-15 16:38:45

0

你說你已經嘗試了雙緩衝,但是接下來你會說先繪製圖像然後blitting。你有沒有嘗試在構造函數中設置DoubleBuffered = true,而不是自己用Image創建它?

1

可能不夠好,只是叫

SetStyle(ControlStyles::UserPaint | ControlStyles::AllDrawingInWmPaint, true); 

你看到的很可能是因爲Windows繪製控件的背景第一(通過WM_ERASEBKGND)閃爍,然後要求你的控制做任何繪圖你需要做(通過WM_PAINT)。通過禁用背景塗料並在OnPaint覆蓋中進行所有繪製,可以消除99%的情況下的問題,而無需使用雙緩衝所需的全部內存。

8

我從一個正常工作的C#程序中獲得了這個結果。其他海報語法錯誤和由C顯然複製++而不是C#

SetStyle(ControlStyles.OptimizedDoubleBuffer | 
         ControlStyles.UserPaint | 
         ControlStyles.AllPaintingInWmPaint, true);