自己通過嘗試,用修改視圖坐標的方法, 優(yōu)化了雙緩沖繪圖,實現(xiàn)起來并不復雜,。 在介紹這個方法前,重新介紹一下窗口和視口的概念. 下面介紹優(yōu)化方法 網(wǎng)上給出的雙緩沖繪圖方法多是在內(nèi)存中繪出一幅和窗口大小相同的位圖再導入設備.對于滾動窗口,我前些日子寫的日志也給出了方法.這樣做,雖然達到了目 的,但是卻很大程度上的浪費了內(nèi)存資源.比如,窗口大小800*600,滾動窗口1600*800.如果只是刷新了1*1的視口區(qū)域,將需要在內(nèi)存中繪 800*600的位圖,對于滾動窗口,更是需要1600*800的位圖,而只有1*1的區(qū)域是有效的.資源浪費了幾十萬倍.優(yōu)化的方法就是在內(nèi)存中只繪一 幅和刷新區(qū)域同樣大小的位圖. 優(yōu)化步驟: 一.在OnDraw(CDC* pDC)函數(shù)中定義相關變量. 刷新區(qū)域 CRect rc, 兼容DC CDC memDC, 兼容位圖 CBitmap memBmp, 二.調(diào)用GetClipBox(&rc)獲得刷新區(qū)域,注意,獲得的區(qū)域是以邏輯坐標表示的,不是設備坐標,。rc的左上角坐標即兼容DC視口坐標相對邏輯坐標的偏移,,將這個坐標設為兼容DC的視口坐標原點,,這樣不做其它調(diào)整就可以按照邏輯坐標在兼容DC里繪圖了,。這樣繪圖時將邏輯坐標加上偏移量就是兼容DC的設備坐標.調(diào)用CreateCompatibleDC()創(chuàng)建兼容DC,調(diào)用 CreateCompatibleBitmap()創(chuàng)建兼容位圖,調(diào)用SelectObject()導入位圖. 三.繪圖.先調(diào)用FillSolidRect()用指定的顏色刷背景,再判斷下要畫在圖在不在rc范圍內(nèi),如果不在,不畫,畫也沒有意義,畫圖. 四.調(diào)用BitBlt()導入位圖,銷毀位圖對象,DC. 五.最后,響應 WM_ERASEBKGND 消息,直接返回TRUE,取消刷新背景.
說明:雙緩沖繪圖本身都具有一定的復雜性,如果所繪的圖形并不復雜,使用這種方法不會有明顯的效果提升.
很簡單吧,給出示例代碼,在文檔類中保存的矩形對象m_ellipse內(nèi)畫橢圓. void CTest2View::OnDraw(CDC* pDC) BOOL CTestView::OnEraseBkgnd(CDC* pDC) return TRUE; // return CView::OnEraseBkgnd(pDC); } |
|