hur.cn - 华软网

 热门搜索

视图类没有被实例化 那视图是怎么产生的?

  作者:未知    来源:网络    更新时间:2011/4/14
一直搞不懂一个问题  跟踪了vc自动生成的程序好久,怎么觉得程序就生成了一个主窗口  而视图类的派生类根本没有被实力话 那视图应该不会产生啊  而实际上视图是产生了的啊??为什么呢?我今天又在CXXView类的构造函数那设置了一个断点,发现构造函数根本没有被调用啊,那窗口上那个视图区域是怎么产生的呢?
---华软 网友回答---
我今天又在CXXView类的构造函数那设置了一个断点,发现构造函数根本没有被调用啊,那窗口上那个视图区域是怎么产生的呢
------------------
??
你在View类的构造函数中写个AfxMessageBox看看弹的出来不?
---华软网友回复---
实例化的,CFrameWnd会调用CreateView。
---华软网友回复---
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是怎么将文档,框架,视图联系到一起的
---华软网友回复---
引用 3 楼 visualeleven 的回复:
Debug下跟踪App类的InitInstance函数中的(以SDI工程为例)

CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CGAEDoc),
RUNTIME_CLASS(CMainFrame), // main SDI fr……

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

而RUNTIME_CLASS宏的功能就是在上面创建的类信息表中找到相关信息,并调用该类的构造函数来创建对象
因此RUNTIME_CLASS(CGAEView));这一句就是在类信息表中寻找View类得信息,并且调用View的构造函数,从而创建视图。      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。