您现在的位置是:主页 > news > 成都网站制作成都网站制作/百度收录批量查询
成都网站制作成都网站制作/百度收录批量查询
admin2025/5/1 13:36:23【news】
简介成都网站制作成都网站制作,百度收录批量查询,网站域名怎么看,虚拟主机如何做多个网站在VS2015中,创建一个基于单文档视图的MFC项目,该项目的名称为MFCApplication。通过向导成功创建项目之后发现,自动生成了很多文件。在这些文件中,MFCApplicationDoc.cpp和MFCApplictionDoc.h对应的是项目的文档类;Main…
在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
时表示隐藏窗口。