Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2086748
  • 博文数量: 909
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 12260
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-06 20:50
文章分类

全部博文(909)

文章存档

2008年(909)

我的朋友

分类:

2008-05-06 22:48:49

一起学习
VC6下的GDI 双缓冲

作者:yanjie2500(中华阁)

下载源代码

一、 概述

  这段时间在研究GDI 双缓冲的实现方法,在网上花了很多时间都没有找到合适的示例,特别是针对VC6的。后来通过对网上资料的分析,和对SDK/MFC的学习,实现了VC6下的GDI 双缓冲,把它写出来与大家分享,希望可以找到更好的实现方法。
  GDI 的一个优点就是可以直接使用jpg图像,在这个示例中,我没有把图像文件放在资源中,而是动态读取,一是由于项目需求,图像数目是未知的;二是由于动态读文件效率低下,使用双缓冲更能体现出优势。

二、 分析

  在实现过程中,犯了一个错误,把读图像的方法放在了OnDraw之中,后来发现拖动滚动条闪烁的很严重,原因在于ScrollBar拖动时会产生消息激活OnDraw,这样的话,每拖动滚动条就读一次文件,重绘一次,效率当然低下了!
  我的实现方式是:更换图像后调用UpdateAllViews,内存DC的绘制都放在OnUpdate中操作,在内存绘制好后再在屏幕中贴图。

// 贴上画布

m_pOldBitmap = m_memDC.SelectObject(&m_memBitmap);

m_memDC.FillSolidRect(0,0,2000,2000,RGB(100,100,100));
// 贴图

CString pStrFullPath = pDoc->m_pStrMapPath   pDoc->m_pStrMapName;

USES_CONVERSION;

LPWSTR wStr = A2W(pStrFullPath);

Image img(wStr);

pDoc->m_nMapWidth = img.GetWidth();

pDoc->m_nMapHeight = img.GetHeight();

Graphics g(m_memDC.GetSafeHdc());

g.DrawImage(&img,0,0,img.GetWidth(),img.GetHeight());
// 恢复

m_memDC.SelectObject(m_pOldBitmap); 

三、截图


图一 GDI 双缓冲效果

四、结束语

  如果大家有更好的方法,请写出来分享。

下载本文示例代码


VC6下的GDI 双缓冲VC6下的GDI 双缓冲VC6下的GDI 双缓冲VC6下的GDI 双缓冲VC6下的GDI 双缓冲VC6下的GDI 双缓冲VC6下的GDI 双缓冲VC6下的GDI 双缓冲VC6下的GDI 双缓冲VC6下的GDI 双缓冲VC6下的GDI 双缓冲VC6下的GDI 双缓冲
阅读(2005) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-05-12 23:43:34

推荐采用WGF双缓冲绘图框架,该框架隐藏了双缓冲绘图细节、可以方便的进行gdi和gdi+混合绘图同时该 框架还对双缓冲绘图进行了优化,详细信息请参考: http://blog.sina.com.cn/s/blog_4e0c21cc0100a33r.html

chinaunix网友2008-08-15 21:23:27

写得不错啊,不过我找到了一个更好的东西,推荐一下。 WGF(windows graphic foundation)为windows下的gdi和gdiplus双缓冲绘图框架。框架在VC6.0下使用C++语言开发而成并以可扩展的MFC动态链接库形式提供,适用于windows操作系统。WGF为完全开源的免费产品,可以用于任何商业的和非商业的用途。 WGF设计的目的是对windows下的gdi和gdiplus双缓冲绘图进行封装和优化。WGF封装了使用gdi和gdiplus进行双缓冲绘图的实现细节,使用框架进行双缓冲绘图时感觉就像是在窗口上绘图一样。同时,WGF通过将绘图内容划分为静态场景和动态场景以及通过采用gdi和gdiplus混合绘图的方式对windows下的gdi和gdiplus绘图进行了优化。 WGF源码和文档下载 地址1:http://download.csdn.net/source/565974 地址2:http://cn.ziddu.com/download/214065/WGF.rar.html 地址3:http://blogimg.chinaunix.net/