Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9547337
  • 博文数量: 1227
  • 博客积分: 10026
  • 博客等级: 上将
  • 技术积分: 20273
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-16 12:40
文章分类

全部博文(1227)

文章存档

2010年(1)

2008年(1226)

我的朋友

分类: C/C++

2008-04-23 22:07:59

VC6下的GDI 双缓冲

作者:



一、 概述

  这段时间在研究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 双缓冲效果

四、结束语

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

阅读(1456) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~