如何实现双缓冲

如何实现双缓冲

ID:40823093

大小:17.04 KB

页数:4页

时间:2019-08-08

如何实现双缓冲_第1页
如何实现双缓冲_第2页
如何实现双缓冲_第3页
如何实现双缓冲_第4页
资源描述:

《如何实现双缓冲》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、如何实现双缓冲  双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。双缓冲实现过程如下:1、在内存中创建与画布一致的缓冲区2、在缓冲区画图3、将缓冲区位图拷贝到当前画布上4、释放内存缓冲区     (1)在内存中创建与画布一致的缓冲区CDC dc;//这是窗口的DC,假设已加载好  CDCMemDC;  //创建内存中的一个临时dc-MemDC,MemDC用来向窗口绘图的“草稿”      //随后建立与屏幕显示兼容的内存显示设备    MemDC.CreateCompatibleDC(&dc

2、); //这时还不能绘图,因为没有地方画   ^_^   //创建的临时空白bitmap作为“画布”,至于位图的大小,可以用窗口的大小 CBitmapMemBitmap;   MemBitmap.CreateCompatibleBitmap(&dc,nWidth,nHeight);     //只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上    CBitmap  *pOldBit=MemDC.SelectObject(&MemBitmap);//将上面创建的临时“画布”MemBitmap与MemDC连接,注意此处的MemBitmap为一个空白临时画布, 可以在这个空白画布上自绘

3、图,也可以在这个画布上加载图片     //先用背景色将位图清除干净,这里我用的是白色作为背景    //你也可以用自己应该用的颜色    MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));    (2)在缓冲区画图   MemDC.MoveTo(……);   MemDC.LineTo(……); (2)'在第(2)步中,如果不是自绘图,而是加载一个位图,则需要再定义一个临时dc-MemDC2,用来将位图加载到上面建立的空白画布MemDC中CBitmap p1;//这是要画的位图,假设已加载好CDCMemDC2;MemDC2.Cr

4、eateCompatibleDC(&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请

5、自行设置其次,将草稿绘制到屏幕上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();//获得矩形的中心点,目的是为了确定

6、后面同心圆图像的圆心//CDCdcMem;//创建用于缓冲作图的内存DC对象dcMem//CBitmapbmp;//创建内存中存放临时图像的位图对象bmp//dcMem.CreateCompatibleDC(pDC);//依附窗口DC(窗口对象为pDC),创建兼容内存DC(就是创建一个内存DC,所有图形先画在这上面)//bmp.CreateCompatibleBitmap(&dcMem,rect.Width(),rect.Height());//在兼容内存DC上,创建兼容位图//dcMem.SelectObject(&bmp);//将位图选入内存DC//dcMem.FillSolidRect

7、(rect,pDC->GetBkColor());//按照原有背景色填充客户区,否则会成为黑色,同时也使内存DC的背景色保持一致////绘图操作//for(inti=60;i>0;--i)//{//ellipseRect.SetRect(ptCenter,ptCenter);//ellipseRect.InflateRect(i*5,i*5);//dcMem.Ellipse(ellipseRect);//在内

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。