zoukankan      html  css  js  c++  java
  • 重载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,搞定。这种方法不需要记忆,简单省事,强烈推荐。


  • 相关阅读:
    【Django】Django 定时任务实现(django-crontab+command)
    【Django】Django web项目部署(Nginx+uwsgi)
    【python】pandas & matplotlib 数据处理 绘制曲面图
    Struts2的简单使用
    Servlet,jsp,JSP技术 ,JSP编程
    Servlet、JSP中页面跳转的方式
    html/京东项目/京东网页高仿/js/jq/css/java web/
    Java ResourceBundle类的使用
    sql语句executeQuery和executeUpdate之间的区别
    jdbc/DAO模式
  • 原文地址:https://www.cnblogs.com/rainbowzc/p/1742970.html
Copyright © 2011-2022 走看看