程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> CDC雙緩沖繪制與InvalidateRect

CDC雙緩沖繪制與InvalidateRect

編輯:關於C語言

使用MFC的雙緩沖技術繪制圖形時往往忽略一個細節---->對InvalidateRect函數的支持。


我們知道為了提高繪制效率,往往只對需要繪制的區域進行重繪,即調用InvalidateRect。


一般情況下的OnPaint處理代碼是:

CWnd::OnPaint()

{

   CPaintDC    dc(this);

   CMemoryDC    memDC(&dc);


   // 使用memDC進行繪制

   DrawByMemoryDC(&memDC);

   // 拷貝至CPaintDC中

   dc.Bilt(memDC);

}


這裡CPaintDC會對InvalidateRect函數傳進來的Rect參數進行處理,未在Rect的區域不會進行像素繪制和拷貝操作,但是我們的CMemoryDC卻沒有這樣的處理,因此雙緩沖實現的效率很低。


為了解決這個問題,可以采用如下方法,將不需要繪制的區域裁剪出去:

CRect invalidateRect = dc.m_ps.rcPaint;    //dc為CPaintDC


if (invalidateRect.left > m_rtClient.left) //m_rtClient為客戶區大小

{

CRect leftClipRect(m_rtClient.left, m_rtClient.top, invalidateRect.left, m_rtClient.bottom);

memDC.ExcludeClipRect(leftClipRect);

}


if (invalidateRect.top > m_rtClient.top)

{

CRect topClipRect(invalidateRect.left, m_rtClient.top, invalidateRect.right, invalidateRect.top);

memDC.ExcludeClipRect(topClipRect);

}


if (invalidateRect.bottom < m_rtClient.bottom)

{

CRect bottomClipRect(invalidateRect.left, invalidateRect.bottom, invalidateRect.right, m_rtClient.bottom);

memDC.ExcludeClipRect(bottomClipRect);

}


if (invalidateRect.right < m_rtClient.right)

{

CRect rightClipRect(invalidateRect.right, m_rtClient.top, m_rtClient.right, m_rtClient.bottom);

memDC.ExcludeClipRect(rightClipRect);

}


本文出自 “愛上層樓” 博客,請務必保留此出處http://mmmn143.blog.51cto.com/2541616/1266181

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved