文档、视图、框架的创建是由文档模板创建的。文档模板负责管理文档、视图和框架。当用户创建一个文档/视图结构的应用程序时,在应用程序的Instance方法中会发现如下代码
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CCMyviewDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CCMyviewView));
AddDocTemplate(pDocTemplate);
这里的程序首先定义了一个文档模板的指针pDocTemplate,然后调用构造函数在堆上创建实例。CSingleDocTemplate的构造函数主要是调用了基类的CDocTemplate初始化内部的数据成员m_pDocClass,pFrameClass,pViewClass,nIDResource.
在应用程序的InitInstance方法中,当文档模板创建后,调用AddDocTemplate将文档模板添加到文档管理器(CDocManager)当中。CWinApp提供了一个文档管理器的指针m_pDocManager,应用程序就是通过该指针将文档模板添加到文档管理器当中的。
代码部分如下:
void AddDocTemplate(CDocTemplate* pTemplate)
{
if(m_pDocManager == NULL)
m_pDocManager = new CDocManager;
m_pDocManager->AddDocTemplate(pTemplate);
}
文档管理器的AddDocTemplate方法,是在CDocManageemper中定义了一个文档模板列表m_templateList,一个静态的文档模板指针pStaticList.当AddDocTemplate方法传递的文档模板为空时,会将静态文档模板指针中的模板添加到m_templateList中,如果文档模板不为空,将该模板添加到m_templateList的末尾。
文档的创建:
在应用程序的InitInstance方法中有下面几行代码
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
return FALSE;
其中,应用程序CWinApp的ProcessShellCommand方法用于处理命令行。
由于命令行类CCommandLineInfo的默认构造函数将m_nShellCommand初始化为FileNew,所以将执行一下代码
switci()
{
case CCommandLineInfo::FileNew:
if(!AfxGetApp()->OnCmdMsg(ID_FILE_NEW,0,NULL,NULL)) OnFileNew();
......................
}
默认情况下,应用程序对象在消息映射部分处理了ID_FILE_NEW消息,代码如下:
BEGIN_MESSAGE_MAP(CCMyviewApp, CWinApp)
//{{AFX_MSG_MAP(CCMyviewApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
// Standard file based document commands
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
// Standard print setup command
ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()
因此,会调用应用程序