使用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