1、雙緩衝技術的應用html
當數據量很大時,繪圖可能須要幾秒鐘甚至更長的時間,並且有時還會出現閃爍現象,爲了解決這些問題,可採用雙緩衝技術來繪圖。咱們知道,若是窗體在響應WM_PAINT消息的時候要進行復雜的圖形處理,那麼窗體在重繪時因爲過頻的刷新而引發閃爍現象。解決這一問題的有效方法就是雙緩衝技術。由於窗體在刷新時,總要有一個擦除原來圖象的過程OnEraseBkgnd,它利用背景色填充窗體繪圖區,而後在調用新的繪圖代碼進行重繪,這樣一擦一寫形成了圖象顏色的反差。當WM_PAINT的響應很頻繁的時候,這種反差也就愈加明顯。因而咱們就看到了閃爍現象。函數
咱們會很天然的想到,避免背景色的填充是最直接的辦法。可是那樣的話,窗體上會變的一團糟。由於每次繪製圖象的時候都沒有將原來的圖象清除,造 成了圖象的殘留,因而窗體重繪時,畫面每每會變的亂七八糟。因此單純的禁止背景重繪是不夠的。咱們還要進行從新繪圖,但要求速度很快,因而咱們想到了使用 BitBlt函數。它能夠支持圖形塊的複製,速度很快。咱們能夠先在內存中做圖,而後用此函數將作好的圖複製到前臺,同時禁止背景刷新,這樣就消除了閃 爍。以上也就是雙緩衝繪圖的基本的思路。code
2、雙緩衝技術的實現步驟htm
雙緩衝即在內存中建立一個與屏幕繪圖區域一致的對象,先將圖形繪製到內存中的這個對象上,再一次性將這個對象上的圖形拷貝到屏幕上,這樣能大大加快繪圖的速度。雙緩衝實現過程以下: 對象
一、在內存中建立與畫布一致的緩衝區blog
二、在緩衝區畫圖內存
三、將緩衝區位圖拷貝到當前畫布上get
四、釋放內存緩衝區it
首先給出實現的程序,而後再解釋,一樣是在OnDraw(CDC *pDC)中: class
CDC MemDC; //首先定義一個顯示設備對象
CBitmap MemBitmap;//定義一個位圖對象 //隨後創建與屏幕顯示兼容的內存顯示設備
MemDC.CreateCompatibleDC(NULL); //這時還不能繪圖,由於沒有地方畫 ^_^
//下面創建一個與屏幕顯示兼容的位圖,至於位圖的大小嘛,能夠用窗口的大小,也能夠本身定義
(如:有滾動條時就要大於當前窗口的大小,在BitBlt時決定拷貝內存的哪部分到屏幕上)
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); //將位圖選入到內存顯示設備中 //只有選入了位圖的內存顯示設備纔有地方繪圖,畫到指定的位圖上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); //先用背景色將位圖清除乾淨,這裏我用的是白色做爲背景 //你也能夠用本身應該用的顏色
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); //繪圖
MemDC.MoveTo(……); MemDC.LineTo(……); //將內存中的圖拷貝到屏幕上進行顯示
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); //繪圖完成後的清理 //把前面的pOldBit選回來.在刪除MemBitmap以前要先從設備中移除它
MemDC.SelectObject(pOldBit); MemBitmap.DeleteObject(); MemDC.DeleteDC(); 雙緩衝(two way soft-closing)
相關連接:
http://www.cnblogs.com/afarmer/archive/2012/03/31/2427315.html