2017-06-04 63 views
0

在我的表單類我已經覆蓋了OnPaint方法不能雙緩衝窗體上繪製

protected override void OnPaint(PaintEventArgs e) 
{ 
    using (Graphics g = e.Graphics) 
    { 
     g.DrawImage(player.Sprite, new Rectangle(player.X, player.Y, 20, 20)); 
    } 
    base.OnPaint(e); 
} 

我有一個計時器,那確實對Tickthis.Invalidate()和圖像閃爍。我給自己定的形式構造this.DoubleBuffered = true,現在我的狀態甚至不顯示任何東西,如果我調整它的大小,它的行爲是這樣的:

1

那是什麼,我很想念雙緩存的事情?

+1

什麼是定時器的時間間隔? –

+0

@TimonPost 25ms,約爲。 40幀每秒 –

+1

雖然這不是你的問題,但使用(Graphics g = e.Graphics)是無意義的代碼。 'e.Graphics'已經*了* Graphics'對象;直接使用它。至於你的實際問題,閃爍可能是被擦除的背景。考慮設置「ControlStyles.AllPaintingInWmPaint」和「ControlStyles.UserPaint」。這甚至可以避免需要雙重緩衝。 –

回答

1
using (Graphics g = e.Graphics) 

using關鍵字是此代碼中的錯誤。實質上,它殺死了雙緩衝區,正常的噴塗週期無法繼續。其中「正常」是緩衝區的內容在之後變爲點到之後,您的OnPaint()方法完成。這會使都呈現背景的渲染,這就是爲什麼你會看到顯示器的背面,以及前景,你畫的圖像。

對於using(或調用Dispose)的黃金法則是,您應該只在創建對象時才這樣做。如果你沒有,就像你沒有在這種情況下那樣,那麼你不能認爲你「擁有」了這個對象,並且你必須依靠你的代碼的調用者來處理它。它做什麼,不需要幫助。

修復:

e.Graphics.DrawImage(player.Sprite, new Rectangle(player.X, player.Y, 20, 20)); 
base.OnPaint(e);