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
新方法
在高版本的VS中已经自带了一个CMemDC类,利用这个类可以进行绘图,不必关注双缓冲的细节。PS:高版本=(VS2008SP1以及以后),老版本也有方法,耐心看下去。步骤一 响应WM_ERASEBKGND消息
返回FALSE,这样就不擦除背景了。BOOL CDemoView::OnEraseBkgnd(CDC* pDC)
{
return FALSE;
}
步骤二 在需要作图的地方使用CMemDC
void CDemoView::OnDraw(CDC* pDC)
{
CGestureDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CMemDC dcMem(*pDC, this);
CDC& dc = dcMem.GetDC();
//用dc来绘图就可以实现栓缓冲
……
}
关于低版本VS
在低版本中可以导入一个继承于CDC的类CMemDC,使用的时候需要使用#include "MemDC.h"使用方法与之前的类似,只需要用一个CDC的对象初始化就行。
CMemDC pMemDC(pDC);
此处内容已被隐藏
为了防止资源恶意爬取被和谐,关注微信公众号即可免费解锁
微信扫一扫关注
1. 微信扫码关注公众号,回复 资源下载 获取验证码
2. 在下方输入验证码并提交查看隐藏内容:
也可在微信搜索公众号“麻辣GIS”关注获取
相关阅读
声明
1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。
2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。
手机阅读
公众号关注
知识星球
手机阅读
最新GIS干货
私享圈子
上一篇:VC视图中响应右键菜单































仅有一条评论