分类: C/C++
2008-08-05 14:01:48
这段时间在研究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 双缓冲效果
四、结束语
如果大家有更好的方法,请写出来分享。
下载本文示例代码