• XXXView类的OnDraw函数未执行


    功能实现点击一个outlookbar中的按钮则右侧显示对应的view视图,

    CView1,CView2,CView3 的onDraw函数都能执行,

    但是工程的XXXView中的OnDraw函数触发不了。

    一直没找到原因

    终于有一天发现在这个XXView中有一个OnPaint()函数,试试把这个函数注掉会怎么样。

    果然起作用了,

    再百度这2个函数有什么关联:

     (1)CView类是由CWnd类派生而来的,OnDraw是CView类的虚函数,OnPaint是CWnd的类成员函数,负责相应WM_PAINT消息。

    (2)一般是这样:窗口发出一个WM_PAINT消息,OnPaint函数响应这个消息,然后这个函数再调用OnDraw函数。虽然CView类中的OnDraw函数是虚函数,但是我们自己生成的CView类的子类已经将这个函数重载了。

    (3)假设我们在自己的View类中重载了OnPaint函数,但是在函数中又没有调用OnDraw函数,那么这个OnDraw函数就完全没有用了。//注意看这里

    (4)我们一般用OnPaint维护窗口的一个客户区,比如在窗口客户区添加一个背景图片;而在OnDraw函数中维护视图的客户区,比如用鼠标在客户区画图。


    如果在视类中同时存在OnDraw 与OnPaint两个函数,断点调试时会发现程序只走了OnPaint而没有走OnDraw,而如果只有OnDraw函数而没有OnPaint时,程序就会走OnDraw。而据我所知,OnPaint执行时会调用OnDraw,但两者同时存在时却只走了OnPaint,

    实验的结果是对的,请看view::OnPaint的实现代码

    1  // CView drawing support
    2 
    3 void CView::OnPaint()
    4 {
    5     // standard paint routine
    6     CPaintDC dc(this);
    7     OnPrepareDC(&dc);
    8     OnDraw(&dc);
    9 }
    C/C++ code?
       

     如果你在继承自类view的子类实现了OnPaint 函数,相当于子类OnPaint覆盖了
    父类的OnPaint函数,所以无法调用OnDraw函数
    但是如果子类OnPaint函数这样实现

    1   void CView_xxx::OnPaint()
    2 {
    3               CPaintDC dc(this);
    4         OnDraw(&dc);
    5 }

       


    OnDraw 函数又可以调用了

    关于OnCreate和OnDraw

    初学MFC 
    刚开始,我在view类中的OnCreate()中写了一段向窗口中插入一个光标的代码,一切正常,然后又在OnDraw()中写了一段想窗口中插入一段字符的代码,也一切正常,但当我把这两个东西颠倒过来,也就是在OnCreate()中写插入一段字符的时候,运行是根本看不到效果,而在OnDraw()中写插入光标的时候,当我用鼠标改变窗口的大小的时候,程序就爆掉了,请问这是为什么?
    首先你熟悉OnCreate()和OnDraw()函数的作用和用法,才能正确使用下面是他们的用法:
      OnCreate()是一个消息响应函数,是响应WM_CREATE消息的一个函数,而WM_CREATE消息是由Create函数调用的。在view类中,Create 是虚函数由框架调用,是用来“生成一个窗口的子窗口”。 而OnCreate 函数是用来“表示一个窗口正在生成”。一个窗口创建(Create)之后,会向操作系统发送WM_CREATE消息,OnCreate()函数主要是用来响应此消息的。因为在MFC里面用一种消息映射的机制来响应消息,也就是可以用函数来响应相应的消息。就拿CMainFrame类来说,当窗口创建后会产生WM_CREATE消息,我们可以在OnCreate函数里实现我们要在窗口里面增加的东西,例如按扭,状态栏,工具栏等。这些子窗口一般是定义成类中的一个成员变量,因为要保证生命周期。一般以m_开头来表示成员(member)。OnCreate()不产生窗口,只是在窗口显示前设置窗口的属性如风格、位置等,Create()负责注册并产生窗口
          OnDraw()函数每当窗口发生重绘时就会执行,它其实跟消息处理函数OnPaint()差不多。当在View类里添加了消息处理函数OnPaint()时,OnPaint()就会覆盖掉OnDraw()。
         用鼠标改变窗口的大小的时候,程序就爆掉这个应该是窗口重绘是有异常,有是编译程序是警告是不能忽略的,看看有什么警告把警告处理了。希望对你有所帮助!
  • 相关阅读:
    Java中对话框的弹出
    数据格式化和ModelAttribute注解的介绍
    SpringMVC的环境搭建
    Js基础之数组
    Js基础之函数
    POJ-3208 Apocalypse Someday (数位DP)
    HDU-6148 Valley Number (数位DP)
    [SCOI2009] [BZOJ1026] windy数
    POJ-2411 Mondriann's Dream (状压DP)
    「SCOI2005」互不侵犯 (状压DP)
  • 原文地址:https://www.cnblogs.com/totogo/p/10320680.html
Copyright © 2020-2023  润新知