VC双缓冲绘图小记
在VC下绘图,在放大缩小的时候会引起重绘(废话),但是最近用VC读了一幅图片文件,在我变动窗口大小的时候,视图区域一直闪烁。为了解决这个问题,学了一下双缓冲绘图。
双缓冲绘图的原理不难理解,就是先把图绘制在内存里,然后把整个内存的图像直接复制到视图区域即可。
步骤一屏蔽背景刷新。
背景刷新其实是在响应WM_ERASEBKGND消息。我们在
视类中添加对这个消息的响应,可以看到缺省的代码如下:
BOOL CMYView::OnEraseBkgnd(CDC* pDC)
{
//return CView::OnEraseBkgnd(pDC);
return TRUE;
}
步骤二缓冲绘图
//---------测试双缓存--------- CDC dcMem; //用于缓冲作图的内存DCCBitmap bmp; //内存中承载临时图象的位图 dcMem.CreateCompatibleDC(pDC); //依附窗口DC创建兼容内存DC bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());//创建兼容位图 dcMem.SelectObject(&bmp); //将位图选择进内存DC //按原来背景填充客户区,不然会是黑色 dcMem.FillSolidRect(rect,pDC->GetBkColor()); pPicture->Render(dcMem.m_hDC,0,0,rect.Width(),rect.Height(), 0,nHeight,nWidth,-nHeight,NULL); pDC->BitBlt(0,0,rect.Width(),rect.Height(), &dcMem,0,0,SRCCOPY);//将内存DC上的图象拷贝到前台 dcMem.DeleteDC(); //删除DC //---------end测试------------</pre>
通过上面的方法大体可以实现双缓冲的绘图,不过如果一幅图过大的话(比如我读取了一个4M的jpg图片),在变动窗口大小的时候会出现卡的现象,也就是有点假死的感觉。如果各位看官有什么好方法,请留言告知一声,谢谢。