mfc下實現雙緩衝的方法

2021-06-26 05:05:26 字數 2489 閱讀 5061

本帖解決的問題:

如何實現雙緩衝 ?

為什麼實現了雙緩衝還是會閃爍?

以下資料為本人積累和加上自己的經驗

1、簡介一下windows mfc的view顯示重新整理過程:

(1)、使用背景刷填充view窗體(呼叫內在機制的);(2)、呼叫onpain()\ondraw(呼叫使用者的);

2、產生閃爍的原因出在於

:當我們很快地重新整理view時,都要執行以上兩步,而使用背景刷時是實時填充的(本人猜想的),所以效率

很低,於是造成執行以上兩步時的時間比人眼的響應時間要長,從而出現了閃爍。

3、解決方案:

我們可以這樣想,mfc自動呼叫背景刷是為了去除舊的資訊,然後讓使用者加上新的資訊(呼叫onpain或ondraw),那麼我們就

把這兩步都自己做吧。其實這兩步我們可以合一,簡單來說就是我們先在一塊記憶體裡面先把東西畫好,然後將它直接複製到view,記憶體複製是

速度很快的,當然我們把背景先要在這快記憶體裡面填充好,這樣我們就在這塊記憶體裡面都把這兩步都搞好了,最後一步就是把它複製到顯示的

buffer裡面了;

4、具體方法:

先生成乙個view窗體:

1)、增加

成員變數

:cbitmap* m_pbitmap; 

//這就是記憶體裡面的畫布了

cdc* m_pmemdc; 

//這就是用於繪製這塊記憶體的畫筆

int 

m_nscreeny; 

//這個畫布的高

int m_nscreenx; 

//這個畫布的寬

2)、然後在view的

【建構函式】裡面

新增以下**(這裡就不注析了,會c++的人都懂):

m_pmemdc=new cdc;

m_pbitmap=new cbitmap;

m_nscreeny=1024;

m_nscreenx=1280;

3)、然後增加訊息響應【wm_create】:

新增:cdc*pdc=getdc();

m_pmemdc->createcompatibledc(pdc); 

//建立記憶體dc

m_pbitmap->createcompatiblebitmap(pdc,m_nscreenx,m_nscreeny); 

//建立記憶體畫布

// m_pbitmap->loadbitmap(makeintresource(idb_bitmap1)); 

//你甚至可以用你的資源位圖作為畫布

cbitmap*poldbitmap=m_pmemdc->selectobject(m_pbitmap); 

//讓m_pmemdc知道要繪製哪塊記憶體

cbrush brush(rgb(255,255,255));

crect rect;

getclientrect(rect);

m_pmemdc->fillrect(crect(rect.left,rect.top,m_nscreenx,m_nscreeny),&brush); 

//這裡相當於我們完成了背景刷

m_pmemdc->selectobject(poldbitmap);

releasedc (pdc);

4)、在ondraw()裡面新增:

crect rect;

getclientrect(rect); 

//獲取當前使用者區的大小

cbitmap*poldbitmap=m_pmemdc->selectobject(m_pbitmap);

drawsomething();//這裡加入你要畫的東西

pdc->bitblt (rect.left ,rect.top ,m_nscreenx,m_nscreeny,m_pmemdc,rect.left ,rect.top ,srccopy); 

//這裡就是將記憶體裡面的

畫布複製到顯示裝置的buffer了

m_pmemdc->selectobject(poldbitmap);

5)、以上其實是完成了雙緩衝機制了,但如果你高速地呼叫invalidate();時,還是會感到很閃爍的,why?我們

忘記去掉內在的背景刷了

,要去掉也是超簡單:

新增訊息響應:wm_erasebkgnd,然後在這個響應函式裡面新增return true;//(記得在return cview::onerasebkgnd(pdc);之上)

6)、大功告成

當然new 了的東西還要delete ,在析構函式裡面再增加: 

delete m_pbitmap;

delete m_pmemdc;

7)、如何drawsomething()

void drawsomething()

5、小結:

想當年(也就一年前),這個東西困擾了我很久了,現在翻出來,為了後來者看看,少走些彎道,高手可以不用理了。

整理by letterb @scnu_cs_05

email: 

[email protected]

MFC雙緩衝實現閃爍的處理

1 顯示的圖形為什麼會閃爍 我們的繪圖過程大多放在ondraw或者onpaint函式中,ondraw在進行螢幕顯示時是由onpaint進行呼叫的。當視窗由於任何原因需要重繪時,總是先用背景色將顯示區清除,然後才呼叫onpaint,而背景色往往與繪圖內容反差很大,這樣在短時間內背景色與顯示圖形的交替出...

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

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

MFC 雙緩衝技術

在做俄羅斯方塊遊戲的時候,遇到遊戲過程中螢幕閃爍問題,解決辦法如下 使用雙緩衝技術解決螢幕閃爍 修改檢視類的ondraw 函式 void cmytetrisview ondraw cdc pdc 修改檢視類的drawimage 函式 cmytetrisview 訊息處理程式 void cmytetr...