`
cppmule
  • 浏览: 436771 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

重载OnEraseBkgnd()函数防止闪烁

    博客分类:
  • MFC
 
阅读更多

重载OnEraseBkgnd()函数

     在使用VC进行绘图时,最郁闷的就是屏幕闪烁问题。有时只能使用双缓冲去解决,当然更多的时候是去忍受。有没有什么这种的方法?有,那就是重载OnEraseBkgnd()函数。该函数控制重绘图的背景刷新,默认将窗口用系统背景颜色填充,即用白色将窗口刷一遍。这就产生的严重的闪烁效果,有时看到屏幕白的一条一闪而过,非常不爽。如果将该函数返回值设为TRUE,即不进行背景重绘,虽然屏幕的刷新仍然会闪烁,但是就不会像原来那么严重了。因为窗口的颜色通常与白色反差加大,所以闪烁比较严重。而不进行背景重绘,由于大部分区域新画的颜色与旧颜色相同,就不会有严重的闪烁效果了。这样做有没有什么不好的后果呢?通常情况是没有的,因为一般都是执行整个窗口的重绘,即使用白色刷了背景,也是没有任何作用的。除非你刷新整个屏幕,但只重绘一小部分,这种情况可能么?有可能,比如你通过点击一个按钮来刷新整个窗口,重新绘制的有效区域要比刷新之前小,这些不重叠的区域在重载OnEraseBkgnd()函数之前会变作白色,而重载之后会保持原来的样子。

      下面说两种重载OnEraseBkgnd()函数的方法:

     1)手工重载

      在要重载的类(通常为CView的子类)声明部分(.h文件)添加虚函数的声明:
      virtual BOOL OnEraseBkgnd(CDC* pDC);
      注意添加在//{{AFX_VIRTUAL(CMyView)和//}}AFX_VIRTUAL之间。

      在类的定义文件(.cpp)中的MESSAFE_MAP部分,//{{AFX_MSG_MAP(CMyView)和 //}}AFX_MSG_MAP之间添加ON_WM_ERASEBKGND()。
      然后在函数体添加:
      BOOL CMyView::OnEraseBkgnd(CDC* pDC)
     {
          return TRUE;
     }

     这样就搞定了。

     2)使用Classwizard

     或者使用Classwizard来进行,省去了写代码。通过菜单View->ClassWizard(或者ctrl+W)->Class    name中选你的view。然后在Class Info选项卡中,将Message Filter设为Child Window。重新切换到Message Map选项卡,在Messages中找到WM_ERASEBKGND,双击就添加成功了。点击右边的Edit Code,将函数体改为return TRUE,搞定。这种方法不需要记忆,简单省事,强烈推荐。

分享到:
评论

相关推荐

    在vc6.0中 画实时曲线

    1.重载了OnEraseBkgnd函数,它是用来在每次重绘之前用空白位图擦除背景的函数,我们让它每次用我们自定义的位图来作为背景 2.我们使用了双缓存的结构,即先把背景图形绘制在内存中,绘制好了一起显示出去

    用实验理解 Invalidate,InvalidateRect,OnEraseBkgnd(CDC* pDC),OnPaint() 之间的关系

    用实验理解 Invalidate,InvalidateRect,OnEraseBkgnd(CDC* pDC),OnPaint() 之间的关系,调试的时候先点击开始,然后注意看窗口的标题栏 等过了一段时间后,分别点击其他三个按钮,最好用vs2003调试 vs2013也行

    【转】绘制_OnPaint和OnEraseBkgnd的联系

    在VC++中常用的OnPaint和OnEraseBkgnd,在这篇简短的文档中,粗略的讲解了一下两者的 联系,旨在给大家一点启发与提示、

    VC—主框架窗口绘制背景

    使 用VC进行项目开发,特别是简单的MIS系统开发中,通常在用户没有进行操作之前显示的是主框架的窗口(用户点击...但是对于主框架的背景的绘制不能简单地用ClassWizard重载 OnEraseBkgnd(CDC* pDC)函数的方法实现。

    DrawBackground用VC++实现,改变窗口背景

    对多文档窗口应用程序中的主框架,可改变窗口的背景,使程序看起来更专业,窗口改变背景不能简单地用ClassWizard重载OnEraseBkgnd(CDC* pDC)函数的方法 实现。 因为多文档窗口应用程序中的主框架窗口的背景区是一个...

    MFC双缓存无闪烁画图

    OnEraseBkgnd(CDC* pDC)方法里实现了无闪烁切换背景图。。。

    双缓冲绘图实现图片查看格式转换器

    基于MFC单文档的图片查看格式转换器 功能描述: 1、支持BMP,JPG,GIF,PNG等多种格式相互转换(打开->另存为) ...PS:双缓冲绘图为两步:一是创建内存DC,二是重写OnEraseBkgnd(CDC* pDC)函数。

    OnPaint()的工作原理

    MFC中改变对话框背景的几个消息函数的调用顺序、VC中OnPaint()的工作原理.

    VC之美化界面篇本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者。读者最好具有以下VC基础:

    3. 利用MFC类的虚函数机制,重载有用的虚函数。在MFC框架调用该函数的时候,重新定义它的状态和行为; 一般来说,应用程序可以通过以下两种途径来实现以上的方法: 1. 在父窗口里,截获自身的或者由子元素(包括...

    单文档实现图片移动

    MFC创建一个单文档,实现图片在客户区来回移动

    ATL窗口实现

    MESSAGE_HANDLER(WM_ERASEBKGND,CPaintBkgndBase::OnEraseBkgnd) 这样更能体现ATL类的扩展特征。 3.ATL比起MFC的稍微不便的地方是需要手动添加消息处理宏,以及 消息处理函数中需要分清WPARAM wParam和LPARAM ...

    MFCAppTest-自绘动画窗口.rar

    VS2017代码,MFC自绘制窗口:以动态形式实现自绘制窗口的淡入和淡出,主要知识点包括:SetTimer、OnEraseBkgnd、MoveWindow、KillTimer等函数的应用

    PT80-NEAT开发指南v1.1

    NEAT 开 发 指南 文档 适用于 PT80 系列 移动数据终端 版本记录 版本号 版本描述 发布日期 V 1.0 初始版本。 2012-04-12 V1.1 修改前三章内容 2012-09-25 目录 第一章 关于本手册.....................................

    mfc鼠标点击绘图并保存图像

    在mfc窗口中绘图画线,刷新后也不会消失,保存图像文件到本地,限定鼠标样式及移动范围,实时提示坐标位置,修改窗口背景色,没有标题栏也能通过鼠标按住移动窗口;代码精练,功能齐全,注释详细

    如何在MFC程序中调用OpenGL

    讲述了如何在MFC单文档程序中应用OpenGL进行显示 后面用的过程中发现调整窗口大小时背景会闪烁,需要添加WM_ERASEBKGND消息,并注释掉CView::OnEraseBkgnd(),直接 return TRUE;

    基于MFC单文档的OpenGL环境配置

    基于MFC单文档的OpenGL环境配置 基于MFC单文档的OpenGL环境配置 基于MFC单文档的OpenGL环境配置 //return CView::OnEraseBkgnd(pDC); //注释掉,消除绘图屏幕闪烁问题,改为 return TRUE;

    VC++做异形窗口 透明效果

    ERASEBKGND消息,Windows向窗口发送一个WM_ERASEBKGND消息通知该窗口擦除背景,可以使用VC++的ClassWizard重载该消息的缺省处理程序来擦除背景(实际是用刷子画),并返回TRUE以防止Windows擦除窗口。2.改变窗口...

    CEdit_Fainal

    BOOL CMyEdit::OnEraseBkgnd(CDC* pDC) { CDC memDC; memDC.CreateCompatibleDC(pDC); memDC.SelectObject(&m_Bitmap); BITMAP m_Bmp; m_Bitmap.GetBitmap(&m_Bmp);

    易语言窗口复制模块

    窗口复制模块,取复制窗口标记,复制整个窗口,复制控件,处理随意移动,CopyWindow_OnMessage,CopyWindow_CallSrcWindowProc,CopyWindow_OnDestroy,CopyWindow_OnLButtonDown,CopyWindow_OnEraseBkgnd,CopyWindow_...

Global site tag (gtag.js) - Google Analytics