C 實現雙緩衝

2022-05-30 09:33:09 字數 1615 閱讀 5011

首先宣告下,這篇資料也是整理別人的資料的基礎上,總結來的。

在圖形影象處理過程中,雙緩衝技術是一種比較常見的技術。窗體在響應wm_paint訊息時,需要對影象進行繪製處理。如果影象繪製次數過多,重繪過於頻繁時,或者當要繪製的物件太複雜,尤其是含有點陣圖時,一般計算機便力不從心了。顯示器上就會因為重新整理過頻或者過慢而閃爍。雙緩衝就是解決這種問題的技術。

窗體在重新整理前,會首先擦除(onerasebkgnd)之前的內容,然後利用背景色填充,再呼叫繪製**進行繪製。一擦一填一寫,就會形成顏色的反差,當反差過於明顯且頻繁時,閃爍就來了。擦除繪製需要時間去處理。如果不在窗體上直接繪製,而是在「別的地方」繪製好,然後再直接搬過來,就不會有這種問題了。這就是雙緩衝的基本原理。

雙緩衝技術中,記憶體就充當了「別的地方」。雙緩衝技術分為五步:

1、在記憶體中申請緩衝區,建立相容記憶體;

2、建立位圖,並將點陣圖與緩衝區記憶體相關聯起來;

3、在相容記憶體裡繪製;

4、將繪製好的點陣圖拷貝到當前裝置;

5、釋放相容記憶體。

具體**實現如下(這是乙個繪製同心圓的例子):

cpoint ptcenter; 

crect rect,ellipserect;

getclientrect(&rect);

ptcenter =rect.centerpoint();

cdc dcmem;

//用於緩衝作圖的記憶體dc

cbitmap cbbmp;

//記憶體中承載臨時圖象的點陣圖

dcmem.createcompatibledc(pdc);

//申請緩衝區,依附視窗dc建立相容記憶體dc

cbbmp.createcompatiblebitmap(pdc,rect.width(),rect.height());

//建立相容位圖

dcmem.selectobject(&cbbmp); //

將位圖選擇進記憶體dc //

按原來背景填充客戶區,不然會是黑色

dcmem.fillsolidrect(rect,pdc->getbkcolor());

for(int i=20;i>0;i--) //

在記憶體dc上做同樣的同心圓圖象 /*

//提供下繪製方框、畫線等方法

dcmem.fillsolidrect(0,0,nwidth,nheight,rgb(255,255,255));

//繪圖

dcmem.moveto(……);

dcmem.lineto(……);

*/pdc->bitblt(0,0,rect.width(),rect.height(), &dcmem,0,0,srccopy);//

將記憶體dc上的圖象拷貝到前台

dcmem.deletedc();

//刪除dc

該段**中已經提供了填充客戶區的方法,為了提高繪製效率,可以繼承onerasebkgnd,然後直接返回true就行。

bool test::onerasebkgnd(cdc* pdc) 

//呼叫父類的onerasebkgnd函式,我們遮蔽此呼叫

//return cview::onerasebkgnd(pdc); 

return true;

C 實現雙緩衝

1 在記憶體中申請緩衝區,建立相容記憶體 2 建立位圖,並將點陣圖與緩衝區記憶體相關聯起來 3 在相容記憶體裡繪製 4 將繪製好的點陣圖拷貝到當前裝置 5 釋放相容記憶體。cpoint ptcenter crect rect,ellipserect getclientrect rect ptcent...

如何實現雙緩衝 vc雙緩衝

cdc memdc 首先定義乙個顯示裝置物件 cbitmap membitmap 定義乙個位圖物件 隨後建立與螢幕顯示相容的記憶體顯示裝置 memdc.createcompatibledc null 這時還不能繪圖,因為沒有地方畫 下面建立乙個與螢幕顯示相容的點陣圖,至於點陣圖的大小嘛,可以用視窗的...

vc雙緩衝 VC 雙緩衝實現方法

在圖形圖象處理程式設計過程中,雙緩衝是一種基本的技術。我們知道,如果窗體在響應wm paint訊息的時候要進行複雜的圖形處理,那麼窗體在重繪時由於過頻的重新整理而引起閃爍現象。解決這一問題的有效方法就是雙緩衝技術。因為窗體在重新整理時,總要有乙個擦除原來圖象的過程onerasebkgnd,它利用背景...