您的位置:首页 > Web前端

MFC 双缓冲(double buffering)

2007-11-15 15:47 316 查看
  
[align=center]MFC 双缓冲(double buffering)[/align]
把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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mfc image macros