资源描述:
《如何实现双缓冲》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
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);//在内