本文章地址:http://www.jztop.com/dev/vc/2006-02-27/12460.html [点此复制地址]
function copyToClipBoard(){ var clipBoardContent=''; clipBoardContent+="双缓冲技术及其在VC的GDI环境下的实现"; clipBoardContent+='http://www.jztop.com/dev/vc/2006-02-27/12460.html'; window.clipboardData.setData("Text",clipBoardContent); alert("你已复制链接及标题,请粘贴到QQ/泡泡/MSN等发给好友!"); }
<iframe align="left" marginwidth="0" marginheight="0" src="http://www.jztop.com/js/html/ggad01.html" frameborder="0" width="300" scrolling="no" height="250"></iframe>
昨天在论坛上,有人问起双缓冲的实现问题,想起网上这方面资料比较凌乱,而且多是 DirectX 相关的,今天特地在这里给大家简要的介绍一下双缓冲技术及其在 VC++ 的 GDI 绘图环境下的实现。
1、Windows 绘图原理
我们在 Windows 环境下看到各种元素,如菜单、按钮、窗口、图像,从根本上说,都是“画”出来的。这时的屏幕,就相当于一块黑板,而 Windows 下的各种 GDI 要素,如画笔、画刷等,就相当于彩色粉笔了。我们在黑板上手工画图时,是一笔一划的,电脑亦然。只不过电脑的速度比手工快的太多,所以在我们看起来好像所有的图形文字都是同时出现的。
2、普通绘图方式的局限
上述绘图方式我们暂且称之为普通绘图方式吧。虽然这种方式能满足相当一部分的绘图需要,但是当要绘制的对象太复杂,尤其是含有位图时,电脑便力不从心了。这时的画面会显示的很慢,对于运动的画面,会给人“卡”住了的感觉,总之一个字:不爽。
3、解决之道:双缓冲
双缓冲的原理可以这样形象的理解:把电脑屏幕看作一块黑板。首先我们在内存环境中建立一个“虚拟“的黑板,然后在这块黑板上绘制复杂的图形,等图形全部绘制完毕的时候,再一次性的把内存中绘制好的图形“拷贝”到另一块黑板(屏幕)上。采取这种方法可以提高绘图速度,极大的改善绘图效果。下面是原理图:
图一 双缓冲原理示意图
4、相关的函数介绍
1)、为屏幕 DC 创建兼容的内存 DC:CreateCompatibleDC()
if(!m_dcMemory.CreateCompatibleDC(NULL)) // CDC m_dcMemory; { ::PostQuitMessage(0); }
2)、创建位图:CreateCompatibleBitmap()
m_Bmp.CreateCompatibleBitmap(&m_dcMemory, rt.Width(), rt.Height()); // CBitmap m_Bmp;
3)、把位图选入设备环境:SelectObject(),可以理解为选择画布
::SelectObject(m_dcMemory.GetSafeHdc(), m_Bmp);
4)、把绘制好的图形“拷贝“到屏幕上:BitBlt()
pdcView->BitBlt(0, 0, rt.Width(), rt.Height(), &m_dcMemory, 0, 0, SRCCOPY);
函数的具体用法详见 MSDN。有一句话我重复了多遍,再说一遍也无妨:MSDN是最好的老师。
5、本文给出了一个例子,用效果对比的方法说明普通绘图方式的局限和双缓冲技术的好处。
这个例子在一个 View 上画出很多半径渐变的圆,大家可以注意两种不同的绘图方式下动画的效果:
<iframe align="center" marginwidth="0" marginheight="0" src="http://www.jztop.com/js/view2.html" frameborder="0" width="730" scrolling="no" height="30"></iframe>
分享到:
相关推荐
双缓冲的原理可以这样形象的理解:把电脑屏幕看作一块黑板。首先我们在内存环境中建立一个“虚拟“的黑板,然后在这块黑板上绘制复杂的图形,等图形全部绘制完毕的时候,再一次性的把内存中绘制好的图形“拷贝”到另...
通过学习这个例子,开发者可以更好地理解和掌握如何在VC6环境下利用GDI+双缓冲技术来优化图形更新,提升程序的视觉效果。 总的来说,GDI+双缓冲技术在解决Windows应用程序中的闪烁问题上发挥了重要作用。对于开发者...
(vc6.0下GDI绘图)双缓冲实现彩色画图,c++实现。。。之前的那个只能黑白画图,调试了很久,终于明白,getdc不能保存为全局变量,因为getdc即使在同一个类中得到dc也不一样。。。。代码实现后,能进行彩色双缓冲...
在VC6,这个古老的Visual C++ 6.0环境中,尽管它已经不再支持最新的编程特性,但仍然可以通过GDI+来实现双缓冲技术。 双缓冲的基本思想是将所有的绘图操作先在内存中的一个位图上完成,然后再一次性地将这个位图...
后来通过对网上资料的分析,和对SDK,MFC的学习,实现了VC6下GDI+双缓冲的效果,把它写出来与大家分享,希望可以找到更好地实现方法。 想必大家对双缓冲的原理有了一定的了解,以前我也做过GDI双缓冲的项目,网上的...
在压缩包的文件名列表中,"GDI_Demo"很可能是一个示例程序,它演示了如何在VC环境下利用GDI进行双缓冲位图显示,以及如何避免闪烁和实现基本的绘图功能。这个示例可能包含了源代码、头文件、资源文件等,开发者可以...
为了解决这一问题,本文将详细介绍如何在Visual C++环境下运用双缓冲技术实现无闪烁的高效绘图。 #### 二、绘图基础与绘图工具类 在深入探讨双缓冲技术之前,我们首先需要了解一些基本的绘图概念和工具类。 #####...
对如何在VC环境下使用gdi+进行双缓冲绘图进行了阐述
双缓冲技术是图形编程中的一种优化策略,尤其在VC++环境下,它被广泛应用于窗口系统中的动态绘图,以避免屏幕闪烁和不连续更新的问题。本文将深入探讨双缓冲技术的概念、工作原理以及在VC++中的实现方法。 双缓冲...
本文将深入探讨双缓冲的概念,以及如何在VC++环境中实现它。 双缓冲,顾名思义,就是使用两个缓冲区来处理图形绘制。在传统的单缓冲机制中,当屏幕上的图形发生变化时,直接在屏幕上绘制新的图像,这可能导致部分已...
双缓冲技术在计算机图形学和GUI编程中是一种重要的优化手段,尤其在Visual C++(简称VC)环境下,它能显著提升界面更新的平滑度和效率。本文将深入探讨如何在VC环境中实现双缓冲技术,并以滚动树叶的动画效果为例...
在本文中,我们将深入探讨如何在Visual C++ 6.0环境下使用GDI(Graphics Device Interface)技术实现图片播放的特效,类似于PowerPoint中的动画效果。GDI是Windows API的一部分,为开发者提供了丰富的图形绘制功能,...
GDI+绘制文字使用Graphics::DrawString函数,其中的brush参数可以使用透明度,通过控制该透明...为了减少闪烁,采用双缓冲绘制,即将文字在后台先绘制好,然后整体拷贝到屏幕(前台)上。程序示例在VC2010下编译通过。
在VC++编程环境中,"vc mtc GDI+ 双缓存画图板"是一个涉及到图形用户界面(GUI)开发的技术点。这个标题暗示我们将会讨论如何使用Microsoft的多线程类库(MTL,Multithreaded Apartment)以及GDI+图形库来实现一个双...
在Windows编程中,双缓冲绘图是一种优化图形绘制性能的技术,尤其在进行复杂图形操作时效果显著。在VC++环境中,这种技术可以有效地避免屏幕闪烁,提高用户体验。本文将深入探讨双缓冲绘图的原理以及如何在VC++中...
压缩包中的文件"VC6下地GDI+双缓冲.mht"很可能是一个MHTML(多用途互联网邮件扩展)文件,它包含了HTML和相关的资源,可能是一个示例代码或者教程,用于展示如何在VC++ 6.0环境下具体实现GDI+的双缓冲技术。...
在计算机编程领域,尤其是涉及到图形用户界面(GUI)开发时,"双缓冲"技术是一种常见的优化手段,用于解决图像更新时出现的...通过研究源码,我们可以学习到如何在C++环境中实现双缓冲机制,提升我们的图形编程技能。
VC 2010开发,Win32程序,无需MFC支持. 看完这个例子,你至少能掌握以下知识点 (1) GDI和GDI+的混合编程 (2) 坐标旋转,窗口和视口的关系 (3) 映射模式 (4) 双缓冲技术避免窗体闪烁 ...
在VC++环境中,滚动视图双缓冲绘图是一种优化图形绘制效率的技术,它主要用于解决GDI(Graphics Device Interface)在连续或频繁更新视图时可能出现的闪烁问题。本项目通过`PaintWithDoubleBuffer`相关源文件实现了...
这个“VC双缓冲技术作曲线例子 修正版”是针对Visual C++(VC)环境下的一个编程示例,用于演示如何在Windows应用程序中使用双缓冲技术来平滑地绘制曲线。之前的版本可能存在一些问题,但经过修正,现在的代码应该能...