深入浅出MFC“文档/视图”架构(3)――文档
2009-02-11 20:00:34 来源:WEB开发网在用户按下ID_FILE_OPEN及ID_FILE_NEW菜单(或工具栏)命令后,CWinApp(派生)类的OnFileNew、OnFileOpen函数首先被执行,其进行的行为是选择合适的文档模板,如图3.1所示。
图3.1文档模板的选择
实际上,图3.1中所示的“使用文件扩展名选择文档模板”、“是一个文档模板吗?”的行为都要借助于CDocManager类的相关函数,因为只有CDocManager类才维护了文档模板的列表。CDocManager::OnFileNew的行为可描述为:
void CDocManager::OnFileNew()
{
if (m_templateList.IsEmpty())
{
...
return ;
}
//取第一个文档模板的指针
CDocTemplate *pTemplate = (CDocTemplate*)m_templateList.GetHead();
if (m_templateList.GetCount() > 1)
{
// 如果多于一个文档模板,弹出对话框提示用户选择
CNewTypeDlg dlg(&m_templateList);
int nID = dlg.DoModal();
if (nID == IDOK)
pTemplate = dlg.m_pSelectedTemplate;
else
return ;
// none - cancel operation
}
…
//参数为NULL的时候OpenDocument File会新建一个文件
pTemplate->OpenDocumentFile(NULL);
}
之后,文档模板类的virtual CDocument* OpenDocumentFile(LPCTSTR lpszPathName, BOOL bMakeVisible = TRUE) = 0函数进行文档的创建工作,如果lpszPathName == NULL,是文档New行为;相反,则是Open行为。在创建框架后,文档模板根据是Open还是New行为分别调用CDocument的OnOpenDocument、OnNewDocument函数。图3.2描述了整个过程。
图3.2文档、框架窗口的创建顺序
而图3.3则给出了视图的创建过程。
图3.3视图的创建顺序
图3.1~3.3既描述了文档/视图框架对ID_FILE_OPEN及ID_FILE_NEW命令的响应过程,又描述了文档、框架窗口及视图的创建。的确,是无法单独描述文档的New和Open行为的,因为它和其他对象的创建交错纵横。
相信,随着我们进一步阅读后续连载,会对上述过程有更清晰的认识。
本文出自 “Inside SW,FW and HW R&D” 博客,请务必保留此出处http://21cnbao.blog.51cto.com/109393/120305
更多精彩
赞助商链接