闻心阁

一蓑烟雨看苍生,半壶浊酒笑红尘

VC双缓冲绘图小记

2011-10-28 约 1 分钟读完 搬砖秘籍

在VC下绘图,在放大缩小的时候会引起重绘(废话),但是最近用VC读了一幅图片文件,在我变动窗口大小的时候,视图区域一直闪烁。为了解决这个问题,学了一下双缓冲绘图。

双缓冲绘图的原理不难理解,就是先把图绘制在内存里,然后把整个内存的图像直接复制到视图区域即可。

步骤一屏蔽背景刷新。

背景刷新其实是在响应WM_ERASEBKGND消息。我们在
视类中添加对这个消息的响应,可以看到缺省的代码如下:
BOOL CMYView::OnEraseBkgnd(CDC* pDC)
{
//return CView::OnEraseBkgnd(pDC);
return TRUE;
}

步骤二缓冲绘图

//---------测试双缓存---------
		CDC dcMem; //用于缓冲作图的内存DC 
	CBitmap 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图片),在变动窗口大小的时候会出现卡的现象,也就是有点假死的感觉。如果各位看官有什么好方法,请留言告知一声,谢谢。