MFC 双缓冲技术和兼容DC

来源:互联网 发布:从中国回国的老外 知乎 编辑:程序博客网 时间:2024/05/21 09:02

本文整理自网络。

一、绘图时屏幕闪烁的原因分析:

       屏幕闪烁的根本原因是相邻两帧图像之间存在的巨大差异造成的,而windows的图形刷新方式使得任何两帧图像之间都存在着巨大的差异。因为windows在进行刷新之前都会首先将整个屏幕刷成白色,就相当于在电影胶片的相邻两帧之间都插入了一个白色的帧,这也就是为什么屏幕闪烁时总是看到一个隐约的白色窗口在闪烁而不是一个红色的窗口在闪烁。双缓冲图形刷新避免了windows刷新的问题,其没有在连续的两帧之间插入白色的帧,从而解决了屏幕闪烁的问题。

二、双缓冲图形刷新的原理

        传统的绘图方式实际上是一种单缓冲,在windows中每一种设备都在内存中有一个设备描述表(DC)与其对应,这个设备描述表实际上就是一个内存缓冲区。传统的绘图中我们是将图形绘制在设备描述表缓冲区中,然后由gdi自动的将设备描述表中的图像拷贝到显存中进行显示。这样一个自动的拷贝过程屏蔽了传统的绘图方式是单缓冲的实质,使我们感觉到我们是在直接操纵显存一样。双缓冲图形刷新技术在内存中有两片缓存,除了设备描述表以外还有一个需要手动建立的与设备描述表缓冲区(前端缓冲区)相兼容的后备缓冲区(兼容DC)。绘图过程中,首先将图形绘制在后备缓冲区中,然后在手动的将后备缓冲区中的图像拷贝到前端缓冲区中,再由gdi自动将前端缓冲区中的图像拷贝到显存完成图形的显示过程。
三、双缓冲图形刷新的实现步骤
1、创建兼容DC。
2、创建位图并加载图片,并调入兼容DC中。(没有位图的设备描述表是不能绘图的)
3、将内存设备描述表中的内容拷贝到窗口设备描述表
4、释放设备描述表句柄、位图等资源

例子:

      在vc 6.0中结合mfc实现双缓冲图形刷新技术

1、首先在OnDraw()或者OnPaint()中添加下列代码
[cpp] view plaincopy
  1. void OnDraw(CDC *pDC)  
  2. {  
  3. //定义一个内存设备描述表对象(即后备缓冲区)  
  4. CDC MemDC;   
  5. //定义一个位图对象  
  6. CBitmap MemBitmap;  
  7. //建立与屏幕设备描述表(前端缓冲区)兼容的内存设备描述表句柄(后备缓冲区)  
  8. MemDC.CreateCompatibleDC(pDC);  
  9. //这时还不能绘图,因为没有位图的设备描述表是不能绘图的  
  10. //下面建立一个与屏幕设备描述表(或者内存设备描述表)兼容的位图  
  11. MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);  
  12. //将位图选入到内存设备描述表  
  13. //只有选入了位图的设备描述表才有地方绘图,画到指定的位图上  
  14. CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);  
  15. //先用背景色将位图清除干净,这里我用的是白色作为背景  
  16. //你也可以用自己应该用的颜色  
  17. MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));  
  18. //绘图  
  19. MemDC.MoveTo(……);  
  20. MemDC.LineTo(……);  
  21. //将后备缓冲区中的图形拷贝到前端缓冲区  
  22. pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);  
  23. //绘图完成后的清理  
  24. MemBitmap.DeleteObject();  
  25. MemDC.DeleteDC();  
0 0
原创粉丝点击