本帖解決的問題:
如何實現雙緩衝 ?
為什麼實現了雙緩衝還是會閃爍?
以下資料為本人積累和加上自己的經驗
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:
MFC雙緩衝實現閃爍的處理
1 顯示的圖形為什麼會閃爍 我們的繪圖過程大多放在ondraw或者onpaint函式中,ondraw在進行螢幕顯示時是由onpaint進行呼叫的。當視窗由於任何原因需要重繪時,總是先用背景色將顯示區清除,然後才呼叫onpaint,而背景色往往與繪圖內容反差很大,這樣在短時間內背景色與顯示圖形的交替出...
vc雙緩衝 VC 雙緩衝實現方法
在圖形圖象處理程式設計過程中,雙緩衝是一種基本的技術。我們知道,如果窗體在響應wm paint訊息的時候要進行複雜的圖形處理,那麼窗體在重繪時由於過頻的重新整理而引起閃爍現象。解決這一問題的有效方法就是雙緩衝技術。因為窗體在重新整理時,總要有乙個擦除原來圖象的過程onerasebkgnd,它利用背景...
MFC 雙緩衝技術
在做俄羅斯方塊遊戲的時候,遇到遊戲過程中螢幕閃爍問題,解決辦法如下 使用雙緩衝技術解決螢幕閃爍 修改檢視類的ondraw 函式 void cmytetrisview ondraw cdc pdc 修改檢視類的drawimage 函式 cmytetrisview 訊息處理程式 void cmytetr...