MFC 双缓冲技术

MFC双缓冲绘图 1、为什么使用双缓冲? 我们都知道电脑CPU计算速度是非常快的,但是电脑要把信息显示到显示屏上,是比较慢的,因为显示屏要去更新像素点,假如我们要画1000条线,CPU画一条线只需要微秒,但是显示屏显示一条线需要1毫秒,如果我们不使用双缓冲,使用一个for循环输出1000条线,那么显示屏要刷新1000次才能完成1000条线的绘制,这会花掉1.001秒钟才能绘制一次我们想要的图形。很明显,这是非常低 阅读详情
一、为什么使用双缓冲图形刷新技术
双缓冲图形刷新技术能解决绘图时屏幕闪烁的问题。
二、绘图时屏幕闪烁的原因分析
很长一段时间我一直认为绘图过程中出现的屏幕闪烁是图形刷新速度过快而造成的(相信有很多朋友也跟我一样有这样的想法),但是通过编写一些绘图程序,我发现事情并非如此,至少刷新速度快不会是造成屏幕闪烁的根本原因。这个问题可以通过下面的两个试验进行说明。
1、编写一个刷新速度很慢的应用程序,可以设计为通过点击鼠标来进行屏幕刷新。通过该试验可以发现即使屏幕的刷新速度很慢,但是在每次刷新的时候仍然存在屏幕的问题,只是闪烁不是很明显。
2、编写一个刷新速度很快的应用程序,并在程序中应用双缓冲图形刷新技术。通过该试验可以发现虽然屏幕刷新速度很快,但是采用了双缓冲图新刷新技术以后,屏幕不存在闪烁。
屏幕闪烁的根本原因是相邻两帧图像之间存在的巨大差异造成的,而windows gdi的图形刷新方式使得任何两帧图像之间都存在着巨大的差异,因为windows gdi在进行刷新之前都会首先将整个屏幕刷成白色,就相当于在电影胶片的相邻两帧之间都插入了一个白色的帧,这也就是为什么屏幕闪烁时总是看到一个隐约的白色窗口在闪烁而不是一个红色的窗口在闪烁。双缓冲图形刷新技术避免了windows gdi刷新的问题,其没有在连续的两帧之间插入白色的帧,从而解决了屏幕闪烁的问题。
三、双缓冲图形刷新技术的原理
双缓冲图形刷新技术顾名思义是采用双缓存实现的。传统的绘图方式实际上是一种单缓冲。在windows中每一种设备都在内存中有一个设备描述表与其对应,这个设备描述表实际上就是一个内存缓冲区。传统的绘图中我们是将图形绘制在设备描述表缓冲区中,然后由gdi自动的将设备描述表中的图像拷贝到显存中进行显示。这样一个自动的拷贝过程屏蔽了传统的绘图方式是单缓冲的实质,使我们感觉到我们是在直接操纵显存一样。双缓冲图形刷新技术在内存中有两片缓存,除了设备描述表以外还有一个需要手动建立的与设备描述表缓冲区(前端缓冲区)相兼容的后备缓冲区。绘图过程中,首先将图形绘制在后备缓冲区中,然后在手动的将后备缓冲区中的图像拷贝到前端缓冲区中,再由gdi自动将前端缓冲区中的图像拷贝到显存完成图形的显示过程。
四、双缓冲图形刷新技术的实现步骤
1、创建与窗口设备描述表(前端缓冲区)兼容的内存设备描述表(后端缓冲区)
2、创建与内存设备描述表相兼容的位图并将该位图选入内存设备描述表中(没有位图的设备描述表是不能绘图的)
3、将图形绘制在内存设备描述表中
4、将内存设备描述表中的内容拷贝到窗口设备描述表
5、释放设备描述表句柄、位图等资源
五、在vc 6.0中结合mfc实现双缓冲图形刷新技术
1、首先在OnDraw()或者OnPaint()中添加下列代码
void OnDraw(CDC *pDC)
{
//定义一个内存设备描述表对象(即后备缓冲区)
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();
}
2、添加WM_ERASEBKGND响应函数,并清除响应函数的生成代码在其中添加如下代码
BOOL OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//return CDialog::OnEraseBkgnd(pDC);
return FALSE;
}
mfc双缓冲技术 MFC绘图时,频繁的刷新会导致屏幕闪烁现象,采用双缓冲技术可以解决闪烁问题。 主要方法是将图像先存在内存中,然后一次性显示在屏幕上 步骤: 去掉背景刷新 BOOL C上位机View::OnEraseBkgnd(CDC* pDC) { // TODO: 在此添加消息处理程序代码和/或调用默认值 //return CView::OnEraseBkgnd(pDC); return... 阅读详情

相关推荐

MFC_双缓冲技术

双缓冲技术

知行合一 4570

转:双缓冲图形刷新技术 和 WGF双缓冲绘图框架

一、为什么使用双缓冲图形刷新技术双缓冲图形刷新技术能解决绘图时屏幕闪烁的问题。二、绘图时屏幕闪烁的原因分析很长一段时间我一直认为绘图过程中出现的屏幕闪烁是图形刷新速度过快而造成的(相信有很多朋友也跟我一样有这样的想法),但是通过编写一些绘图程序,我发现事情并非如此,至少刷新速度快不会是造成屏幕闪烁的根本原因。这个问题可以通过下面的两个试验进行说明。1、编写一个刷新速度很慢的应用程序,可以设计为通过...

weixin_30235225的博客 252

《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画

本系列文章由七十一雾央编写,转载请注明出处。  http://blog.youkuaiyun.com/u011371356/article/details/9299121 作者:七十一雾央 新浪微博:http://weibo.com/1689160943/profile?rightmod=1&wvr=5&mod=personinfo        在前几节的笔记里,大家肯定会为一个问

C++游戏开发 1万+

MFC中双缓存技术

MFC 在进行绘图的时候,有些情况可能会发生图像闪烁的现象。这时就需要使用二级缓存技术对图形进行处理。 二级缓存技术主要是用于处理以下几种情况: 1)非客户区和客户区不能同步更新画面造成的闪烁,可以去掉窗口的标题和边框只在WM_PANINT消息回调时绘画,而在WM_NCPAINT消息回调中不绘画。 2)客户区内背景和前景不能同步更新画面,在WM_ERASEBKGND背景更新和WM_PAINT前景更新两个消息中,只选择一种消息回调函数。 3)Invalidate强制更新客户区函数,带入资源的ID编号加

qq_43812868的博客 4045

MFC双缓冲绘图技术的使用和测试例子

使用双缓冲技术可以避免屏幕闪烁

m0_60352504的博客 996

在MFC中实现双缓冲绘图及位图掩码技术

MFC(Microsoft Foundation Classes)是微软公司提供的一个用于Windows应用程序开发的C++库。在图形用户界面中,绘图操作往往是实时反馈给用户的,这意味着绘图操作的性能直接决定了用户体验的好坏。双缓冲绘图是一种常用的图形绘制优化技术,它通过在内存中创建一个与屏幕显示区域大小相同的缓冲区来完成绘图,之后一次性将这个缓冲区的完整内容显示到屏幕上。双缓冲技术的核心优势在于它避免了屏幕闪烁和图像撕裂,提高了绘图的效率。

weixin_35749796的博客 1129

MFC绘制动态曲线,用双缓冲绘图技术防闪烁

转载自:ZHY_ongu的博客:MFC绘制动态曲线,用双缓冲绘图技术防闪烁 先上效果图 随着时间的推移,曲线向右平移,同时X轴的时间坐标跟着更新。一、如何绘制动态曲线。所谓动画,都是一帧一帧的图像连续呈现在用户面前形成的。所以如果你掌握了如何绘制静态曲线,那么学会绘制动态曲线也不远啦,只需要创建一个定时器(比如调用MFC中的SetTimer函数),每隔一定时间(比如1ms),调用OnPaint

xuanyuanlei1020的专栏 2374

MFC双缓冲技术实现小球移动动画实战

设备上下文(Device Context, DC)是MFC中用于图形绘制的核心对象,它封装了与图形输出设备(如屏幕、打印机)交互的所有操作。每个绘图操作都必须在一个有效的设备上下文环境中进行。MFC中常见的CDC派生类包括:类名用途说明CClientDC用于客户区绘图CWindowDC用于整个窗口(包括非客户区)绘图CPaintDC专用于WM_PAINT消息中的绘图用于将绘图操作记录到元文件。

weixin_33480380的博客 791

MFC贴图双缓冲技术

MFC图像贴图双缓冲解决闪烁自定义图像内存加载类的封装: 支持从内部资源/外部文件加载,支持bmp/jpg/gif/png图像文件; 支持创建空白位图(黑色,指定宽高); 文件显示透明/收缩透明位图; 支持根据背景颜色生成RGN裁剪区。 使用时,将此头文件在"stdafx.h"中添加 #include "MemoryDC.h" // 2019.03.10 // 自定义图像内存加载类的封装: ...

Saka0-0 VS Dimension 625

MFC绘图双缓冲技术

为防止高速刷新造成的屏幕闪烁问题,可以使用双缓冲技术。本文介绍了为使用双缓冲需要添加的代码,可以直接使用。

MFC双缓冲及重绘示例

/* 整理: 1、双缓冲绘图技术概述 原理:将一般的在CDC中绘图改成在一内存设备中绘图(CDC型变量,一般命名为pMemDC),然后使用BitBlt()函数将pMemDC中的图像复制到CDC中; 步骤: ①创建内存设备CDC *pMemDC;关联设备CreateCompatibleDC(); ②创建兼容位图 HBITMAP ::CreateCompatibleBitmap(); ③选入设备内存设备(HBITMAP)::SelectObject(m_hDC,hBitmap); ④内存设备绘图 ⑤复制到CDC,使用函数 BitBlt() 2、手动重绘 原理: 利用内存设备的BitBlt()函数将初始CDC选入。将上面第⑤步的设备互换。 */ /* 程序过程: 1、绘制背景,在函数DrawSome()中实现;并将其放在OnPaint()函数中,保证每次刷新时依然存在; 2、修改WM_ERASEBKGND消息响应函数,使得不加入背景刷(此步可以取消,暂时无影响,因为将DrawSome()放在了OnPaint()中); 3、响应鼠标左键按下,记录初始坐标点; 4、响应鼠标按下移动,并实时绘制矩形,此处用到双缓冲绘图技术; 5、响应鼠标左键松开,绘制红色矩形。 */

MFC绘图不闪烁——双缓冲技术

在VC/MFC用CDC绘图时,频繁的刷新,屏幕会出现闪烁的现象,CPU时间占用率相当高,绘图效率极低,很容易出现程序崩溃。 所谓双缓冲技术,下面是百度百科的解释: 我们看电视时,看到的屏幕称为OSD层,也就是说,只有在OSD层上显示图像我们才能看到。现在,我需要创建一个虚拟的、看不见但是可以在上面画图(比如说画点、线)的OSD层,我称之为offscreen(后台缓冲区)。这个offscreen

如果我是超人 559

西门子 G120 变频器报文

G120报文

mmxxoo_xxmmp的博客 8086

双缓冲技术解决MFC重绘闪烁问题

转自:http://www.cnblogs.com/lidabo/archive/2012/07/17/2594840.html      在图形图象处理编程过程中,双缓冲是一种基本的技术。我们知道,如果窗体在响应WM_PAINT消息的时候要进行复杂的图形处理,那么窗体在重绘时由于过频的刷新而引起闪烁现象。解决这一问题的有效方法就是双缓冲技术。      因为窗体在刷新时,总要有一个擦除原来图

francisapp的博客 5008

反爬虫:POST 请求参数中 Sign 的加密机制详解,并设计带 Sign 校验的网站

本文介绍了API请求中sign签名的生成原理及实现方法。sign是通过对请求参数加密生成的一串字符串,用于验证请求合法性,防止参数篡改、重放攻击和伪造请求。其生成步骤包括参数排序、拼接字符串、加盐和哈希加密。文章还演示了如何在FastAPI后端实现带sign验证的新闻网站,包括参数校验、时间戳验证和签名比对等安全措施,有效提升API安全性,增加爬虫逆向难度。

数据知道的博客 4078

YOLO模型在STM32微控制器上的部署:1.98M参数如何塞进嵌入式设备?

<think>我们根据内容生成不超过150字的摘要。内容主要是关于YOLO模型在STM32微控制器上的部署,包括STM32N6 NPU、模型量化、工具链、开源方案和架构设计。摘要需要简洁概括主要点。 字数限制:≤150字。需要包含关键信息:STM32N6运行YOLO,困难,方案(NPU、INT8量化、工具链),性能(34 FPS 9.4mJ)。结尾可能提到开源和生态。 写中文摘要。注意不超过150字。</think>本文探讨YOLO模型在STM32微控制器上的部署。集成NPU的STM32N6搭配轻量化YOL

2601_95807009的博客 257

【MFC】MFC绘图不闪烁——双缓冲技术

MFC绘图不闪烁——双缓冲技术[转] 2010-04-30 09:33:33|分类:VC|举报|字号订阅 [转自:http://blog.163.com/yuanlong_zheng@126/blog/static/49846449201033093333394/] 在VC/MFC用CDC绘图时,频繁的刷新,屏幕会出现闪烁的现象,CPU时间占用率相当高,绘图效...

weixin_30699443的博客 94

最佳RANSAC算法拟合矩形的实现(基于PCL库)

最佳RANSAC算法是一种常用的参数估计方法,用于从数据集中拟合出最佳的模型。在计算机视觉和图像处理领域,最佳RANSAC算法常用于拟合几何形状,如矩形。本文将详细介绍如何使用点云库(PCL)中的最佳RANSAC算法来拟合矩形,并提供相应的源代码。

JbPatch的博客 1544

MFC防止绘图闪烁——双缓冲技术

转自: http://blog.163.com/fk1007@126/blog/static/3003673920092189224923/ 在VC/MFC用CDC绘图时,频繁的刷新,屏幕会出现闪烁的现象,CPU时间占用率相当高,绘图效率极低,很容易出现程序崩溃。 所谓双缓冲技术,下面是百度百科的解释: 我们看电视时,看到的屏幕称为OSD层,也就是说,只有在

u011295947的博客 1721

Unity之OpenXR+XR Interaction Toolkit接入HTC Vive

目前VR领域,最流行的设备要当属HTC VIVE了。以前在Unity端接入HTC VIVE设备时,都是通过SteamVR+VRTK来接入的。但是随着Unity的版本升级和OpenXR标准的流行,再加上VR设备的逐渐增多。SteamVR+VRTK的方式已经无法更好的满足大家的需求。

TxNet 4137

Linux系统安全学习手册

Linux反弹shell Linux系统应急响应 Linux服务器安全加固 Linux下的用户、组和权限 Linux中的gcc Linux中su和sudo的用法和区别 Linux系统python2与python3共存 Linux中grep工具的使用 Linux中环境变量的设置 Linux中常见的150个命令(干货) Linux中编写Shell脚本 LNMP环境搭建Wordpress博客 LAMP环境搭建一个Discuz论坛 Linux运维比较常用的一些脚本 Linux系统中安装软

谢公子的博客 7532
下一篇: 配置Eclipse 实现按任意键代码自动补全
To_be_0909
博客等级 码龄16年 9粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值