雙緩衝的原理可以這樣形象的理解:把電腦螢幕看作一塊黑板。首先我們在記憶體環境中建立乙個「虛擬「的黑板,然後在這塊黑板上繪製複雜的圖形,等圖形全部繪製完畢的時候,再一次性的把記憶體中繪製好的圖形「拷貝」到另一塊黑板(螢幕)上。採取這種方法可以提高繪圖速度,極大的改善繪圖效果。
例如在ondraw()函式中可以如下所述實現雙緩衝,其主要步驟分為四步:
cpen pen;
pen.createpen(ps_insideframe,1,rgb(225,225,0));
cbrush brush;
brush.createsolidbrush(rgb(225,225,0));
cdc dcmem;
cbitmap bm;
crect rc;
getclientrect(&rc);
// step 1:為螢幕dc建立相容的記憶體dc :createcompatibledc()
dcmem.createcompatibledc(pdc);
// step 2:建立位圖:createcompatiblebitmap()
bm.createcompatiblebitmap(pdc,rc.width(),rc.height());
// step 3:把點陣圖選入裝置環境:selectobject(),可以理解為選擇畫布
dcmem.selectobject(&bm);
dcmem.selectobject(pen);
dcmem.selectobject(brush);
dcmem.ellipse(0,0,50,50);//畫橢圓
// step 4:把繪製好的圖形「拷貝「到螢幕上:bitblt()
pdc->bitblt(0,0,rc.width(),rc.height(),&dcmem,0,0,srccopy);
dcmem.deletedc();
bm.deleteobject();
這樣便實現了雙緩衝,通過這個方法可以防止在vc中畫圖時出現螢幕閃爍的情況。
在自己畫的視窗中,有時候會有閃爍現象。為什麼會有閃爍現象呢?其實是因為程式在畫視窗時需要用背景色清空顯示區域,然後再畫。由於這兩者的反差比較大,就會被人眼睛捕捉到,感覺閃爍。
雙緩衝就是先在記憶體中把圖畫好,然後直接複製到螢幕上去,這樣的反差就比較小,也就不覺得閃爍了。
wtl中有現成的雙緩衝類實現,可以很方便的使用就達到效果。
cdoublebufferimpl 在atlframe.h中。
1.首先繼承自cdoublebufferimpl
class2.由於雙緩衝類中已經處理了wm_erasebkgnd 和wm_paint訊息,所以需要從你的**中刪除對這些訊息的處理。然後加上雙緩衝的訊息處理即可。tctrl:
public
cwindowimpl
< tctrl>,
public
wtl::cdoublebufferimpl
// 繼承雙緩衝類
begin_msg_map(tctrl)3.增加乙個dopaint函式,函式宣告如下:// message_handler(wm_paint, onpaint)
chain_msg_map( wtl::cdoublebufferimpl
)end_msg_map()
void4.將原來onpaint函式中的**移到dopaint中,注意原來的cpaintdc需要改用引數中的cdchandlerdopaint(cdchandle dc);
voidok,編譯吧。tctrl::dopaint( cdchandle dc )
vc畫圖不閃爍的方法(雙緩衝技術)
走近wtl--gdi篇
visual c++中實現雙緩衝的基本原理
C 零食 WTL中使用雙緩衝避免閃爍
在自己畫的視窗中,有時候會有閃爍現象。為什麼會有閃爍現象呢?其實是因為程式在畫視窗時需要用背景色清空顯示區域,然後再畫。由於這兩者的反差比較大,就會被人眼睛捕捉到,感覺閃爍。雙緩衝就是先在記憶體中把圖畫好,然後直接複製到螢幕上去,這樣的反差就比較小,也就不覺得閃爍了。wtl中有現成的雙緩衝類實現,可...
零食小餅乾
吃貨的最高境界就是把喜歡吃的東西用自己的雙手做出來 哈哈哈.廢話不多說了,直接開始做餅乾吧!材料 低筋麵粉 554克 糖粉 150克 無鹽黃油 227克 雞蛋 3個 奶粉 60克 1 黃油隔水融化,用打蛋器攪拌均勻。2 分別加入糖粉,奶粉,攪拌均勻。要加糖粉或者糖霜類,這樣才可以融化哦!3 雞蛋分次...
ZZULI 吃零食 貪心
時間限制 1 sec 記憶體限制 128 mb 快要到期末了,pht在這兩天好忙啊。經過幾個小時的奮戰,他終於把實驗報告寫完了,但是他因此錯過了午飯時間,pht覺得自己好餓。這時他發現在旁邊xcp的位置上有好多零食,pht決定偷偷的拿一點他的零食吃 一共有n種零食,每種零食有ai袋 為了使xcp不容...