網上很多能搜索到的GDI+雙緩衝的實現都是有錯誤的,終於找到了一個正確,分享給大家。
- CPaintDC dc(this);
- CRect rect;
- GetClientRect(&rect);
- Bitmap bmp(rect.right, rect.bottom);
- SolidBrush br(Color(255, 0, 0, 255));
- Graphics* graph = Graphics::FromImage(&bmp);
- graph->Clear(Color::White);
- for(int i=0; i<100; i++)
- {
- graph->FillEllipse(&br, Rect(0, 10+i, 20+i, 30));
- Graphics graphics(dc.m_hDC);
- graphics.DrawImage(&bmp, rect.left, rect.top, rect.right, rect.bottom);
- }
這裏是在WM_PAINT消息裏面處理的。首先創建一個Bitmap的對象,用來在上面進行畫圖。接着創建一個與之關聯的Graphics對象。注意到上面調用了Graphics對象的Clear來把它刷成白色,至於作用等下再說明。
這時候就可以用graph進行畫畫了,這時候其實都只是畫到Bitmap對象上去,還沒有畫到窗口上去,也就是隻是先保存到內存中而已。
接着就創建一個與hdc相關聯的Graphics對象了,這時候用graphics所做的操作都會顯示到窗口上了。但由於我們之前是先把所有的操作在內存裏都做好,再一次性顯示到屏幕上,這樣就提高了繪圖速度。
但其實現在運行一下程序還是發現在縮放窗口時圖片會閃爍,這裏的原因是由於在縮放時程序會自動刷新背景,這時候就要在處理WM_ERASEBKGND消息時直接return TRUE。這樣就告訴Windows我們會自己進行刷新,但實際上這時我們什麼都沒做。上面調用了Graphics對象的Clear方法就是來處理背景的刷新,由於這時是在內存中做好的,所以就不會再出現閃爍的問題了。