一直搞不懂一个问题  跟踪了vc自动生成的程序好久,怎么觉得程序就生成了一个主窗口  而视图类的派生类根本没有被实力话 那视图应该不会产生啊  而实际上视图是产生了的啊??为什么呢?我今天又在CXXView类的构造函数那设置了一个断点,发现构造函数根本没有被调用啊,那窗口上那个视图区域是怎么产生的呢?

解决方案 »

  1.   

    我今天又在CXXView类的构造函数那设置了一个断点,发现构造函数根本没有被调用啊,那窗口上那个视图区域是怎么产生的呢
    ------------------
    ??
    你在View类的构造函数中写个AfxMessageBox看看弹的出来不?
      

  2.   

    实例化的,CFrameWnd会调用CreateView。
      

  3.   

    Debug下跟踪App类的InitInstance函数中的(以SDI工程为例)CSingleDocTemplate* pDocTemplate;
    pDocTemplate = new CSingleDocTemplate(
    IDR_MAINFRAME,
    RUNTIME_CLASS(CGAEDoc),
    RUNTIME_CLASS(CMainFrame),       // main SDI frame window
    RUNTIME_CLASS(CGAEView));
    AddDocTemplate(pDocTemplate);F11进入看看,MFC是怎么将文档,框架,视图联系到一起的
      

  4.   

    关键就在这一句上:
    RUNTIME_CLASS(CGAEView));
    这个说起来很复杂,简单说说我的理解,初学,错误请指正
    简单的说就是有一个类信息表,专门存储类得信息,当要动态创建一个类得时候,就要到这个表里去找该类的相关信息
    声明类信息表的代码封装在DECLARE_DYNACREATE中
    实现信息表的代码在IMPLEMENT_DYNCREATE中
    这两个宏可以使类具有动态创建的能力
    你可以在~View.h中找到DECLARE_DYNACREATE(~View)而RUNTIME_CLASS宏的功能就是在上面创建的类信息表中找到相关信息,并调用该类的构造函数来创建对象
    因此RUNTIME_CLASS(CGAEView));这一句就是在类信息表中寻找View类得信息,并且调用View的构造函数,从而创建视图。