雙緩衝技術繪圖

1、在記憶體中創建與畫布一致的緩衝區 2、在緩衝區畫圖 以上也就是雙緩衝繪圖的基本的思路。

當數據量很大時,繪圖可能需要幾秒鐘甚至更長的時間,而且有時還會出現閃爍現象,為了解決這些問題,可採用雙緩衝技術來繪圖。
雙緩衝即在記憶體中創建一個與螢幕繪圖區域一致的對象,先將圖形繪製到記憶體中的這個對象上,再一次性將這個對象上的圖形拷貝到螢幕上,這樣能大大加快繪圖的速度。雙緩衝實現過程如下:
1、在記憶體中創建與畫布一致的緩衝區
2、在緩衝區畫圖
3、將緩衝區點陣圖拷貝到當前畫布上
4、釋放記憶體緩衝區
圖形圖象處理編程過程中,雙緩衝是一種基本的技術。我們知道,如果窗體在回響WM_PAINT訊息的時候要進行複雜的圖形處理,那么窗體在重繪時由於過頻的刷新而引起閃爍現象。解決這一問題的有效方法就是雙緩衝技術。因為窗體在刷新時,總要有一個擦除原來圖象的過程OnEraseBkgnd,它利用背景色填充窗體繪圖區,然後在調用新的繪圖代碼進行重繪,這樣一擦一寫造成了圖象顏色的反差。當WM_PAINT的回響很頻繁的時候,這種反差也就越發明顯。於是我們就看到了閃爍現象。 
我們會很自然的想到,避免背景色的填充是最直接的辦法。但是那樣的話,窗體上會變的一團糟。因為每次繪製圖象的時候都沒有將原來的圖象清除,造 成了圖象的殘留,於是窗體重繪時,畫面往往會變的亂七八糟。所以單純的禁止背景重繪是不夠的。我們還要進行重新繪圖,但要求速度很快,於是我們想到了使用 BitBlt函式。它可以支持圖形塊的複製,速度很快。我們可以先在記憶體中作圖,然後用此函式將做好的圖複製到前台,同時禁止背景刷新,這樣就消除了閃 爍。以上也就是雙緩衝繪圖的基本的思路。 
首先給出實現的程式,然後再解釋,同樣是在OnDraw(CDC *pDC)中: 
CDC MemDC; //首先定義一個顯示設備對象 
CBitmap MemBitmap;//定義一個點陣圖對象 //隨後建立與螢幕顯示兼容的記憶體顯示設備
MemDC.CreateCompatibleDC(NULL); //這時還不能繪圖,因為沒有地方畫 ^_^ 
//下面建立一個與螢幕顯示兼容的點陣圖,至於點陣圖的大小嘛,可以用視窗的大小,也可以自己定義
(如:有滾動條時就要大於當前視窗的大小,在BitBlt時決定拷貝記憶體的哪部分到螢幕上)
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); //將點陣圖選入到記憶體顯示設備中 //只有選入了點陣圖的記憶體顯示設備才有地方繪圖,畫到指定的點陣圖上 
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); //先用背景色將點陣圖清除乾淨,這裡我用的是白色作為背景 //你也可以用自己應該用的顏色 
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); //繪圖 
MemDC.MoveTo(……); MemDC.LineTo(……); //將記憶體中的圖拷貝到螢幕上進行顯示 
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); //繪圖完成後的清理 //把前面的pOldBit選回來.在刪除MemBitmap之前要先從設備中移除它 
MemDC.SelectObject(pOldBit); MemBitmap.DeleteObject(); MemDC.DeleteDC(); 雙緩衝(two way soft-closing)

相關詞條

相關搜尋

熱門詞條

聯絡我們