我正在研究vc++的框架,有一个问题不懂:
既然在程序运行中,不论是打开文档还是新建文档,CWinApp都通过调用多文档模板来构造一个文档对象、一个子框架对象和一个视图对象,并调用其相关的资源进行编辑。那我加上:AfxMessageBox("ok");这个语句。在未开始运行前,我想结果可能是每次file\new之后,都会显示ok,即打开几个新文档就有几个ok的显示窗口, 但实践后发现我错了,只有一个ok的窗口,这是为什么呢?为什么只运行了一次?
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_DRAWTYPE,
RUNTIME_CLASS(CDrawDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CDrawView));
AddDocTemplate(pDocTemplate);
AfxMessageBox("ok");
既然在程序运行中,不论是打开文档还是新建文档,CWinApp都通过调用多文档模板来构造一个文档对象、一个子框架对象和一个视图对象,并调用其相关的资源进行编辑。那我加上:AfxMessageBox("ok");这个语句。在未开始运行前,我想结果可能是每次file\new之后,都会显示ok,即打开几个新文档就有几个ok的显示窗口, 但实践后发现我错了,只有一个ok的窗口,这是为什么呢?为什么只运行了一次?
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_DRAWTYPE,
RUNTIME_CLASS(CDrawDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CDrawView));
AddDocTemplate(pDocTemplate);
AfxMessageBox("ok");
pDocTemplate = new CMultiDocTemplate(
IDR_DRAWTYPE,
RUNTIME_CLASS(CDrawDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CDrawView));
AddDocTemplate(pDocTemplate);
是MFC框架自动加在App类的InitInstance函数里面的。这函数用于初始化你的应用程序对象。这段代码用于初始化你的文档模板链表。每一次从菜单选择new的时候,应用程序会找你的这个文档模板链表,看看一共有多少种模板,然后给你一个提示筐让你创建一个文档,由于每一个模板对象还关联了相应的视图类和框架类,你的应用程序就知道该创建哪些与你选择的文档相应的视图和子框架。这段代码只用于初始化文档模板链表,不是实际你在选择新建时执行的代码。你想一想,一个应用程序对象难道还要初始化很多遍吗?当然你的AfxMessageBox("OK")只能执行一遍了。每个文档模板用于创建和管理一个或多个同种类型的文档(这取决于应用程序是单文档SDI程序还是多文档MDI程序)??
单文档程序一样可以创建多个文档模板,一样可以支持多种类型的文件。单文档和多文档的区别其实就在于单文档程序一次只能有一个窗口,而多文档程序可以同时打开多个子窗口。