2010-06-18 138 views
1

我正在做一些GDI +在Visual C++中繪圖,並注意到當滾動,調整大小等時,由於大量的閃爍和緩慢重繪,我的畫布看起來並不是最好的。從我讀過的內容來看,解決方案是加倍緩衝,但是有關如何實現的建議存在衝突。我應該使用.NET的內置雙緩衝還是我自己的實現?

幾個來源建議用現有的.NET實現,就像這樣:

using namespace System::Windows::Forms; 
this->SetStyle(ControlStyles::AllPaintingInWmPaint | 
       ControlStyles::UserPaint | 
       ControlStyles::DoubleBuffer, true); 

還有更多的來源建議只是繪製自己的位圖,然後把它扔在屏幕上:

dbBitmap = gcnew Bitman(ClientRectangle.Width, ClientRectangle.Height); 
dbGraphics = Graphics::FromImage(dbBitmap); 

// use the graphics object to do everything you need to here 

this->createGraphics()->DrawImageUnscaled(dbBitmap, 0, 0); 

這些方法之間是否存在功能差異,還是僅僅將Microsoft的背景帶到了前沿?我很關心速度和效率,以及使用一種方法的可能的缺陷。

+0

我一直使用構建雙緩衝,它允許我重畫一個60fps的全屏應用程序(只要我不畫太複雜的幾何圖形)。雖然我確實確保我的緩衝圖像具有與屏幕完全相同的像素格式。 – 2010-06-18 18:50:55

+1

就我個人而言,我會首先嚐試內置雙緩衝來查看它是否「足夠好」。那麼只有在DIY路線仍然存在問題的情況下。 – ChrisF 2010-06-18 18:51:04

回答

1

只需在構造函數或屬性窗口中將窗體的DoubleBuffered屬性設置爲true即可。你繪製在Paint事件中,使用CreateGraphics()永遠不會是正確的。調用Invalidate()或Update()如果發生某些事情需要重新繪製窗口。

+0

我實際上是在繪製OnPaint事件,我只是沒有意識到PaintEventArgs已經帶有一個現有的Graphics對象。在更改之後,只需設置DoubleBuffered屬性,我的畫布仍會閃爍,但現在它明顯更好。 – MikeD 2010-06-18 20:42:30

相關問題