如何實現雙緩衝去掉flicker

2021-05-23 14:42:02 字數 1551 閱讀 7936

如何實現雙緩衝

首先給出實現的程式,然後再解釋,同樣是在ondraw(cdc   *pdc)中:

cdc   memdc;   //首先定義乙個顯示裝置物件

cbitmap   membitmap;//定義乙個位圖物件

//隨後建立與螢幕顯示相容的記憶體顯示裝置

memdc.createcompatibledc(null);

//這時還不能繪圖,因為沒有地方畫   ^_^

//下面建立乙個與螢幕顯示相容的點陣圖,至於點陣圖的大小嘛,可以用視窗的大小

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);

//繪圖完成後的清理

membitmap.deleteobject();

memdc.deletedc();

上面的注釋應該很詳盡了,廢話就不多說了。

4、如何提高繪圖的效率

我主要做的是電力系統的網路圖形的cad軟體,在乙個視窗中往往要顯示成千上萬個電力元件,而每個元件又是由點、線、圓等基本圖形構成。如果真要在一次重 繪過程重畫這麼多元件,可想而知這個過程是非常漫長的。如果加上了圖形的瀏覽功能,滑鼠拖**形滾動時需要進行大量的重繪,速度會慢得讓使用者將無法忍受。 怎麼辦?只有再研究研究mfc的繪圖過程了。

實際上,在ondraw(cdc   *pdc)中繪製的圖並不是所有都顯示了的,例如:你在ondraw中畫了兩個矩形,在一次重繪中雖然兩個矩形的繪製函式都有執行,但是很有可能只有乙個 顯示了,這是因為mfc本身為了提高重繪的效率設定了裁剪區。裁剪區的作用就是:只有在這個區內的繪圖過程才會真正有效,在區外的是無效的,即使在區外執 行了繪圖函式也是不會顯示的。因為多數情況下視窗重繪的產生大多是因為視窗部分被遮擋或者視窗有滾動發生,改變的區域並不是整個圖形而只有一小部分,這一 部分需要改變的就是pdc中的裁剪區了。因為顯示(往記憶體或者視訊記憶體都叫顯示)比繪圖過程的計算要費時得多,有了裁剪區後顯示的就只是應該顯示的部分,大大 提高了顯示效率。但是這個裁剪區是mfc設定的,它已經為我們提高了顯示效率,在進行複雜圖形的繪製時如何進一步提高效率呢?那就只有去掉在裁剪區外的繪 圖過程了。可以先用pdc-> getclipbox()得到裁剪區,然後在繪圖時判斷你的圖形是否在這個區內,如果在就畫,不在就不畫。

如果你的繪圖過程不複雜,這樣做可能對你的繪圖效率不會有提高。

如何實現雙緩衝 vc雙緩衝

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

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

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

GDI 雙緩衝實現

gdi 使用雙緩衝繪圖 我再來詳細解釋一下剛才實現雙緩衝的具體步驟 1 在記憶體中建立一塊 虛擬畫布 bitmap bmp new bitmap 600,600 2 獲取這塊記憶體畫布的graphics引用 graphics g graphics.fromimage bmp 3 在這塊記憶體畫布上繪...