MFC 显示图形如何避免闪烁

彻底解决MFC画面闪烁问题 闪烁的原因 画面闪烁的原因是一方面画面更新的太快,另一方面,采用了Invalidate(),即先擦除全部图画,再进行绘画,两者结合,导致画面闪烁,具体原理是绘画的图像和背景相差较大,即面积较大,颜色相差较大且每帧图像变化不明显,再加上频繁重绘,界面反复的在背景和图画间切换,最后的结果就就是闪烁严重。 探索解决办法 网上很多文章提出了双缓冲绘图法,这种办法虽然能够一定的缓解闪烁,但是还是没有从根本上解决上述问题,绘图过快的时候还是可能出现闪烁现象的,如果我们采用不擦除刷新,那么虽然每帧的图像差距不大了,不再闪 阅读详情

转载地址: http://hi.baidu.com/moreeffort/blog/item/35a90b4e0bc1d7ecd62afc53.html


显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题。   
  而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案。   
  MFC的绘图效率的确不高但也不差,而且它的绘图函数使用非常简单,   
  只要使用方法得当,再加上一些技巧,用MFC可以得到效率很高的绘图程序。   
  我想就我长期(呵呵当然也只有2年多)使用MFC绘图的经验谈谈   
  我的一些观点。   
    
  1、显示的图形为什么会闪烁?   
  我们的绘图过程大多放在OnDraw或者OnPaint函数中,OnDraw在进行屏   
  幕显示时是由OnPaint进行调用的。当窗口由于任何原因需要重绘时,   
  总是先用背景色将显示区清除,然后才调用OnPaint,而背景色往往与绘图内容   
  反差很大,这样在短时间内背景色与显示图形的交替出现,使得显示窗口看起来   
  在闪。如果将背景刷设置成NULL,这样无论怎样重绘图形都不会闪了。   
  当然,这样做会使得窗口的显示乱成一团,因为重绘时没有背景色对原来   
  绘制的图形进行清除,而又叠加上了新的图形。   
  有的人会说,闪烁是因为绘图的速度太慢或者显示的图形太复杂造成的,   
  其实这样说并不对,绘图的显示速度对闪烁的影响不是根本性的。   
  例如在OnDraw(CDC *pDC)中这样写:   
  pDC->MoveTo(0,0);   
  pDC->LineTo(100,100);   
  这个绘图过程应该是非常简单、非常快了吧,但是拉动窗口变化时还是会看见   
  闪烁。其实从道理上讲,画图的过程越复杂越慢闪烁应该越少,因为绘图用的   
  时间与用背景清除屏幕所花的时间的比例越大人对闪烁的感觉会越不明显。   
  比如:清楚屏幕时间为1s绘图时间也是为1s,这样在10s内的连续重画中就要闪   
  烁5次;如果清楚屏幕时间为1s不变,而绘图时间为9s,这样10s内的连续重画   
  只会闪烁一次。这个也可以试验,在OnDraw(CDC *pDC)中这样写:   
  for(int i=0;i<100000;i++)   
  {   
  pDC->MoveTo(0,i);   
  pDC->LineTo(1000,i);   
  }   
  呵呵,程序有点变态,但是能说明问题。   
  说到这里可能又有人要说了,为什么一个简单图形看起来没有复杂图形那么   
  闪呢?这是因为复杂图形占的面积大,重画时造成的反差比较大,所以感觉上要   
  闪得厉害一些,但是闪烁频率要低。   
  那为什么动画的重画频率高,而看起来却不闪?这里,我就要再次强调了,   
  闪烁是什么?闪烁就是反差,反差越大,闪烁越厉害。因为动画的连续两个帧之间   
  的差异很小所以看起来不闪。如果不信,可以在动画的每一帧中间加一张纯白的帧,   
  不闪才怪呢。   
    
    
  2、如何避免闪烁   
  在知道图形显示闪烁的原因之后,对症下药就好办了。首先当然是去掉MFC   
  提供的背景绘制过程了。实现的方法很多,   
  * 可以在窗口形成时给窗口的注册类的背景刷付NULL   
  * 也可以在形成以后修改背景   
  static CBrush brush(RGB(255,0,0));   
  SetClassLong(this->m_hWnd,GCL_HBRBACKGROUND,(LONG)(HBRUSH)brush);   
  * 要简单也可以重载OnEraseBkgnd(CDC* pDC)直接返回TRUE   
  这样背景没有了,结果图形显示的确不闪了,但是显示也象前面所说的一样,   
  变得一团乱。怎么办?这就要用到双缓存的方法了。双缓冲就是除了在屏幕上有   
  图形进行显示以外,在内存中也有图形在绘制。我们可以把要显示的图形先在内存中   
  绘制好,然后再一次性的将内存中的图形按照一个点一个点地覆盖到屏幕上去(这个   
  过程非常快,因为是非常规整的内存拷贝)。这样在内存中绘图时,随便用什么反差   
  大的背景色进行清除都不会闪,因为看不见。当贴到屏幕上时,因为内存中最终的图形   
  与屏幕显示图形差别很小(如果没有运动,当然就没有差别),这样看起来就不会闪。   
    
    
  3、如何实现双缓冲   
  首先给出实现的程序,然后再解释,同样是在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();   
    
  上面的注释应该很详尽了,废话就不多说了。   
    
    
  4、如何提高绘图的效率   
  我主要做的是电力系统的网络图形的CAD软件,在一个窗口中往往要显示成千上万个电力元件,而每个元件又是由点、线、圆等基本图形构成。如果真要在一次重绘过程重画这么多元件,可想而知这个过程是非常漫长的。如果加上了图形的浏览功能,鼠标拖动图形滚动时需要进行大量的重绘,速度会慢得让用户将无法忍受。怎么办?只有再研究研究MFC的绘图过程了。   
  实际上,在OnDraw(CDC *pDC)中绘制的图并不是所有都显示了的,例如:你   
  在OnDraw中画了两个矩形,在一次重绘中虽然两个矩形的绘制函数都有执行,但是很有可能只有一个显示了,这是因为MFC本身为了提高重绘的效率设置了裁剪区。裁剪区的作用就是:只有在这个区内的绘图过程才会真正有效,在区外的是无效的,即使在区外执行了绘图函数也是不会显示的。因为多数情况下窗口重绘的产生大多是因为窗口部分被遮挡或者窗口有滚动发生,改变的区域并不是整个图形而只有一小部分,这一部分需要改变的就是pDC中的裁剪区了。因为显示(往内存或者显存都叫显示)比绘图过程的计算要费时得多,有了裁剪区后显示的就只是应该显示的部分,大大提高了显示效率。但是这个裁剪区是MFC设置的,它已经为我们提高了显示效率,在进行复杂图形的绘制时如何进一步提高效率呢?那就只有去掉在裁剪区外的绘图过程了。可以先用pDC->GetClipBox()得到裁剪区,然后在绘图时判断你的图形是否在这个区内,如果在就画,不在就不画。   
  如果你的绘图过程不复杂,这样做可能对你的绘图效率不会有提高。

MFC 图像闪烁原理及规避方法 闪烁的原理:在知道图形显示闪烁的原因之后,对症下药就好办了。首先当然是去掉MFC 提供的背景绘制过程了。实现的方法很多, * 可以在窗口形成时给窗口的注册类的背景刷付NULL * 也可以在形成以后修改背景 static CBrush brush(RGB(255,0,0)); SetClassLong(this->m_hWnd,GCL_HBRBACKGROUND,(LONG)(HBRUSH)brus 阅读详情

相关推荐

FCN---训练cityspaces

未经允许,不要随意转载! 最近想试试用FCN训练自己的数据集,想想标注是一件很费劲的事,于是就想到了用其他库里的数据,这里选用了cityspaces,默认已经配置好FCN. 1、下载cityspaces https://www.cityscapes-dataset.com/ 需要注册一个账号 cityspaces包含2...

wangyu088的专栏 2033

MFC如何高效地绘图

MFC如何高效地绘图         [   作者:   TouchMe       添加时间:   2001-12-25   8:21:34   ]                         显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题。     而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案。     MFC的绘图效率的确不高但也不差,而且它的绘图函数使用非

qj840828的专栏 1153

Py6S安装失败?手把手教你解决‘6S executable not found‘错误

本文详细解析了Py6S安装过程中常见的'6S executable not found'错误,提供了从MinGW-w64安装到Fortran编译器配置的完整解决方案。通过优化编译环境和进阶技巧,帮助用户高效完成大气辐射传输建模,提升科学计算效率。

x1y2z的博客 642

OnPaint()闪烁问题

void CXinDlg::OnPaint()  {    if (IsIconic())    {       CPaintDC dc(this); // device context for painting       SendMessage(WM_ICONERASEBKGND, (WPARAM)dc.GetSafeHdc(), 0);       // Center icon in c

fuzaiyin5620的博客 1970

FFmpeg + OBS 低延迟直播串流实战:从H264裸流到RTP组播的完整配置

本文详细介绍了如何利用FFmpeg将H264裸流转码为RTP协议,并通过组播技术实现与OBS客户端的超低延迟直播串流。文章深入剖析了FFmpeg关键参数调优、SDP文件生成与配置,以及OBS客户端的无缝拉流方法,为需要毫秒级实时交互的场景提供了一套去中心化、高效稳定的完整解决方案。

fanta的博客 830

从无人机到机械臂:深入聊聊LQR和LQG在实际项目里的那些‘坑’与最佳实践

本文深入探讨了LQR和LQG在无人机和机械臂等实际项目中的应用挑战与最佳实践。从系统建模的妥协艺术到调参的系统化方法,再到离散化的细节处理,文章分享了工程实践中的宝贵经验。特别强调了如何应对传感器噪声、未建模动态等现实问题,并提供了实用的调试工具和诊断流程,帮助工程师避免常见陷阱,提升控制系统的稳定性和性能。

weixin_28683391的博客 386

解决Windows 程序界面闪烁问题的一些经验

本文转载自:http://blog.joycode.com/yaodong/archive/2004/11/26/39764.aspx 一般的windows 复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口移动或者改变大小的时候出现闪烁。 先来谈谈闪烁产生的原因 原因一: 如果熟悉显卡原理的话,调用GDI函数向屏幕输出的时候并不是立刻就显示在屏幕 上只是写到了...

weixin_30838873的博客 225

初识YUV,实战NV21格式数据转换为Bitmap

初识YUV,并使用YUV数据生成Bitmap图像一、初识YUV二、采样方式2.1、YUV 4:4:42.2、YUV 4:2:22.2、YUV 4:2:2 一、初识YUV 说到YUV我们就必须先从RGB说起了,如下图所示,请各位把每个色块当成一个像素点。通常一个像素点由RGB(Alpha我们先不考虑)三原色组成。 如下图中第一个像素点,其RGB值分别为(236,102,93),而这三个值就组成了我们看到的 红色 。 然而上图中除了RGB值外,我还标出了每个像素点的YUV的值,YUV的值是怎么来的呢?直接给公

乐翁龙 7127

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

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

云海唯C的专栏 1053

RV1126 ISP调参实战:3A算法参数调节的7个技巧

││ │ DEMOSAIC (去马赛克) │ ││ │ GAMMA (Gamma 校正) │ ││ │ DPC (坏点校正) │ ││。

小灰灰的博客 665

电商行业分析爬虫:抓取行业数据,进行行业分析

电商行业数据分析对于市场研究、竞争分析和商业决策至关重要。通过爬取电商平台的数据,我们可以深入了解市场动态、消费者行为和商品销售情况。本文将介绍如何构建一个电商行业分析爬虫,抓取商品信息、销售数据和用户评价等,并进行数据分析。

u014481728的博客 1628

MFC双缓冲解决图象闪烁

转载网上找到的一篇双缓冲的文章,很好用。 _______________________________________________________________________ 显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题。而且多数人认为MFC的绘图函数效

MOKA 347

使用微信小程序开发制作一个简单的在线问答应用

以上就是一个简单的在线问答小程序的开发过程。其中包括前端界面的布局和逻辑,后端接口的设计和实现,以及部署和测试的步骤。通过以上步骤,你可以自己尝试开发一个类似的在线问答应用。

2401_85258012的博客 798

mfc 绘图

用MFC如何高效地绘图 显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题。  而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案。  MFC的绘图效率的确不高但也不差,而且它的绘图函数使用非常简单,  只要使用方法得当,再加上一些技巧,用MFC可

bopzhou 1629

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

引用:显示图形如何避免闪烁

我知道在内存中做 然后贴上去 但那样还是很闪回复人: windows_editor(等咱有钱了,每天早上喝两大碗豆浆)显示图形如何避免闪烁    显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题。而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案。MFC的绘图效率的确不高但也不差,而且它的绘图函数使用非常简单,只要使用方法得当,再加上一些技巧,用MFC可以得到效率很高的绘图程

lei001的专栏 1213

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

图形显示问题

显示图形如何避免闪烁,如何提高显示效率是最近遇到的问题。查阅了很多资料,然后现在稍微总结一下。    绘图过程一般是写在OnDraw或者OnPaint函数里,OnDraw是由OnPaint进行调用的。当窗口需要重绘时,首先用背景色将显示区清除,然后调用OnPaint,而背景色往往与绘图内容反差很大,这样在短时间内背景色与显示图形的交替出现,使得显示窗口看起来在闪烁。如果将背景刷设置成NULL,

Sin_Geek成长の迹 2324

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

双缓冲绘图

<br />显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题。而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案。 <br />  MFC的绘图效率的确不高但也不差,而且它的绘图函数使用非常简单,只要使用方法得当,再加上一些技巧,用MFC可以得到效率很高的绘图程序。 <br /> 我想就我长期(呵呵当然也只有2年多)使用MFC绘图的经验谈谈我的一些观点。 <br />   <br />  1、显示的图形为什么会闪烁? <br />       我们的绘图过程大多放在OnDraw或者On

chinaclock的专栏 697

[转]WINCE双缓冲绘图

介绍闪烁原理及双缓冲绘图的实现

寂竹 1442

BitBlt()双缓冲解决图象闪烁

显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题。而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案。MFC的绘图效率的确不高但也不差,而且它的绘图函数使用非常简单,只要使用方法得当,再加上一些技巧,用MFC可以得到效率很高的绘图程序。我想就我长期(呵呵当然也只有2年多)使用MFC绘图的经验谈谈我的一些观点。1、显示的图形为什么会闪烁?   我们的绘图过程大多放在OnDraw

木头人专栏 2180

MFC双缓冲解决图象闪烁[转]

转载网上找到的一篇双缓冲的文章,很好用。http://www.cnblogs.com/piggger/archive/2009/05/02/1447917.html_______________________________________________________________________ 显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题。而且多数人认为MFC的...

412

用 MFC 如何高效地绘图

         显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题。而且多数人认为 MFC 的绘图函数效率很低,总是想寻求其它的解决方案。MFC 的绘图效率的确不高但也不差,而且它的绘图函数使用非常简单,只要使用方法得当,再加上一些技巧,用 MFC 可以得到效率很高的绘图程序。我想就我长期(呵呵当然也只有2年多)使用 MFC 绘图的经验谈谈我的一些观点。 1、显示的图形为什么会闪烁? ...

netstore的专栏 1352

无闪烁刷屏技术的实现如何提高绘图的效率

  无闪烁刷屏技术的实现在实现绘图的过程中,显示的图形总是会闪烁,笔者曾经被这个问题折磨了好久,通过向高手请教,搜索资料,问题一基本解决,现将文档整理出来以供大家参考.1.    显示的图形为什么会闪烁?我们的绘图过程大多放在OnDraw或者OnPaint函数中,OnDraw在进行屏幕显示时是由OnPaint进行调用的。当窗口由于任何原因需要重绘时,总是先用背景色将显示区清除,然后才调用OnPai

加肥冒 1362

BitBlt()双缓冲解决图象闪烁(转贴)

BitBlt()双缓冲解决图象闪烁显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题。而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案。MFC的绘图效率的确不高但也不差,而且它的绘图函数使用非常简单,只要使用方法得当,再加上一些技巧,用MFC可以得到效率很高的绘图程序。我想就我长期(呵呵当然也只有2年多)使用MFC绘图的经验谈谈我的一些观点。1、显示的图形为什么会闪烁?   

梦的归宿 2409

MFC双缓冲绘图

双缓冲绘图的核心是将所有绘图操作的屏幕设备CDC pDC 用自定义的内存设备CDC MemDC来代替,然后通过在内存的位图CBitmap中作图,然后将作好的图复制到屏幕MemDC来显示,同时禁止背景刷新,从而消除闪烁。 一、原因 窗体在响应WM_PAINT消息的时候要进行复杂的图形处理,那么窗体在重绘时由于过频的刷新而引起闪烁现象。因为窗体在刷新时会有一个擦除原来图象的过程OnEraseBkgnd,它利用背景色填充窗体绘图区,然后在调用新的绘图代码进行重绘,这样一擦一写造成了图象颜色的反差。当WM_PA

ThorKing01的博客 2892

计算机图形学MFC-双缓冲二维图形几何变换算法CC代码:二维图形变换的强大工具

计算机图形学MFC-双缓冲二维图形几何变换算法CC代码:二维图形变换的强大工具 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 计算机图形学MFC-双缓冲二维图形几何变换算法 C/C++代码是一个开源项目,旨在为计算机图形学的学习者提供一个实践和研究的平台。该项目基于2019年的课程作业代码,通过C/C++语言和MFC框架,实现了高效的二维图形几何变换算法。 项目技术分...

gitblog_06720的博客 282
上一篇: 纯虚函数
下一篇: C++中使用CAtlHttpClient显示网络图片的方法,支持png,bmp,gif图片格式
mnorst
博客等级 码龄16年 38粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值