在使用VC进行UI开发的时候,绘图是一个比较常见的操作。
网络上有很多关于“双缓冲”绘图的文章。这里就自己使用时出现的问题做个总结,和大家分享
例如:
在视图类(View类)的OnDraw(CDC* pDC)函数中
CDC dcMemeryFirst; //第一个兼容DC
CDC dcMemerySecond; //第二个兼容DC
CBitmap memBmpFirst; //第一张内存Bitmap
dcMemeryFirst.CreateCompatibleDC(pDC); //这里注意,传入的参数是pDC
CRect rect;
GetClientRect(&rect); //获取客户区的大小,在创建兼容位图时,指定位图的大小
memBmpFirst.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
CBrush writeBrush;
writeBrush.CreateSolidBrush(RGB(255,255,255));
dcMemeryFirst.SelectObject(&membmp); //兼容位图选入到兼容dc,这样就可以在该位图上绘制
dcMemeryFirst.FillRect(&rect, &writeBrush); //绘制底色,这里绘制成白色
dcMemerySecond.CreateCompatibleDC(&dcMemery1);
dcMemerySecond.SelectObject(m_bmtmap); //加载位图资源的方式有两种,这里使用的是从资源中加载的
memBmpFirst.BitBlt(m_point.x, m_point.y,110,157, &dcMemerySecond,0,0,SRCCOPY);
//将第二个兼容DC中的内容绘制到,第一个兼容DC
pDC->BitBlt(0,0,rect.Width(), rect.Height(),&memBmpFirst,0,0, SRCCOPY);
//将第一个兼容DC中的内容绘制到,实际DC
memBmpFirst.DeleteObject();
总结:
1.所谓双缓冲技术,就是在绘制的时候不是直接绘制到DC表面。而是首先绘制到兼容DC,然后在贴到实际DC。
2.在使用兼容DC的时候一定要将一个位图对象与之关联,否则绘制不了。
3.如果缺少上面的dcMemeryFirst.FillRect(&rect, &writeBrush); 那么你的兼容位图时黑色的。
分析:
1.为什么时候双缓冲技术?
因为进行大量绘制的时候,下一个绘制状态最终可能与上一个状态差别不是很大,但是这个绘制过程中差距比较大,所以我们在内存中将绘制工作完成,最后使用BitBlt将绘制好的图贴到目标DC中,可以防止闪烁的出现。(例如在一个View中拖动一张图片的时候)
2。为什么使用上述方法,还是出现闪动现象呢?
你可以重载一下OnEraseBkgnd(CDC* pDC)
在该函数中直接 return TRUE;不要总是刷背景,看看是不是OK了?