GDI+雙緩衝

轉載至:http://blog.csdn.net/wangjijian/article/details/6070414

網上很多能搜索到的GDI+雙緩衝的實現都是有錯誤的,終於找到了一個正確,分享給大家。


 

  1. CPaintDC dc(this);    
  2. CRect rect;  
  3. GetClientRect(&rect);  
  4. Bitmap bmp(rect.right, rect.bottom);  
  5. SolidBrush  br(Color(255, 0, 0, 255));  
  6. Graphics* graph = Graphics::FromImage(&bmp);  
  7. graph->Clear(Color::White);  
  8. for(int i=0; i<100; i++)  
  9.     {  
  10.     graph->FillEllipse(&br, Rect(0, 10+i, 20+i, 30));  
  11.   
  12.     Graphics graphics(dc.m_hDC);  
  13.   
  14.     graphics.DrawImage(&bmp, rect.left, rect.top, rect.right, rect.bottom);  
  15.     }  
 

這裏是在WM_PAINT消息裏面處理的。首先創建一個Bitmap的對象,用來在上面進行畫圖。接着創建一個與之關聯的Graphics對象。注意到上面調用了Graphics對象的Clear來把它刷成白色,至於作用等下再說明。

這時候就可以用graph進行畫畫了,這時候其實都只是畫到Bitmap對象上去,還沒有畫到窗口上去,也就是隻是先保存到內存中而已。

接着就創建一個與hdc相關聯的Graphics對象了,這時候用graphics所做的操作都會顯示到窗口上了。但由於我們之前是先把所有的操作在內存裏都做好,再一次性顯示到屏幕上,這樣就提高了繪圖速度。

但其實現在運行一下程序還是發現在縮放窗口時圖片會閃爍,這裏的原因是由於在縮放時程序會自動刷新背景,這時候就要在處理WM_ERASEBKGND消息時直接return TRUE。這樣就告訴Windows我們會自己進行刷新,但實際上這時我們什麼都沒做。上面調用了Graphics對象的Clear方法就是來處理背景的刷新,由於這時是在內存中做好的,所以就不會再出現閃爍的問題了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章