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

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

1 CWinAppEx类及其派生类

在生成的MFCApplication项目中,包含了MFCApplication.cppMFCApplication.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 时表示隐藏窗口。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值