2008年(909)
分类:
2008-05-06 22:48:49
下载源代码
一、 概述
这段时间在研究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 双缓冲效果
四、结束语
如果大家有更好的方法,请写出来分享。
下载本文示例代码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/