- 1、本文档共4页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
如何实现双缓冲
如何实现双缓冲??双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。双缓冲实现过程如下:1、在内存中创建与画布一致的缓冲区2、在缓冲区画图3、将缓冲区位图拷贝到当前画布上4、释放内存缓冲区?????(1)在内存中创建与画布一致的缓冲区CDC?dc;//这是窗口的DC,假设已加载好??CDC MemDC; ??//创建内存中的一个临时dc-MemDC,MemDC用来向窗口绘图的“草稿”??????//随后建立与屏幕显示兼容的内存显示设备????MemDC.CreateCompatibleDC(dc); ?//这时还不能绘图,因为没有地方画???^_^ ???//创建的临时空白bitmap作为“画布”,至于位图的大小,可以用窗口的大小?CBitmap MemBitmap;???MemBitmap.CreateCompatibleBitmap(dc,nWidth,nHeight); ?????//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上????CBitmap ??*pOldBit=MemDC.SelectObject(MemBitmap); //将上面创建的临时“画布”MemBitmap与MemDC连接,注意此处的MemBitmap为一个空白临时画布,?可以在这个空白画布上自绘图,也可以在这个画布上加载图片?????//先用背景色将位图清除干净,这里我用的是白色作为背景????//你也可以用自己应该用的颜色????MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); ????(2)在缓冲区画图???MemDC.MoveTo(……); ???MemDC.LineTo(……); ?(2)在第(2)步中,如果不是自绘图,而是加载一个位图,则需要再定义一个临时dc-MemDC2,用来将位图加载到上面建立的空白画布MemDC中CBitmap?p1;//这是要画的位图,假设已加载好CDC MemDC2;MemDC2.CreateCompatibleDC(dc);MemDC2.SelectObject(p1);// MemDC2与图片链接//在这里,p1保存的是要加载到临时空白画布上的图片,MemDC2是与p1链接的dc(3)将缓冲区位图拷贝到当前画布(屏幕)上?dc.BitBlt(0,0,nWidth,nHeight,MemDC,0,0,SRCCOPY); (3)’如果是位图的话首先,将与MemDC2链接的位图p1拷贝到临时空白画布MemDC中MemDC.BitBlt(x,y,width,height, MemDC2,0,0,SRCCOPY);?//向草稿绘制第一张图片,x,y,width,height请自行设置其次,将草稿绘制到屏幕上dc.BitBlt(0,0,width,height,MemDC,0,0,SRCCOPY);(4)释放内存缓冲区??//绘图完成后的清理????MemBitmap.DeleteObject(); ???MemDC.DeleteDC(); ?MemDC2.DeleteDC();下面是一个不使用和使用双缓存的例子使用双缓存//CPointptCenter;//CRectrect, ellipseRect;//GetClientRect(rect); //获得窗口客户区的大小//ptCenter = rect.CenterPoint(); //获得矩形的中心点,目的是为了确定后面同心圆图像的圆心//CDC dcMem; // 创建用于缓冲作图的内存DC对象dcMem//CBitmap bmp; // 创建内存中存放临时图像的位图对象bmp//dcMem.CreateCompatibleDC(pDC); // 依附窗口DC(窗口对象为pDC),创建兼容内存DC(就是创建一个内存DC,所有图形先画在这上面)//bmp.CreateCompatibleBitmap(dcMem, rect.Width(), rect.Height());// 在兼容内存DC上,创建兼容位图//dcMem.SelectObject(bmp); // 将位图选入内存DC//dcMem.FillSolidRect(rect, pDC-GetBkColor());// 按照原有背景色填充客户区,否则会成为黑色,同时也使内存DC的背景色保持一致//// 绘图操作//for (inti = 60; i 0; --i)//{//ellipseRec
文档评论(0)