关闭

双缓存

791人阅读 评论(0) 收藏 举报
CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象


//随后建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(NULL);
//这时还不能绘图,因为没有地方画 ^_^
//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);


//将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);


//先用背景色将位图清除干净,这里我用的是白色作为背景
//你也可以用自己应该用的颜色
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));


//绘图
MemDC.MoveTo(……);
MemDC.LineTo(……);


//将内存中的图拷贝到屏幕上进行显示
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);


//绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();


补充说明PS:

    你完全没有理解什么是双缓存。。。。
这里所说的双缓存实际上就是双页面(双DC),也就是说我们需要两个DC。
第一个DC,你已经提供了,那就是传入Draw函数的pDC,这个DC就是主页面,任何在该页面上的操作都会直接展现给用户。
但我们还需要另一个DC,这个DC就是离屏页面,对该页面的操作不会直接展出给用户,所有绘图操作都必须在该页面上进行。
不要说你已经提供了一个,你所写的memDC只是个局部DC,作用微乎其微,甚至可能还会使效率下降。
离屏DC应该是与你的CImage的对象的生命周期相同,通常的实现就是为你的CImage添加两个成员:
CDC m_offscreenDC; CBitmap m_offscreenBitmap;,
在你的CImage构造时就初始化好m_offscreenBitmap和m_offscreenDC,剩下的就是,
所有的绘图操作都输出只输出到m_offscreenDC上,你的Draw函数只需要一个函数,
那就是BitBlt,只需要简单的把m_offscreenDC上的内容blt到pDC上。。。



0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

MFC双缓存绘图实现

1. 前言 之前有一篇博客记录了如何在MFC的视图窗口上绘制图像,但是在后来的实际运行中出现了难以忍受的显示区域闪烁现象。产生这样问题的原因是频繁刷新视图窗口,且在当绘图操作复杂度越来越高的情况下越严重。在这样的情况下就要使用双缓存技术来缓解绘图区域闪烁的情况。所谓双缓存技术就是:使用内存缓冲区来解...
  • m_buddy
  • m_buddy
  • 2016-11-17 09:32
  • 1507

双缓存显示问题以及图片

void OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) { if (!pdc) return; CClientDC dc(this); CRect rect; GetClientRec...
  • angellove156
  • angellove156
  • 2014-08-18 16:36
  • 841

双缓冲(Double Buffer)原理和使用

一、双缓冲作用            双缓冲甚至是多缓冲,在许多情况下都很有用。一般需要使用双缓冲区的地方都是由于“生产者”和“消费者”供需不一致所造成的。这样的情况在很多地方后可能会发生,使用多缓冲可以很好的解决。我举几个常见的例子: ...
  • acs713
  • acs713
  • 2013-11-16 18:50
  • 27299

OpenGL单缓冲与双缓冲的区别

单缓冲,实际上就是将所有的绘图指令在窗口上执行,就是直接在窗口上绘图,这样的绘图效率是比较慢的,如果使用单缓冲,而电脑比较慢,你回到屏幕的闪烁。 双缓冲,实际上的绘图指令是在一个缓冲区完成,这里的绘图非常的快,在绘图指令完成之后,再通过交换指令把完成的图形立即显示在屏幕上,这就避免...
  • heyuchang666
  • heyuchang666
  • 2017-04-07 10:50
  • 925

stretchblt、bitblt对双缓存的应用

RECT rect; HDC dc = GetWindowDC(_wndPic); HDC memdc = CreateCompatibleDC(dc); HDC imagedc = CreateCompatibleDC(dc); GetClientRect(_wndPic, &re...
  • u010602606
  • u010602606
  • 2015-07-29 17:13
  • 412

双缓冲是怎么提速的

转自 多缓冲技术对于速度要求比较高的图形系统,或者是经常快速更换显示内容的程序比较有效。 1 从显示流程来说   通常是清理背景,然后重新绘制,如果直接在屏幕上进行清理背景往往会造成闪烁。   为了解决这种现象,程序往往是把要更新的内容直接写在一个全新的缓冲当中,...
  • wdjhzw
  • wdjhzw
  • 2014-09-18 22:10
  • 816

双缓冲技术讲解

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。CSDN视频网址:http://edu.csdn.net/lecturer/144...
  • jxw167
  • jxw167
  • 2017-05-15 17:49
  • 2267

MFC VC 双缓冲绘图基本原理与实现,详细解释

MFC VC 双缓冲绘图基本原理与实现,详细解释 MFC做了一些时间了,不得不面对 的是在界面上画图的。 当然你可以直接搜索到能用的代码,并且基本能满足要求。不过这样总不是学习的态度。本着学习分享的态度,现做一些基本的分析吧。 在MSDN上知道,我们画图的对象都是窗口的DC,WINDOWS...
  • foreverhuylee
  • foreverhuylee
  • 2014-03-19 18:10
  • 11916

C++ GDI+ 双缓存技术实现

转载地址:http://cnbeta2004.blog.163.com/blog/static/602313402010119104451537/ 早前曾为此问题在CSDN发帖求助(GDI+ 如何使用双缓冲绘制图像),得到了一个GDI+下较可行的方法,虽然绘制效果比直接绘制要好一些...
  • aoshilang2249
  • aoshilang2249
  • 2014-07-31 17:20
  • 2028

Canvas 与 双缓冲 相关文章

作者:严天宇 链接:http://www.zhihu.com/question/25036663/answer/29881637 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 对于CANVAS绘制性能提高问题,可以考虑使用“双缓冲”技巧。 CANVAS图像传统绘制是这个样子的...
  • for_cxc
  • for_cxc
  • 2016-07-27 13:13
  • 873
    个人资料
    • 访问:330462次
    • 积分:4905
    • 等级:
    • 排名:第6768名
    • 原创:106篇
    • 转载:387篇
    • 译文:0篇
    • 评论:20条
    最新评论