VC++双缓冲之实现

VC 绘图,使用双缓冲技术实现 *******************************************************************例子*******************************************************************   ********************所有的GDI绘图函数使用的都是逻辑坐标(逻辑范围)************** 阅读详情
在图形图象处理编程过程中,双缓冲是一种基本的技术。我们知道,如果窗体在响应WM_PAINT消息的时候要进行复杂的图形处理,那么窗体在重绘时由于过频的刷新而引起闪烁现象。解决这一问题的有效方法就是双缓冲技术。

  因为窗体在刷新时,总要有一个擦除原来图象的过程OnEraseBkgnd,它利用背景色填充窗体绘图区,然后在调用新的绘图代码进行重绘,这样一擦一写造成了图象颜色的反差。当WM_PAINT的响应很频繁的时候,这种反差也就越发明显。于是我们就看到了闪烁现象。

我们会很自然的想到,避免背景色的填充是最直接的办法。但是那样的话,窗体上会变的一团糟。因为每次绘制图象的时候都没有将原来的图象清除,造成了图象的残留,于是窗体重绘时,画面往往会变的乱七八糟。所以单纯的禁止背景重绘是不够的。我们还要进行重新绘图,但要求速度很快,于是我们想到了使用BitBlt函数。它可以支持图形块的复制,速度很快。我们可以先在内存中作图,然后用此函数将做好的图复制到前台,同时禁止背景刷新,这样就消除了闪烁。以上也就是双缓冲绘图的基本的思路。

 

一、普通方法:

  先按普通做图的方法进行编程。即在视类的OnDraw函数中添加绘图代码。在此我们绘制若干同心圆,代码如下:

 CBCDoc* pDoc = GetDocument();

 ASSERT_VALID(pDoc);

 CPoint ptCenter;

 CRect rect,ellipseRect;

 GetClientRect(&rect);

 ptCenter = rect.CenterPoint();

 for(int i=20;i>0;i--)

 {

      ellipseRect.SetRect(ptCenter,ptCenter);

      ellipseRect.InflateRect(i*10,i*10);

      pDC->Ellipse(ellipseRect);

 }

编译运行程序,尝试改变窗口大小,可以发现闪烁现象。

 

二、双缓冲方法:

  在双缓冲方法中,首先要做的是屏蔽背景刷新。背景刷新其实是在响应WM_ERASEBKGND消息。我们在视类中添加对这个消息的响应,可以看到缺省的代码如下:

BOOL CMYView::OnEraseBkgnd(CDC* pDC)

{

     return CView::OnEraseBkgnd(pDC);

}

是调用父类的OnEraseBkgnd函数,我们屏蔽此调用,只须直接return TRUE;即可。

 

  下面是内存缓冲作图的步骤。

 CPoint ptCenter;

 CRect rect,ellipseRect;

 GetClientRect(&rect);

 ptCenter = rect.CenterPoint();

 CDC dcMem;            //用于缓冲作图的内存DC

 CBitmap bmp;          //内存中承载临时图象的位图

 dcMem.CreateCompatibleDC(pDC);  //依附窗口DC创建兼容内存DC

 bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());//创建兼容位图

 dcMem.SelectObject(&bmp);     //将位图选择进内存DC

//按原来背景填充客户区,不然会是黑色

 dcMem.FillSolidRect(rect,pDC->GetBkColor());

for(int i=20;i>0;i--)  //在内存DC上做同样的同心圆图象

 {

      ellipseRect.SetRect(ptCenter,ptCenter);

      ellipseRect.InflateRect(i*10,i*10);

      dcMem.Ellipse(ellipseRect);

 }

 pDC->BitBlt(0,0,rect.Width(),rect.Height(),

&dcMem,0,0,SRCCOPY);//将内存DC上的图象拷贝到前台

 dcMem.DeleteDC();  //删除DC

 bm.DeleteObject(); //删除位图

由于复杂的画图操作转入后台,我们看到的是速度很快的复制操作,自然也就消除了闪烁现象。

 

注意:bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());

这里面CreateCompatibleBitmap第一个参数不能用dcMem,这样的话创建的是黑白位图。如果你要创建彩色位图,需要用pDC,它用来创建了内存DC. 详细请见下面的MSDN:

When a memory device context is created, it initially has a 1-by-1 monochrome bitmap selected into it. If this memory device context is used in CreateCompatibleBitmap, the bitmap that is created is a monochrome bitmap. To create a color bitmap, use the hDC that was used to create the memory device context, as shown in the following code:

    HDC memDC = CreateCompatibleDC ( hDC );

    HBITMAP memBM = CreateCompatibleBitmap ( hDC, nWidth, nHeight );

    SelectObject ( memDC, memBM );

Windows双缓冲绘图技术原理与VC++实现 双缓冲技术是图形编程中解决画面闪烁问题的核心方法,其原理是通过内存设备上下文(Memory DC)先在后台完成绘制,再一次性呈现到屏幕。这种技术广泛应用于实时数据可视化、游戏开发等需要高频刷新的场景。在Windows平台下,GDI绘图接口通过CreateCompatibleDC创建内存DC,配合BitBlt函数实现缓冲区交换。VC++开发中,MFC框架的OnDraw函数是实施双缓冲的最佳切入点,开发者需要注意GDI对象管理和多显示器适配等关键技术细节。对于波形显示、CAD绘图等应用,双缓冲能显著提升60%以 阅读详情

相关推荐

VC++实现跑马灯滚动字幕:Win32 API、GDI绘图与双缓冲技术详解

在Windows桌面应用开发中,图形设备接口(GDI)是进行图形绘制的基础技术,它允许程序在窗口上绘制文本、形状和图像。其核心原理是通过设备上下文(DC)与显示硬件交互,处理WM_PAINT消息进行绘制。这项技术的价值在于为开发者提供了底层的图形控制能力,是实现自定义UI和动态效果的关键。在信息展示、动画模拟等应用场景中,GDI常被用于实现如滚动字幕、图表绘制等功能。本文聚焦于利用Win32 API和GDI,结合定时器消息与双缓冲绘图技术,解决跑马灯滚动字幕开发中的闪烁问题与性能优化,为VC++桌面图形编程

weixin_34037515的博客 366

C++技巧(VC++双缓冲实现方法)

<br />在图形图象处理编程过程中,双缓冲是一种基本的技术。我们知道,如果窗体在响应WM_PAINT消息的时候要进行复杂的图形处理,那么窗体在重绘时由于过频的刷新而引起闪烁现象。解决这一问题的有效方法就是双缓冲技术。<br />  因为窗体在刷新时,总要有一个擦除原来图象的过程OnEraseBkgnd,它利用背景色填充窗体绘图区,然后在调用新的绘图代码进行重绘,这样一擦一写造成了图象颜色的反差。当WM_PAINT的响应很频繁的时候,这种反差也就越发明显。于是我们就看到了闪烁现象。<br />  我们会很自

特权份子的专栏 932

VC++中实现GIF动画播放:从解码到双缓冲绘制的完整方案

在桌面应用开发中,动态图像处理是常见的需求,尤其是GIF格式的加载与显示。GIF作为一种支持多帧动画的图形格式,其原理涉及帧解码、时序控制和图像合成。在VC++开发环境下,由于GDI原生不支持GIF动画,开发者需要借助第三方库或手动解析来实现。通过集成CxImage等开源库,可以高效解码GIF帧数据,并结合Windows消息机制与定时器驱动动画播放。采用内存DC双缓冲绘制技术,能有效避免画面闪烁,提升显示性能。这一技术方案不仅解决了“vc解码gif”和“gif 4096”等常见搜索痛点,还适用于加载动画、产

weixin_28683689的博客 229

vc++ 双缓冲绘图

很少写文章,今天偶有兴趣。就把自己在使用vc过程中的点滴记录下来。 首先要实现的功能是:扇形能快速的转动! 我首先在VISUAL STUDIO中创建一个mfc单文档的工程, 在它的OnDraw(CDC *pDC) 函数中写以下代码:    CDC lDC;CBitmap cBit;  lDC.CreateCompatibleDC(NULL);

kucongzhi的专栏 840

VC++实现高性能示波器波形图控件:GDI双缓冲与坐标映射实战

在桌面软件开发中,自定义控件是实现特定功能模块的核心技术。其原理在于通过底层图形接口直接操作像素,实现对界面元素的精细控制,从而在性能要求苛刻的场景中发挥关键价值。这项技术广泛应用于工业控制、数据采集和科学可视化等领域,尤其在对实时性有极致要求的波形显示中至关重要。本文聚焦于使用VC++与GDI/GDI+技术,深入探讨如何构建一个高性能的示波器波形图控件,其中双缓冲技术是解决画面闪烁、保证流畅渲染的关键,而高效的坐标映射算法则是实现波形缩放、平移等交互功能的基础。通过结合实时数据处理与图形渲染优化,开发者能

weixin_34008784的博客 418

vc 双缓冲技术

vc 双缓冲技术

C语言编程闪屏,双缓冲解决VC++绘图时屏幕闪烁

通常来说程序根据需要调用Invalidate(FALSE)使窗口客户区无效引起重绘,然后在窗口OnPaint函数(基于文档视图的程序则是OnDraw)中进行稳定绘图就行了。但是,我们在OnPaint中进行多重绘制(画背景、棋盘、棋子等),前后绘制的反差造成了闪烁现象。以前知道Java中解决屏幕闪烁问题是用双缓冲的方法,现在发现在vc++中也是可以这么做的。简单来说,双缓冲就是先把需要绘制的东西全部...

weixin_35927509的博客 2168

VC++双缓冲技术代码演示

摘要:VC/C++源码,控件相关,双缓冲 VC++双缓冲技术代码演示代码,虽然比较老的代码,但是仍然很有用途,源码将演示如何在VC++中实现双缓冲技术的实例,演示了使用普通方式绘图和采用双缓冲技术绘图的例子,首先给出实现的程序,然后再解释,同样是在OnDraw(CDC *pDC)中:   CDC MemDC; //首先定义一个显示设备对象   CBitmap MemBitmap;//定义一个位图对象   //随后建立与屏幕显示兼容的内存显示设备   MemDC.CreateCompatibleDC(NULL);   //这时还不能绘图,因为没有地方画 ^_^   //下面建立一个与屏幕显示兼

VC++双缓冲技术解析与实现

双缓冲技术是计算机图形学中解决屏幕闪烁问题的经典方案,其核心原理是通过内存缓冲区的预渲染机制,将完整的图形数据一次性输出到显示设备。在Windows GDI编程中,设备上下文(DC)的直接操作会导致实时刷新问题,而双缓冲技术通过创建兼容的内存DC和位图,配合BitBlt函数实现无闪烁渲染。这项技术特别适用于数据可视化、游戏开发等需要高频刷新的场景,能显著提升用户体验。随着Direct2D等现代图形API的普及,双缓冲技术仍然是理解图形渲染管线的重要基础概念,掌握其实现原理对优化GDI+性能、处理高DPI显示

weixin_34161083的博客 440

VC++双缓冲示例解析源代码

内容索引:VC/C++源码,系统相关,双缓冲  这是一个关于VC++双缓冲解析的示例源代码,以前经常在论坛上见到不少人在讨论双缓冲的问题,后来自己也在网上找过资料,但感觉有些凌乱,且大多是 DirectX 相关的,没有一个让新手们参考的实例,于是自己做了一个,主要说明双缓冲技术的原理以及双缓冲在 VC++ 的 GDI 绘图环境下的实现方法。

基于Python实现的捕鱼达人小游戏源代码+使用说明

摘要: 本文介绍了一款自制的捕鱼达人小游戏,使用Python3和Pygame模块开发。游戏包含完整的资源文件(图片、音效、字体)和源码结构(11个功能模块),实现了大炮移动射击、特殊子弹、炸弹、难度递增等核心玩法。安装需配置Python环境和Pygame模块,运行main.py即可启动游戏。游戏支持键盘控制(方向键移动、空格射击、1键放炸弹),默认时长600秒,包含开始菜单、游戏界面和结束界面。所有代码均有详细注释,项目已开源并提供下载链接。(150字)

2301_76484015的博客 667

vc双缓冲:VC++双缓冲实现方法

在图形图象处理编程过程中,双缓冲是一种基本的技术。我们知道,如果窗体在响应WM_PAINT消息的时候要进行复杂的图形处理,那么窗体在重绘时由于过频的刷新而引起闪烁现象。解决这一问题的有效方法就是双缓冲技术。 因为窗体在刷新时,总要有一个擦除原来图象的过程OnEraseBkgnd,它利用背景色填充窗体绘图区,然 后在调用新的绘图代码进行重绘,这样一擦一写造成了图象颜色的反差。当WM_PAIN

tuyang120428941的专栏 1244

EtherCAT应用层协议选型指南:CoE、SoE、EoE、FoE、AoE到底怎么选?看完这篇就懂了

本文深入解析EtherCAT应用层协议(CoE、SoE、EoE、FoE、AoE)的选型策略,从实时性、数据吞吐量和功能完整性三大核心指标出发,提供工业场景下的实战决策框架。通过技术特性对比、混合协议架构设计和常见故障规避指南,帮助工程师优化自动化设备通信性能。

weixin_28718793的博客 491

(转载)VC++双缓冲实现方法

汕头大学 陈鹏(C/C++学生) 460

中兴问天 BE7200MAX SFP 光口用华为猫棒替代光猫完整配置教程

PPPoE 账号密码:若原光猫为 Route 模式,在宽带设置页可见用户名,密码需按 F12 打开浏览器开发者模式,点击密码输入框,查看代码中 “value=” 后的内容即为明文密码。若仍失败,核对 PON 类型是否与运营商网络匹配。PON 认证信息:LOID(逻辑 ID,部分地区含密码)、设备 SN 码(标签或设备信息页)、PON 类型(GPON/EPON,运营商网络类型)。电脑保持与路由器连接,访问路由器管理地址(默认通常为 192.168.5.1,可参考路由器说明书),登录后台。

Gulper_Eel的博客 3335

【ISAR成像】基于Matlab的飞机点目标模型仿真与图像优化

本文详细介绍了如何使用Matlab进行ISAR成像仿真,重点讲解了从构建飞机点目标模型到生成清晰图像的完整流程。通过模拟雷达回波、距离压缩、运动补偿及方位压缩等核心信号处理步骤,并结合相位梯度自聚焦等优化技巧,有效提升了ISAR图像的清晰度与分辨率。文章还分享了雷达参数调优、加窗处理等实战经验,为雷达信号处理与目标识别研究提供了实用指导。

weixin_29071809的博客 389

VC++ Win32 API实现正弦曲线动画:GDI绘图与双缓冲技术详解

计算机图形学中的动画实现,其核心原理在于通过连续帧的快速切换产生视觉暂留效果。在Windows桌面开发领域,这一过程通常通过消息驱动机制与图形设备接口(GDI)协同完成。GDI作为Windows系统的原生绘图引擎,提供了直接操作屏幕像素的能力,是实现自定义图形界面的技术基础。其技术价值在于高效、可控的底层图形渲染,是理解Windows GUI编程架构的关键。典型的应用场景包括数据可视化、自定义控件绘制以及动态效果展示。本文以**定时器动画**和**双缓冲**技术为核心,通过一个沿正弦曲线移动的实心圆案例,具

weixin_31364787的博客 282

SAP ABAP开发避坑:BAPI_MATVAL_PRICE_CHANGE调用报‘估价未维护’的完整解决流程

本文深入解析SAP ABAP开发中调用BAPI_MATVAL_PRICE_CHANGE函数时遇到的'估价未维护'错误,提供从基础配置检查到CKML_PRICE_SEND表维护的完整解决方案。通过实战案例和代码示例,帮助开发者快速定位问题并实现批量价格更新的自动化处理,提升开发效率。

weixin_28705087的博客 427

VC++ MFC文档视图程序静态背景图片实现:双缓冲绘图与资源管理实战

在Windows桌面应用开发中,图形用户界面(GUI)的绘制效率和视觉体验是核心考量。双缓冲绘图技术通过先在内存中完成所有绘制操作,再一次性输出到屏幕,有效解决了画面闪烁问题,是提升界面流畅度的关键技术。其工程价值在于能够显著改善用户交互体验,尤其适用于文档编辑器、数据可视化工具等需要频繁重绘的场景。本文聚焦于VC++ MFC框架下的具体实现,通过封装资源管理类,将JPG/PNG等格式图片作为自定义资源嵌入程序,并结合双缓冲机制,在文档视图架构中稳健地实现了静态背景功能。该方案不仅解决了滚动视图中的闪烁问题

weixin_30509393的博客 364

【华为OD机试真题】6、数组去重和排序 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

题目描述 >给定一个乱序的数组,删除所有的重复元素,使得每个元素只出现一次,并且按照出现的次数从高到低进行排序,相同出现次数按照第一次出现顺序进行先后排序

KJ.JK 3888

手把手教你双目测距理论及生成视差图,深度图,点云图像

Stereo Vision, 也叫双目立体视觉,它的研究可以帮助我们更好的理解人类的双眼是如何进行深度感知的。双目视觉在许多领域得到了应用,例如城市三维重建、3D模型构建(如kinect fusion)、视角合成、3D跟踪、机器人导航(自动驾驶)、人类运动捕捉(Microsoft Kinect)等等。双目测距也属于双目立体视觉的一个应用领域,双目测距的基本原理主要是三角测量原理,即通过视差来判定物体的远近。

qq_53545309的博客 2280
上一篇: 指针参数传递内存的方法
下一篇: 函数调用详解:__stdcall, __cdecl, __fastcall, thiscall, naked call, __pascal
ccfboy
博客等级 码龄18年 45粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值