首    页 界面/窗口 网络/通讯 数据库 组件开发 图像/多媒体 NET/Web 其它技术 源码下载 资料下载 软件共享 软件外包 曲艺杂谈
栏目导航:  首    页  |  图像/多媒体  |  其它技术   


VC6下的GDI+双缓冲


原作者:yanjie2500(中华阁)    源出处:VC知识库    发布者:施昌权    发布类型:转载    发布日期:2008-09-06

  

  一、 概述

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

  四、结束语

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

点击这里下载源码 

  

关于我们 版权声明 广告服务 联系我们 友情链接 加入收藏
站长:施昌权    Email:scq2099yt@163.com    MSN:scq2099yt@live.cn    QQ:14046300    本站QQ群:67202409
Copyright © 2008     卓为VC(www.joyvc.cn)    All Rights Reserved    建议分辨率 1024×768
本站由施昌权制作维护
京ICP备09012297号