MFC双缓冲

大家都知道包括windows桌面在内我们看到的一切都是系统画上去的,windows桌面就相当于一个黑板;

《1》普通绘图就是直接在我们看得到的黑板上绘图

《2》双缓冲就是先在一个虚拟的黑板上画完,等用到的时候在把虚拟黑板上的图画复制到我们看得到的黑板上去;

利用双缓冲的优点就是能够使画面流畅,可以想象把画好的图直接粘贴到黑板上一定比在黑板上重新画要快的多。

——————————————————————开始

第一步:新建一个对话框工程

第二步:添加两个按钮:

一个命名为 双缓冲绘图;

一个命名为  普通绘图;

第三步:声明变量:

在CMyDlg类上右击添加变量如下:

CDC MyDC;
 CBitmap bmp;
 CBitmap *oldbmp;

首先声明一个与窗口DC兼容的内存DC(MyDC)和两个与内存相兼容的位图(bmp,*oldbmp)

第四步:在OnInitDialog()函数中添加以下代码:

//窗口DC

CDC *dc=GetDC();

//创建与窗口DC兼容的内存DC(MyDC)及位图(bmp,*oldbmp )
   MyDC.CreateCompatibleDC(dc);
 bmp.CreateCompatibleBitmap(dc,200,200);

//把内存位图选进内存DC中用来保存在内存DC中绘制的图形

oldbmp=MyDC.SelectObject(&bmp);

//在内存DC中绘制一些小的圆形,数量要多(体现双缓存的优点)

for(int i=0;i<200;i+=6)
    for(int j=0;j<200;j+=6)
         MyDC.Ellipse(i-3,j-3,i+3,j+3);

第五步:右击CMyDlg类添加windows消息响应函数WM_CLOSE,添加以下代码:

MyDC.SelectObject(oldbmp);
 bmp.DeleteObject();
 MyDC.DeleteDC();

//选进原来的位图,删除内存位图对象和内存DC

第六步:双击 ”双缓冲“按钮添加以下代码:

GetDC()->StretchBlt(0,0,200,200,&MyDC,0,0,200,200,SRCCOPY);

//把内存DC中的图形粘贴到窗口中;

第七步:双击“普通绘图”按钮添加以下代码:

for(int i=0;i<200;i+=6)
  for(int j=0;j<200;j+=6)
   GetDC()->Ellipse(i-3,j-3,i+3,j+3);

//按普通方式在窗口中绘制和在内存DC中一样数量和大小的位图;

第八步:运行程序............................

先单击     普通绘图   按钮,大家可以看到绘图的速度有点慢

再单击     双缓冲绘图   按钮,图像马上就显示出来了,

这就是双缓冲和普通绘图的区别了

______________________________________________________________________完成

时间: 2024-11-08 15:25:11

MFC双缓冲的相关文章

MFC双缓冲绘图

在双缓冲方法中,首先要做的是屏蔽背景刷新.背景刷新其实是在响应WM_ERASEBKGND消息.我们在视类中添加对这个消息的响应,可以看到缺省的代码如下: BOOL CMYView::OnEraseBkgnd(CDC* pDC) { return CView::OnEraseBkgnd(pDC); } 是调用父类的OnEraseBkgnd函数,我们屏蔽此调用,只须直接return TRUE;即可. CDC dcMem;                                        

MFC双缓冲绘图解决界面闪烁问题

一:为什么会产生界面闪烁? 解释这个之前,我们需要明白的是在MFC里面绘图的消息响应机制,大概的就是如果我们要在某一个 东西上面绘图,比如对话框,单文档等等,就必须先得到图形DC的句柄(handle),然后在指定句柄的基础上进行图形操作,也就是MFC常用的CDC *DC = this->getDC();其中的this就是你想画图的目标. MFC里在消息响应的过程中,WM_PAINT被转变为OnDraw()(单文档 Single Document)或是OnPaint()(对 话框Dialog)之类

MFC双缓冲绘图(2015.09.24)

问题引入: 最近在尝试编写贪吃蛇游戏时遇到这么一个问题:当系统以较快频率向窗口发送WM_PAINT消息时,调用OnPaint()函数在窗口中绘制图形就会发生闪烁现象. 问题分析: 当我们把绘图过程放在OnPaint()函数中时(放在OnDraw()函数中也是如此,因为OnDraw()会被OnPaint()调用),由于频繁收到系统的WM_PAINT消息,窗口需要执行重绘.而重绘过程首先是执行了窗口内容的擦除(用当前背景色的画刷对窗口重新绘制),然后再根据绘图语句在窗口客户区中对窗口内容进行重绘.由

MFC双缓冲绘图实例

本人之前一直了解双缓冲绘图的基本原理,但是在研究很久之后才大概知道具体的使用过程,本文将详细介绍本人在实际项目中使用双缓冲绘图的案例. 实现功能:主界面显示某张包含人脸的图片,通过dlib detector获取到人脸上的68个关键点,绘制在图片上显示,然后通过鼠标拖动图片上的关键点,调整位置,之后保存.双缓冲主要能够解决拖动关键点时屏幕闪烁的问题,本文主要侧重在双缓冲的实现,其他功能概不介绍. 具体实现: 1.定义全局变量: CDC dc_mem://内存绘制dc CDC *dc://绘图dc

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

摘自:http://zhy1987819.blog.163.com/blog/static/841427882011614103454335/ MFC绘制动态曲线,用双缓冲绘图技术防闪烁 2011-07-14 10:34:54|  分类: 学习笔记 |  标签:双缓冲绘图技术  mfc  动态曲线   |举报 |字号 订阅 先上效果图 随着时间的推移,曲线向右平移,同时X轴的时间坐标跟着更新.一.如何绘制动态曲线. 所谓动画,都是一帧一帧的图像连续呈现在用户面前形成的.所以如果你掌握了如何绘制静

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

MFC绘图不闪烁——双缓冲技术[转] 2010-04-30 09:33:33|  分类: VC|举报|字号 订阅 [转自:http://blog.163.com/[email protected]/blog/static/49846449201033093333394/] 在VC/MFC用CDC绘图时,频繁的刷新,屏幕会出现闪烁的现象,CPU时间占用率相当高,绘图效率极低,很容易出现程序崩溃. 所谓双缓冲技术,下面是百度百科的解释: 我们看电视时,看到的屏幕称为OSD层,也就是说,只有在OSD层

MFC加载PNG图片并实现双缓冲

因为PNG包含Alpha通道,所以不同于BITMAP,在MFC中使用CImage类对其进行处理,通常使用load和draw成员函数. 所以标题的论述可以进一步解释为,使用CImage实现双缓冲. 通常的双缓冲方法为(首先将消息函数afx_msg BOOL OnEraseBkgnd(CDC* pDC)的函数体改为return TRUE): CDC memDC; CBitmap bmp; bmp.CreateCompatibleBitmap(pDC,WINDOW_WIDTH,WINDOW_HEIGH

MFC利用双缓冲刷新绘图

在VC中进行绘图过程处理时,如果图形刷新很快, 经常出现图形闪烁的现象.利用先在内存绘制,然后 拷贝到屏幕的办法可以消除屏幕闪烁,具体的方法是先在内存 中创建一个与设备兼容的内存设备上下文,也就是开辟一快内 存区来作为显示区域,然后在这个内存区进行绘制图形.在绘制完成后利用 BitBlt函数把内存的图形直接拷贝到屏幕上即可. 具体想实现的是: 在Dialog客户区的一个图片控件(IDC_MAP)中绘制几个动态的点,如果不用双缓冲的技术,在屏幕刷新的时候会有闪烁的现象. CRect rect; C

Win32 GDI 非矩形区域剪裁,双缓冲技术

传统的Win32通过GDI提供图形显示的功能,包括了基本的绘图功能,如画线.方块.椭圆等等,高级功能包括了多边形和Bezier的绘制.这样app就不用关心那些图形学的细节了,有点类似于UNIX上的X-window协议.你信或者不信,那些看上去很花哨的控件,其实就是一笔一划画上去的而已.GDI提供了画笔(用于线条).画刷(用于填充).调色板(用于支持256色显示).字体(用于文字).如果简单的图形不足以表达,你可以使用位图和画布(DC,设备上下文)直接将图像绘制到屏幕上去.此外,GDI还支持一些简