避免閃爍的方法 OnEraseBkgnd

2021-06-11 10:54:39 字數 2135 閱讀 6486

在圖形圖象處理程式設計過程中,雙緩衝是一種基本的技術。我們知道,如果窗體在響應wm_paint訊息的時候要進行複雜的圖形處理,那麼窗體在重繪時由於過頻的重新整理而引起閃爍現象。解決這一問題的有效方法就是雙緩衝技術。

因為窗體在重新整理時,總要有乙個擦除原來圖象的過程onerasebkgnd,它利用背景色填充窗體繪圖區,然後在呼叫新的繪圖**進行重繪,這樣一擦一寫造成了圖象顏色的反差。當wm_paint的響應很頻繁的時候,這種反差也就越發明顯。於是我們就看到了閃爍現象。

我們會很自然的想到,避免背景色的填充是最直接的辦法。但是那樣的話,窗體上會變的一團糟。因為每次繪製圖象的時候都沒有將原來的圖象清除,造 成了圖象的殘留,於是窗體重繪時,畫面往往會變的亂七八糟。所以單純的禁止背景重繪是不夠的。我們還要進行重新繪圖,但要求速度很快,於是我們想到了使用 bitblt函式。它可以支援圖形塊的複製,速度很快。我們可以先在記憶體中作圖,然後用此函式將做好的圖複製到前台,同時禁止背景重新整理,這樣就消除了閃 爍。以上也就是雙緩衝繪圖的基本的思路。

先按普通做圖的方法進行程式設計。即在視類的ondraw函式中新增繪圖**。在此我們繪製若干同心圓,**如下:

cbcdoc* pdoc = getdocument();

assert_valid(pdoc);

cpoint ptcenter;

crect rect,ellipserect;

getclientrect(&rect);

ptcenter = rect.centerpoint();

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

編譯執行程式,嘗試改變視窗大小,可以發現閃爍現象。

在雙緩衝方法中,首先要做的是遮蔽背景重新整理。背景重新整理其實是在響應wm_erasebkgnd訊息。我們在視類中新增對這個訊息的響應,可以看到缺

省的**如下:

bool cmyview::onerasebkgnd(cdc* pdc) 

是呼叫父類的onerasebkgnd函式,我們遮蔽此呼叫,只須直接return true;即可。

下面是記憶體緩衝作圖的步驟.

cbitmap bit;

bit.loadbitmapa(idb_bitmap1);

bitmap bm;

bit.getbitmap(&bm);

cdc memdc;

memdc.createcompatibledc(pdc);

cbitmap* poldbitmap = memdc.selectobject(&bit);

crect rect;

getclientrect(&rect);

pdc->setstretchbltmode(coloroncolor);//這個模式不設定的話會導致嚴重失真

pdc->stretchblt(0,0,rect.width() ,rect.height(),

&memdc,0,0,bm.bmwidth,bm.bmheight,srccopy);

memdc.selectobject(poldbitmap);

memdc.deletedc();                                      //刪除dc

bm.deleteobject();                                       //刪除位圖

由於複雜的畫圖操作轉入後台,我們看到的是速度很快的複製操作,自然也就消除了閃爍現象。

q: onerasebkgnd函式中返回true或false有什麼區別?

a:true表示已處理背景重新整理,false表示需要在onpaint裡處理

q:在onerasebkgnd中繪製對話方塊的背景和在onpaint中繪製對話方塊的背景由什麼區別,另外onerasebkgnd和ctlcolor有什麼區別?

a:  

onerasebkgnd是在視窗大小發生改變等情況下發生的,它將繪製視窗背景;而onctlcolor是當視窗的控制項需要繪製時發生的,它將繪製視窗的

控制項。a:

onerasebkgnd :在視窗背景需要重繪時呼叫.

onpaint : 此時onerasebkgnd已經呼叫過了,所以在此響應函式體內對背景進行的操作將覆蓋onerasebkgnd中所做的操作.

onctlcolor : 有於在視窗將要被(第一次)繪製時響應,子視窗可以通過發關wm_ctlcolor請求父視窗傳來乙個hbrush.

避免閃爍的方法(OnEraseBkgnd

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

MFC如何避免閃爍

顯示圖形如何避免閃爍,如何提高顯示效率是問得比較多的問題。而且多數人認為mfc的繪圖函式效率很低,總是想尋求其它的解決方案。mfc的繪圖效率的確不高但也不差,而且它的繪圖函式使用非常簡單,只要使用方法得當,再加上一些技巧,用mfc可以得到效率很高的繪圖程式。我想就我長期 呵呵當然也只有2年多 使用m...

閃爍的解決方法

首先給出實現的程式,然後再解釋,同樣是在ondraw cdc pdc 中 cdc memdc 首先定義乙個顯示裝置物件 cbitmap membitmap 定義乙個位圖物件 隨後建立與螢幕顯示相容的記憶體顯示裝置 memdc.createcompatibledc null 這時還不能繪圖,因為沒有地...