双缓冲区绘图操作的实现

c++双缓冲绘图的实现 实现无闪烁、双缓冲绘图的具体方法 带上了实现的详细代码!! 立即下载

在图形图象处理编程过程中,双缓冲是一种基本的技术。我们知道,如果窗体在响应WM_PAINT消息的时候要进行复杂的图形处理,那么窗体在重绘时由于过频的刷新而引起闪烁现象。解决这一问题的有效方法就是双缓冲技术。

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

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

下面来看一个简单的例子,在CProjectNameView的OnDraw函数进行稍微复杂的绘图操作(复杂一点闪烁效果明显)

1
2
3
4
5
6
7
8
9
10
11
12
// 普通的画图操作
CPoint ptCenter;
CRect rect, ellipseRect;
 
GetClientRect(&rect);
ptCenter = rect.CenterPoint();
for(int i = 60; i > 0; --i)
{
	ellipseRect.SetRect(ptCenter, ptCenter);
	ellipseRect.InflateRect(i * 5, i * 5);
	pDC->Ellipse(ellipseRect);
}

下面是双缓冲区的绘图代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 双缓冲区画图
CPoint ptCenter;
CRect rect, ellipseRect;
GetClientRect(&rect);
ptCenter = rect.CenterPoint();
 
CDC dcMem;			// 用于缓冲作图的内存CD
CBitmap bmp;		// 内存中存在临时图像的位图
dcMem.CreateCompatibleDC(pDC);	// 依附窗口DC创建兼容DC
// 创建兼容位图
bmp.CreateCompatibleBitmap(&dcMem, rect.Width(), rect.Height());
dcMem.SelectObject(&bmp);	// 将位图选入内存DC
dcMem.FillSolidRect(rect, pDC->GetBkColor());// 按照原有背景色填充客户区
// 绘图操作
for (int i = 60; i > 0; --i)
{
	ellipseRect.SetRect(ptCenter, ptCenter);
	ellipseRect.InflateRect(i * 5, i * 5);
	dcMem.Ellipse(ellipseRect);		// 在内存DC上绘图
}
// 将内存DC上的东西复制到pDC
pDC->BitBlt(0, 0, rect.Width(), rect.Height(),
	&dcMem, 0, 0, SRCCOPY);
dcMem.DeleteDC();	// 删除DC
bmp.DeleteObject();	// 删除位图

可以看到,当拖动窗口大小时,使用普通绘图操作会不停的闪烁,而双缓冲区的几乎看不到闪烁。

(如果是)原创文章,转载请注明(文字为系统自动添加,实际意义上本段文字仅针对原创文章而言):
本文出自程序人生 >> 双缓冲区绘图操作的实现

java期末课程游戏设计(2D+双缓冲绘图+射击) wasd移动 左键射击,右键瞬移 非绿色怪物有威胁,绿色怪物碰触(判定在左上角)加攻击溅射范围(瞄准镜扩大) 打完全部怪物再摁一下攻击刷怪 (粉色为最高级怪、、、要小心O(∩_∩)O哈哈~) 游戏BGM来源于单机游戏 立即下载

相关推荐

JAVA双缓冲绘图源码

JAVA中GUI编程,AWT窗体上绘图,利用双缓冲解决画面闪烁效果!

[Qt教程] 第18篇 2D绘图(八)双缓冲绘图

[Qt教程] 第18篇 2D绘图(八)双缓冲绘图 楼主  发表于 2013-5-2 22:07:23 | 查看: 789| 回复: 1 双缓冲绘图 版权声明 该文章原创于Qter开源社区(www.qter.org),作者yafeilinux,转载请注明出处! 导语

C/C++软件工程师、嵌入式软件工程师、物联网研发工程师、C/C++讲师、物联网讲师、嵌入式讲师、鸿蒙讲师---欢迎大家一起交流(私信添加博主微信) 2666

java画图(双缓冲)

独立写出来的,使用双缓冲,很巧妙的一个方法,实现了画图板的操作,值得模仿。

java画图双缓冲机制

主要就是重写了update方法,制定了其刷新的方式~ 原理:  1.建立一个Image对象DbBuffer,通过DbBuffer=createrImage(int width,int height)来在内存中开辟一个长为width 宽为heithr空间.次空间的大小可以和你动画窗口的大小保持一致,也可以利用getwidth()和getheight()来获得动画窗口的大小.  ...

爱.NET 500

深入AOSP构建系统:从BUILD_FINGERPRINT的生成逻辑,看如何定制你的Android设备标识

本文深入解析AOSP构建系统中的设备指纹生成机制,详细介绍了BUILD_FINGERPRINT的生成逻辑及其在Android设备中的关键作用。通过分析多个指纹属性的区别与联系,以及如何定制设备标识,帮助开发者更好地理解和掌握Android系统构建过程。

weixin_27017211的博客 220

如何快速学习 PHP 编程:从入门到实战的高效路径

PHP高效学习路线摘要:4-8周掌握Web开发核心技能。阶段1(1周)搭建XAMPP/MAMP环境,掌握基础语法和变量处理;阶段2(2周)重点学习表单处理、会话管理和PDO数据库操作(防SQL注入);阶段3(2-3周)实战开发个人博客等小项目。关键原则:边学边练(每个知识点配3-5个案例)、优先掌握Web刚需技能(HTTP请求、数据库、动态页面)、善用官方手册。避坑点:密码必须加密、SQL使用预处理、统一UTF-8编码。建议每天2-3小时实操,通过项目驱动学习,快速形成开发能力。

2501_94233638的博客 1387

java双缓冲绘图_Java双缓冲技术-绘图应用

1屏幕产生闪烁的原因由于在显示所绘制的图像时,调用了repaint方法。repaint方法被调用时,需要清除整个背景,然后才调用paint方法显示画面。这样,在清除背景和绘制图像的短暂时间间隔内被用户看见的就是闪烁。另外,用paint(Graphics g)函数在屏幕上直接绘图的时候,由于执行的语句比较多,程序不断地改变窗体中正在被绘制的图象,会造成绘制的缓慢,这也从一定程度上加剧了闪烁。就像以前...

weixin_42433529的博客 417

设置Solidworks导出文件的坐标系,stl坐标系平移

使用solidworks输出的模型坐标不再原点,怎么平行坐标系,这个方法很简单

weixin_45650767的博客 1万+

Qt---双缓冲绘图

双缓冲绘图技术通过使用两个缓冲区(前台/屏幕缓冲区和后台/离屏缓冲区)来优化图形显示效果。绘图操作首先在后台缓冲区完成,然后通过交换缓冲区实现图像完整显示,避免绘制过程中的闪烁现象。该技术具有减少闪烁、平滑动画和提高性能等优点。现代图形库和GUI框架(如Qt)已内置支持双缓冲,从Qt4.0开始所有QWidget部件的绘制默认使用双缓冲,一般无需在paintEvent()中手动实现。

weixin_51883798的博客 933

实现飞书机器人推送消息到指定群组或者用户

飞书是一个集成了聊天、协作和办公功能的企业级平台,广泛应用于企业内部沟通和协作。飞书机器人(Feishu Bot)是一种强大的工具,允许开发者通过编程接口与飞书进行互动,从而实现自动化消息推送和任务管理。本文将详细介绍如何通过飞书机器人推送消息给指定的人或者群组,帮助您快速上手。

qq_41898196的博客 5871

解密电商大促背后的智慧:LSTM与ARIMA模型的双剑合璧

举个例子,如果某东发现某款新推出的电子产品在促销前夕搜索量突然暴涨,虽然这个产品没有过去的销售记录,但LSTM模型可以结合用户对类似产品的行为模式、实时的市场反馈,迅速捕捉到这些变化,并预测这款产品在大促期间的需求会急剧上升。想象一下,如果预测不准确,备货不足,商品很快就卖光了,大量用户可能在促销期间买不到想要的商品,这不仅让用户失望,还会影响某东的品牌形象。这种情况就像我们看一部很长的电视剧,看得越久,前面的情节可能就越来越模糊,到最后有些关键的情节细节都忘了,影响了对整个剧情的理解。

小蒋聊技术 2091

简单的 "双缓冲" 绘图的例子

http://www.cnblogs.com/del/archive/2010/04/19/1715779.html 所谓双缓冲就是先画到内存画布(如: TBitmap), 然后再转帖到目的地.譬如下面小程序:   procedure TForm1.FormCreate(Sender: TObject); begin   Timer1.Interval := 100;   ...

weixin_33901641的博客 221

装配完整性检查系统:基于YOLOv10的螺丝/零件缺失自动检测(含UI界面与完整代码)

建议自行采集装配场景数据,标注缺失螺丝、错误零件等,模拟真实缺陷。手机/工业相机采集图像;使用LabelImg进行目标标注;转换为 YOLO 格式。本文构建了一个完整的装配完整性检测系统,基于 YOLOv10 实现高精度螺丝缺失检测,并使用 PyQt5 构建了图形界面,实现一键导入与可视化检测流程,适用于工业质检自动化部署。项目可灵活扩展至零件缺失、错装、错位、顺序错误等检测场景,是深度学习在制造业中落地的典型应用案例之一。

YOLO 703

java双缓冲实现绘图_双缓冲区绘图操作的实现

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

weixin_31178795的博客 746

顶刊论文引言用AI怎么写?借助Gemini 3 Pro结合四段式写出逻辑清晰的Introduction

写研究目标时,先明确研究问题,直接回应前文提到的研究缺口,如 “This study aims to investigate whether X modulates Y via the Z pathway in human cells.”然后再提出你的研究假设,当理论依据清晰时,可以用如 “We hypothesized that inhibiting X would rescue Y deficiency in this model.”的句子点出研究目标。要求:1)明确陈述本研究拟解决的核心科学问题;

智能AI让学术科研更容易 181

Camera HAL Camx — DRQ总结

Camera HAL — DRQ(延迟请求队列)总结 DRQ是CAMX核心层的依赖驱动延迟执行调度器,解决Node处理请求时依赖未就绪的问题。其主要特点包括: 核心功能:当Node处理请求时缺少必要输入(property/metadata/fence),DRQ将其挂起并在依赖满足后重新调度,避免阻塞流水线或丢帧。 系统架构:Session持有主DRQ实例,管理该Session下所有Pipeline Node的依赖;CHI context另有独立DRQ实例专门处理Chi fence同步。 关键数据结构: De

DU_YULIN的博客 76

Qt动态绘图 双缓冲区 paintEvent个人理解

1.调试过程中可知,鼠标每次到ui时候 会触发paintEvent事件 我把这次触发叫做 空跑 因为它没有执行你想操作的事件 比如鼠标,按键等 paintEvent的触发 (1)鼠标选中 或者在ui上晃悠的时候触发 (2)update() 执行后 这个事件已经触发 但是要执行万当前函数的...

qq_39653453的博客 3412

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

OpenGL es教程(六)渲染

渲染导言 在之前的教程中,屏幕上什么也没显示。本教程将说明如何设置你的OpenGL ES窗口开始简单的绘图。如果您使用GLUT|ES, 请咨询 GLUT 如何设置一个OpenGL程序渲染窗口,程序代码是类似的。另外,您可以下载此页面底部的示例源代码 。当我们在屏幕上绘图时我们使用双缓冲区技术。当你绘图时,你会画在后面的缓冲区上,一旦所有的信息都被画好了后,交换缓冲区,然

2622

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

J2ME中文教程4——MIDP低级UI的使用

我们从javax.microedition.lcdui.Canvas开始了解我们的低级UI,我们要用到低级UI必须要继承Canvas这个抽象类,在 Canvas的核心是paint()这个方法,这个方法做是负责绘制屏幕上的画面,每当屏幕需要重新绘制时,就会产生重绘事件时,系统就会自动调用paint(),并传入一个Graphics对象。 任何时候我们都可以通过调用reapaint()方法来产生重...

52

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

使用OpenGL和GLUT,结合双缓冲区生成动画

使用OpenGL和GLUT,结合双缓冲区生成动画         双缓冲区的特性,允许在一个屏幕之外的缓冲区中执行绘图代码,然后使用一条交换命令把完成绘制的图形立即显示在屏幕上。         双缓冲模式的用途:         1、  使用双缓冲,可以合成一幅图像,并在完成之后再显示。用户绝不会看到一幅不完整的图像,因为图像只有在完全完成之后才会在屏幕上显示。         2、

清道夫的专栏(3D程序员,炼心,终生编程) 5790

C# 中的双缓冲区

双缓冲区是一种图形渲染技术,通过使用两个"画布"(前台和后台缓冲区)来消除画面闪烁问题。其核心思想是将所有绘制操作先在后台缓冲区完成,然后瞬间切换到前台显示,确保用户看到的是完整的画面而非绘制过程。在C#中可以通过设置DoubleBuffered属性或手动创建后台缓冲区来实现。这种技术不仅能消除闪烁,还能提高性能、实现平滑动画效果,特别适用于需要频繁重绘或复杂图形处理的场景。典型应用包括游戏开发、动画制作等需要流畅视觉效果的程序。

Tiger_shl的博客 936
上一篇: 架构设计:生产者/消费者模式
下一篇: 屏幕的双向缓冲
wangluozhangleilei
博客等级 码龄16年 87粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值