雙緩衝技術(基於GDI+實現)

一、雙緩衝技術
     雙緩衝即在內存中創建一個與屏幕繪圖區域一致的對象,先將圖形繪製到內存中的這個對象上,再一次性將這個對象上的圖形拷貝到屏幕上,這樣能大大加快繪圖的速度。
    當數據量很大時,繪圖可能需要幾秒鐘甚至更長的時間,而且有時還會出現閃爍現象,爲了解決這些問題,可採用雙緩衝技術來繪圖。
    雙緩衝實現過程如下:
1、在內存中創建與畫布一致的緩衝區
2、在緩衝區畫圖
3、將緩衝區位圖拷貝到當前畫布上
4、釋放內存緩衝區
    在圖形圖象處理編程過程中,雙緩衝是一種基本的技術。我們知道,如果窗體在響應WM_PAINT消息的時候要進行復雜的圖形處理,那麼窗體在重繪時由於過頻的刷新而引起閃爍現象。解決這一問題的有效方法就是雙緩衝技術。因爲窗體在刷新時,總要有一個擦除原來圖象的過程OnEraseBkgnd,它利用背景色填充窗體繪圖區,然後在調用新的繪圖代碼進行重繪,這樣一擦一寫造成了圖象顏色的反差。當WM_PAINT的響應很頻繁的時候,這種反差也就越發明顯。於是我們就看到了閃爍現象。
    我們會很自然的想到,避免背景色的填充是最直接的辦法。但是那樣的話,窗體上會變的一團糟。因爲每次繪製圖象的時候都沒有將原來的圖象清除,造 成了圖象的殘留,於是窗體重繪時,畫面往往會變的亂七八糟。所以單純的禁止背景重繪是不夠的。我們還要進行重新繪圖,但要求速度很快,於是我們想到了使用 BitBlt函數。它可以支持圖形塊的複製,速度很快。我們可以先在內存中作圖,然後用此函數將做好的圖複製到前臺,同時禁止背景刷新,這樣就消除了閃 爍。以上也就是雙緩衝繪圖的基本的思路。

二、基於GDI+實現雙緩衝技術
 
		CPaintDC dc(this);                              // device context for painting
		Graphics gr(dc.m_hDC);                          // Graphics to paint
		Rect rGdi;
		gr.GetVisibleClipBounds(&rGdi);                 // The same as the clip rect
		
		//創建緩衝區
		Bitmap clBmp(rGdi.Width, rGdi.Height);          // Mem bitmap
		Graphics* grPtr = Graphics::FromImage(&clBmp);  // As memDC
		
		//利用grPtr在clBmp緩衝區繪圖
		grPtr->DrawImage(m_PngMeter,clock_Rect);
		grPtr->TranslateTransform(Pcenter.X,Pcenter.Y);
		grPtr->RotateTransform(i);
		grPtr->TranslateTransform(-Pcenter.X,-Pcenter.Y);
		grPtr->DrawImage(m_PngArrow,picRect);
		grPtr->ResetTransform();

		//將clBmp緩衝區繪製到窗口
		gr.DrawImage(&clBmp, rGdi); 
<pre class="cpp" name="code">		delete grPtr;//注:使用完緩衝區後,一定要及時釋放內才能,尤其是在OnPaint中,否則程序很快佔滿物理內存,崩潰!

   這裏是在WM_PAINT消息裏面處理的。首先創建一個Bitmap的對象clBmp,用來在上面進行畫圖。接着創建一個與之關聯的Graphics指針grPtr。
   這時候就可以用grPtr進行畫畫了,這時候其實都只是畫到Bitmap對象clBmp上去,還沒有畫到窗口上去,也就是隻是先保存到內存中而已。
   最後,利用與hdc相關聯的Graphics對象gr,將Bitmap對象clBmp繪製到窗口,這時候用grPtr所做的操作都會顯示到窗口上了。但由於我們之前是先把所有的操作在內存裏都做好,再一次性顯示到屏幕上,這樣就提高了繪圖速度。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章