你用雙緩存就可以解決閃爍而又不花屏了.
在屏幕上繪製圖形時經常出現桌面閃爍的情況,在圖形較多的時候更是如此。這是因爲Windows程序在重繪窗口以前總是要先用當前系統的背景色將窗口刷乾淨。然後再調用視圖類的OnPaint函數,用OnDraw函數將窗口內的所有圖形重繪一遍。閃爍現象是因爲屏幕上的圖像前後反差太大而造成的。要消除閃爍現象首先就要禁止程序用背景色刷屏。要達到這一目的,只要使視圖類的OnEraseBkgnd函數的返回值爲TRUE就行了。可是這樣一來屏幕很快就會亂掉,除非在OnDraw函數中用背景色將窗口內以前的東西刷乾淨。但如果這樣做的話就和沒有設置OnEraseBkgnd函數的效果一樣了。不過這樣做了以後刷除背景的權利就掌握在了自己手中。
前面已經討論過了閃爍現象出現的原因,如果能使屏幕上前後的圖像相差很小就不會有閃爍現象了。其實每次要在屏幕上繪製的整個圖像與前面的圖像相差都很小。但是由於繪圖過程有時間延遲,使得整個圖像被分成一個個反差很大圖像。如果將所有異步輸出的圖像同步顯示出來,那麼問題就解決了。這也正是屏幕雙緩存的工作原理。
所謂雙緩存,是指屏幕緩存和內存緩存。屏幕緩存中存有前面繪製的圖像,內存緩存中存有當前要繪製的圖像。屏幕重繪時只顯示內存緩存中的東西,這樣一來消除閃爍現象的條件就滿足了。
兩個緩存中只有內存緩存是需要自己創建的。在程序裏它被建在了OnDraw函數中:
CBitmap   bitmap;
bitmap.CreateCompatibleBitmap   (pDC,nBmpWidth,nBmpHight);
CDC   dcMem;
dcMem.CreateCompatibleDC   (pDC);
CBitmap*   pOldBitmap   =   dcMem.SelectObject   (&bitmap);

用dcMem畫圖

pDC->BitBlt   (0,   0,(int)(pDoc->m_WEworkEnviroment.GetActualDeskWidth()*fProportion),   (int)(pDoc->m_WEworkEnviroment.GetActualDeskHight()*fProportion),   &dcMem,   0,   0,SRCCOPY);
這裏使用一張DDB位圖作爲內存緩存。
首先用CBitmap類的CreateCompatibleBitmap函數創建位圖,然後用CDC類的CreateCompatibleDC函數創建一張內存設備描述表,並將位圖選入其中,完成位圖與內存的綁定。這以後圖形都被畫在內存設備描述表中。最後用屏幕設備描述表調用BitBlt函數將內存中的位圖貼到屏幕上。
這樣雙緩存就實現了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章