MFC 双缓冲(double buffering)

  
MFC 双缓冲(double buffering)
把image显示在monitor上有多种方法,最简单的就是把image直接画出,但这样会导致画面闪烁(Flicker)。因为每次更新图片时计算机要erase然后redraw,在这个时间段内观察者会看到上一次的背景,但这个时候本应该是显示下一个frame。要解决这个问题,就可以使用双缓冲Double buffering技术。先把image绘制到后台缓冲,等到全部绘好后再copy到screen中显示。
Draw()
{
    CPaintDC dc(this);
    CDC dcMem;
    dc.CreateCompatibleDC(&dc);
    CBitmap bmp;
    bmp.CreateCompatibleBitmap(&dc,m_Bounds.Width(),m_Bounds.Height());
    CBitmap *pOldBitmap = dcMem.SelectObject(&bmp);
    Draw(&dcMem);
       dc.BitBlt(0,0,m_Bounds.Width(),m_Bounds.Height(),
&dcMem,0,0,SRCCOPY);
    dc.SelectObject(pOldBitmap);
}
We can define macros to make this funcationality easy to reach
#define BEGIN_DOUBLE_BUFFERING(pCWnd, pDc) /
CPaintDC dc(pCWnd);/
CDC dcMem;/
CDC *pDc = &dcMem;
dc.CreateCompatibleDC(&dc);/
CBitmap bmp;/
CRect rc;/
GetClientRect(rc);/
bmp.CreateCompatibleBitmap(&dc,rc.Width(),rc.Height());/
CBitmap *pOldBitmap = dcMem.SelectObject(&bmp);/
#define END_DOUBLE_BUFFERING(pCWnd, pDc) /
   dc.BitBlt(0,0, rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY);/
dc.SelectObject(pOldBitmap);/
Then we can use double buffering like below:
DOUBLE_BUFFERING_BEGIN(this, pDc);
    pDc->TextOutW(20,20,_T("Your drawing logic"),4);
DOUBLE_BUFFERING_END(this, pDc);

你可能感兴趣的:(image,mfc,macros)