VS2015单文档视图项目中文档、框架以及视图创建过程
2017-10-17 22:36
471 查看
在VS2015中,创建一个基于单文档视图的MFC项目,该项目的名称为MFCApplication。通过向导成功创建项目之后发现,自动生成了很多文件。在这些文件中,MFCApplicationDoc.cpp和MFCApplictionDoc.h对应的是项目的文档类;MainFrm.cpp和MainFrm.h对应的是项目的框架类;MFCApplicationView.cpp和MFCApplication.h对应的是项目的视图类。那么,在MFCApplication项目中,是如何创建文档、框架和视图的呢?
CMFCApplicationApp类是创建的MFCApplication项目的应用程序对象类,该类的父类CWinAppEx就代表着应用程序本身,可以说CWinAppEx取代了控制台程序和Win32程序中的入口函数。在控制台程序和Win32程序中,首先执行的是程序的入口函数,而在MFC的单文档项目中,首先执行的是CWinAppEx类的派生类中的一条语句
CMFCApplicationApp theApp;以上代码调用了CMFCApplicationApp类的构造函数,但是该构造函数没有定义,所以调用的是其父类即CWinAppEx的构造函数。在CWinAppEx类的构造函数中,对其成员变量进行初始化处理。
在MFCApplication.cpp中,可以看到CMFCApplicationApp类覆盖了InitInstance()函数。
在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()函数注册文档模板,用此方法注册的每个模板都定义了一个应用程序支持的文档类型。
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);其中,ParseCommandLine()函数的作用是解析命令行参数,并把参数保存到CCommandLineInfo类的对象中。
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项目的组成元素创建的顺序是文档、框架、视图。
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();其中,ShowWindow()和UpdateWindow()是CWnd类的成员函数,作用分别是显示窗口和更新窗口。ShowWindow()函数的参数为SW_SHOW时表示显示窗口,SW_HIDE时表示隐藏窗口。
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时表示隐藏窗口。
相关文章推荐
- 430的VS2015单文档MFC学习笔记之创建以及添加按钮
- 在框架窗口中如何获得,视图类的指针以及文档,视图,框架窗口指针的获取与应用
- MFC随笔---VS2015创建MFC项目
- eclipse maven创建一个maven web项目,以及创建过程中的报错解决方法
- MFC MDI项目如何一个文档显示多个不同视图类(比如文字和图表,各自拥有单独的框架窗口)
- Java调用C++动态链接库dll,有详细过程。VS2015+Eclipse以及失败解决方案
- vs2015使用向导创建SOUI项目问题记录
- mysql-创建函数,存储过程以及视图
- SQL Server2012 创建数据库存储过程和VS2015 C#调用自己的存储过程
- mysql-创建函数,存储过程以及视图
- VS2015 安装mvc4安装包以及vs2010 sp1后导致Razor语法失效代码不高亮(能正常运行)/视图页面无法智能提示(.cshtml)解决办法
- 【项目文档】【公告】论坛发帖规范,以及网页创建规范
- vs2015中SQLSERVER数据库项目引用系统视图
- 应用程序框架实战三十八:项目示例VS解决方案的创建(一)
- mysql中的存储过程、触发器、视图是如何创建的,以及PHP中是如何调用的
- 如何在VS2015创建C语言项目
- 记录一下idea创建maven的项目过程,不是搭框架
- vs2012如何运行vs2013和vs2015创建的项目
- Windows平台cocos2d-x 3.2下载以及创建新项目过程
- TN25 文档,视图和框架之创建