[cpp] view plaincopy // Get the invalidate rectangle CRect clipRect; pDC->GetClipBox(clipRect);
// Create memory device context CDC memDc; memDc.CreateCompatibleDC(pDC); CBitmap memBitmap; memBitmap.CreateCompatibleBitmap(pDC, clipRect.Width(), clipRect.Height());
// Erase the background memDc.FillSolidRect(0, 0, clipRect.Width(), clipRect.Height(), RGB(211, 211, 211));
pDC->BitBlt(clipRect.left, clipRect.top, clipRect.Width(), clipRect.Height(), &memDc, 0, 0, SRCCOPY);
memDc.DeleteDC(); memBitmap.DeleteObject();
下面對以上代碼進行說明: (1)獲得需要繪圖的矩形(Rectangle) 通常使用GetClientRect()函數(shù)獲得整個區(qū)域,。但是,通常情況下并不是整個區(qū)域都要繪制,,比如:你用另一個窗口遮住了需要繪制的窗口的一部分,,當你移動遮擋窗口時,只需要繪制露出的那部分就行了,犯不著把整個窗口都繪制一遍,,這樣效率很低下。我們用CDC::GetClipBox函數(shù)獲得需要繪制的矩形區(qū)域(即無效區(qū)域),。 (2)實現(xiàn)無閃爍的繪圖 想要消除閃爍,,當然首先要知道為什么產(chǎn)生閃爍。那樣我們才知道這樣避免閃爍,。 閃爍是由背景色與繪圖產(chǎn)生強烈反差引起的,。也就是說我在繪圖前先要擦掉我繪圖區(qū)域的以前圖片,否則將會與以前的圖片發(fā)生混亂,,這可以用在黑板上寫字的例子做理解,,如果在我寫字之前,黑板上有字,,那么我在寫字的話,,你保證下面看的人愿意嗎?呵呵,。所以,,我先擦掉原來的字,再寫,。OK,。在計算機中類似,但是我不是用黑板擦,,我是用一種顏色(背景色)涂滿我要繪圖的區(qū)域,,然后再繪圖。這樣,,涂色,,繪圖,涂色,,繪圖.............,,讓人的眼睛產(chǎn)生了閃爍的感覺。那我們要是先把圖畫好,,再顯示出來,,那閃爍的效果就沒了。這類似與動畫片,,大家知道動畫片的每一幀都是一個完整的圖片,,快速播放,是沒有閃爍效果的,。要是在每幀之間插個白色圖片(類似圖背景色),,就有閃爍效果了。 所謂內(nèi)存設(shè)備環(huán)境,就是我們在內(nèi)存中建立一個與物理設(shè)備兼容的設(shè)備環(huán)境,。再創(chuàng)建一個與設(shè)備兼容的位圖,,內(nèi)存設(shè)備環(huán)境在這個位圖上繪圖,然后再把畫好的位圖拷貝到物理設(shè)備環(huán)境,。這樣就是上面我提到的消除閃爍的方法的實現(xiàn),。
// 創(chuàng)建與設(shè)備上下環(huán)境兼容的設(shè)備環(huán)境 CDC memDc;
// 創(chuàng)建一個與設(shè)備兼容的位圖(寬,高與需要繪圖的區(qū)域?qū)?yīng)) CBitmap memBitmap;
// // Erase the background |
|