Visual C++中实现双缓冲的基本原理

  双缓冲的原理可以这样形象的理解:把电脑屏幕看作一块黑板。首先我们在内存环境中建立一个“虚拟“的黑板,然后在这块黑板上绘制复杂的图形,等图形全部绘制完毕的时候,再一次性的把内存中绘制好的图形“拷贝”到另一块黑板(屏幕)上。采取这种方法可以提高绘图速度,极大的改善绘图效果。

  例如在OnDraw()函数中可以如下所述实现双缓冲,其主要步骤分为四步:

  


      CPen Pen;

      Pen.CreatePen(PS_INSIDEFRAME,1,RGB(225,225,0));

  CBrush Brush;Brush.CreateSolidBrush(RGB(225,225,0));

  CDC dcMem;CBitmap bm;

  CRect rc;

  GetClientRect(&rc);

  // Step 1:为屏幕DC创建兼容的内存DC :

  CreateCompatibleDC()dcMem.CreateCompatibleDC(pDC);

  // Step 2:创建位图:

  CreateCompatibleBitmap()bm.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());

  // Step 3:把位图选入设备环境:SelectObject(),可以理解为选择画布dcMem.SelectObject(&bm);

  dcMem.SelectObject(Pen);

  dcMem.SelectObject(Brush);

  dcMem.Ellipse(0,0,50,50);

  //画椭圆// Step 4:把绘制好的图形“拷贝“到屏幕上:BitBlt()pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY);

  dcMem.DeleteDC();

  bm.DeleteObject();

  这样便实现了双缓冲,通过这个方法可以防止在VC中画图时出现屏幕闪烁的情况。

时间: 2024-09-21 03:13:33

Visual C++中实现双缓冲的基本原理的相关文章

java中的双缓冲技术

毕业设计有个远程协助功能,得到对方的屏幕后,老是会闪,很是不爽,今天用java的双缓冲技术解决了.代码如下,本类重写了Swing中的JLabel,当Label重绘时,会默认的调用它的update方法,主要用于清除界面,然后update方法会调用paint方法,再把界面画上去,所以我现在update方法中创建了一个Image和Graphics对象Image off_screen_buf和off_screen_gc同时设置其大小和MyLabel对象的大小一样,用于把要画的东东先绘制到后台内存中,然后

【求助】关于Java中的双缓冲技术

问题描述 我尝试写一个人物行走的动画.我使用了双缓冲技术,但是屏幕仍然会闪烁,希望大家能够帮我找到其中的错误.代码如下:(1)精灵类packagesprite;importjava.awt.*;importjava.awt.image.*;importjavax.swing.*;publicclassSprite{publicintm_posX=0,m_posY=0;privateImagepic[]=null;privateintmPlayID=0;booleanmFacus=true;pub

基于WTL中使用双缓冲避免闪烁的解决方法_C 语言

在自己画的窗口中,有时候会有闪烁现象.为什么会有闪烁现象呢?其实是因为程序在画窗口时需要用背景色清空显示区域,然后再画.由于这两者的反差比较大,就会被人眼睛捕捉到,感觉闪烁.双缓冲就是先在内存中把图画好,然后直接复制到屏幕上去,这样的反差就比较小,也就不觉得闪烁了. WTL中的CDoubleBufferImplWTL中有现成的双缓冲类实现,可以很方便的使用就达到效果.CDoubleBufferImpl 在AtlFrame.h中.1.首先继承自CDoubleBufferImpl 复制代码 代码如下

JAVA中的双缓冲问题

/** *//** *双缓冲 *什么是重量级,轻量级 *轻量级在这里指用纯java实现的.重量级指和其他语言混合编程,这样耗用的资源多系统触发的绘画操作 *绘画操作的分类 *系统触发的和程序触发的绘画操作 *AWT的绘制与界面更新使用了一个单独的线程,称为AWT线程.这个线程可以在两种情形下更新显示. *一种情况是界面"显露",这可能会发生在界面首次显示时,或者界面某一部分由于被其它窗口遮盖后重新显示时.界面显露的处理是AWT自动进行的,. *第二种情况是程序在显示内容有所改变时进行界

双缓冲DoubleBuffered解决闪烁问题

一.使用默认的双缓冲 1 在应用程序中使用双缓冲的最简便的方法是使用 .NET Framework 为窗体和控件提供的默认双缓冲.通过将 DoubleBuffered 属性设置为 true.      this.DoubleBuffered=true; 2 使用 SetStyle 方法可以为 Windows 窗体和所创作的 Windows 控件启用默认双缓冲,在窗体或者控件的构造函数中添加如下代码即可: SetStyle(ControlStyles.ResizeRedraw,true); Set

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

[Qt教程] 第18篇 2D绘图(八)双缓冲绘图 楼主  发表于 2013-5-2 22:07:23 | 查看: 789| 回复: 1 双缓冲绘图 版权声明 该文章原创于Qter开源社区(www.qter.org),作者yafeilinux,转载请注明出处! 导语 在前面一节中,讲述了如何实现简单的涂鸦板,这一次我们将实现在涂鸦板上绘制图形,这里以矩形为例进行讲解.在后面还会提出双缓冲绘图的概念. 环境:Windows Xp + Qt 4.8.4+QtCreator 2.6.2 目录 一.绘制矩

双缓冲(Double Buffer)原理和使用【转】

转自:http://blog.csdn.net/acs713/article/details/16359551 原文出自:http://blog.csdn.net/xiaohui_hubei/article/details/16319249 一.双缓冲作用            双缓冲甚至是多缓冲,在许多情况下都很有用.一般需要使用双缓冲区的地方都是由于"生产者"和"消费者"供需不一致所造成的.这样的情况在很多地方后可能会发生,使用多缓冲可以很好的解决.我举几个常见

Visual Foxpro中的多用户及数据缓冲问题

visual|数据|问题 主题:Visual Foxpro中的多用户及数据缓冲问题 绍 很多狐友(Foxers)都是从Dbase―FoxBase―Foxpro―VFP这样一条路走过来的,如果说从FoxBase 到Foxpro是一次飞跃,那么从Foxpro到VFP就是一次升华.漫漫编程路上的两次大变化都伴随着升级的兴奋与适应的痛苦,惯性思维往往使我们容易忽略新版本的新内容.我们先来看看下面这个在表单中编辑记录的例子: 在Foxpro 2.X时代,我是这样设计的: 1. 在屏幕上放置与表中字段对应的

内存拷贝-MFC中图像无法使用双缓冲拷贝

问题描述 MFC中图像无法使用双缓冲拷贝 我接手了别人的程序,需要使用双缓冲绘图,程序中定义的内存对象pDC可以绘制任何曲线,绘制完毕后复制给窗体.但是内存对象pDC就不能进行BitBlt操作,哪怕是自身平移拷贝自身都不可以.pDC->BitBlt(0, 0, rect.Width(), rect.Height(),pDC, 10, 10, SRCCOPY);不知道是pDC哪里设置有了问题?