您的位置:首页 > 其它

VS2015单文档视图项目中文档、框架以及视图创建过程

2017-10-17 22:36 471 查看
在VS2015中,创建一个基于单文档视图的MFC项目,该项目的名称为MFCApplication。通过向导成功创建项目之后发现,自动生成了很多文件。在这些文件中,MFCApplicationDoc.cpp和MFCApplictionDoc.h对应的是项目的文档类;MainFrm.cpp和MainFrm.h对应的是项目的框架类;MFCApplicationView.cpp和MFCApplication.h对应的是项目的视图类。那么,在MFCApplication项目中,是如何创建文档、框架和视图的呢?

1 CWinAppEx类及其派生类

在生成的MFCApplication项目中,包含了MFCApplication.cpp和MFCApplication.h两个文件,在这两个文件中,声明和定义了CWinAppEx类的派生类CMFCApplicationApp。
CMFCApplicationApp类是创建的MFCApplication项目的应用程序对象类,该类的父类CWinAppEx就代表着应用程序本身,可以说CWinAppEx取代了控制台程序和Win32程序中的入口函数。在控制台程序和Win32程序中,首先执行的是程序的入口函数,而在MFC的单文档项目中,首先执行的是CWinAppEx类的派生类中的一条语句
CMFCApplicationApp theApp;以上代码调用了CMFCApplicationApp类的构造函数,但是该构造函数没有定义,所以调用的是其父类即CWinAppEx的构造函数。在CWinAppEx类的构造函数中,对其成员变量进行初始化处理。

2 CWinAppEx类的虚函数InitInstance()

接下来调用CWinAppEx类的InitInstance()函数,由于该函数是CWinAppEx类的虚函数,如果其派生类覆盖(override)了InitInstance()函数,则调用子类的InitInstance()函数。

在MFCApplication.cpp中,可以看到CMFCApplicationApp类覆盖了InitInstance()函数。

2.1 单文档模板

单文档模板是单文档/视图应用程序的主要部分。它表示了用来管理应用程序数据的文档类、包含数据视图的框架类,以及用来绘制可视数据表示的视图类。
在CMFCApplicationApp类的InitInstance()函数中,创建了一个SDI(单文档)模板CSingleDocTemplate,并且注册该模板。
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMFCApplicationDoc),
RUNTIME_CLASS(CMainFrame), // 主 SDI 框架窗口
RUNTIME_CLASS(CMFCApplicationView));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);其中,CSingleDocTemplate类表示SDI文档模板,通过该类构造函数创建的SDI文档模板指针保存在pDocTemplate中,最后通过AddDocTemplate()函数注册文档模板,用此方法注册的每个模板都定义了一个应用程序支持的文档类型。

2.2 命令行参数处理

如果在命令行直接运行应用程序,可以指定详细的命令行参数,指示程序以特定方式运行或完成特定操作。处理命令行参数的MFC类是CCommandLineInfo。在CMFCApplicationApp类的InitInstance()函数中

CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);其中,ParseCommandLine()函数的作用是解析命令行参数,并把参数保存到CCommandLineInfo类的对象中。

2.3处理命令行参数

处理命令行参数的函数ProcessShellCommand()是创建整个SDI项目的核心。通过该函数来创建SDI项目的文档、框架和视图。

if (!ProcessShellCommand(cmdInfo))
return FALSE;其中,cmdInfo是在“2.2
命令行参数处理”中CCommandLineInfo类的对象。
在ProcessShellCommand()函数中,对命令行参数cmdInfo进行判断

switch(rCmdInfo.m_nShellCommand)
{
case CCommandLineInfo::FileNew:
......
OnFileNew();
case CCommandLineInfo::FileOpen:
OpenDocumentFile(rCmdInfo.m_strFileName);
....
..........
}其中,rCmdInfo是ProcessShellCommand()函数的参数,m_nShellCommand表示命令行的参数,CCommandLineInfo::FileNew表示创建新文件,CCommandLineInfo::FileOpen表示打开文件,而鼠标双击该程序时,命令行的参数为CCommandLineInfo::FileNew,即调用OnFileNew()函数。当鼠标双击该程序所关联的文件时,命令行的参数是CCommandLineInfo::FileOpen,即调用OpenDocumentFile()函数。
无论是CWinApp::OnFileNew()还是CWinApp::OpenDocumentFile(),最终调用的是CSingleDocTemplate::OpenDocumentFile()函数。其中,CSingleDocTemplate是“2.1
单文档模板”中提到的单文档模板。在该函数中,首先调用CDocTemplate::CreateNewDocument()函数创建文档;之后调用CDocTemplate::CreateNewFrame()函数创建框架,在该函数中调用CFrameWnd::LoadFrame()函数,在该函数中调用CFrameWnd::Create()函数创建框架和视图。
综上所述,SDI项目的组成元素创建的顺序是文档、框架、视图。

2.4 框架的显示及更新

在调用ProcessShellCommand()函数创建了文档、框架以及视图之后,接下来要显示框架。
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();其中,ShowWindow()和UpdateWindow()是CWnd类的成员函数,作用分别是显示窗口和更新窗口。ShowWindow()函数的参数为SW_SHOW时表示显示窗口,SW_HIDE时表示隐藏窗口。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: