文档介绍:第16单元多文档界面程序
本单元教学目标
介绍多文档界面(MDI)程序的构造和编程方法。
学习要求
理解多文档界面(MDI)程序的构造,掌握其编程方法。
授课内容
和框架窗口界面程序、单文档界面(SDI)程序和基于对话框的应用程序一样,多文档界面(MDI)程序也是基本的MFC应用程序结构。MDI程序的结构最复杂,功能也最强。其特点是用户一次可以打开多个文档,每个文档均对应不同的窗口;主窗口的菜单会自动随着当前活动的子窗口的变化而变化;可以对子窗口进行层叠、平铺等各种操作;子窗口可以在MDI主窗口区域内定位、改变大小、最大化和最小化,当最大化子窗口时,它将占满MDI主窗口的全部客户区。MDI不仅可以在同一时间内同时打开多个文档,还可以为同一文档打开多个视图。
MDI应用程序
从程序员角度看,每个MDI应用程序必须有一个CMDIFrameWnd或其派生类的对象,该窗口称作MDI框架窗口。CMDIFrameWnd是CFrameWnd的派生类,除了拥有CFrameWnd类的全部特性外,还具有以下与MDI相关的特性:
,MDI的框架窗口并不直接与一个文档和视图相关联。MDI的框架窗口拥有客户窗口,在显示或隐藏控制条(包括工具条、状态栏、对话条)时,重新定位该子窗口。
,它负责管理主框架窗口的客户区以及创建子窗口。每个MDI主框架窗口都有且只有一个MDI客户窗口。
,CMDIChildWnd也是CFrameWnd的派生类,用于容纳视图和文档,相当于SDI下的主框架窗口。每打开一个文档,框架就自动为文档创建一个MDI子窗口。一个MDI应用程序负责动态的创建和删除MDI子窗口。在任何时刻,最多只有一个子窗口是活动的(窗口标题栏颜色呈高亮显示)。MDI框架窗口始终与当前活动子窗口相关联,命令消息在传给MDI框架窗口之前首先分派给当前活动子窗口。
,MDI框架窗口可以拥有自己的缺省菜单。当有活动子窗口时,MDI框架窗口的菜单条会自动被子窗口的菜单所替代。框架会自动监视当前活动的子窗口类型,并相应的改变主窗口的菜单。例如,在Visual Studio中,当选择对话框模板编辑窗口或源程序窗口时,菜单会有所不同。但是,对于程序员来说,只需在InitInstance()中注册文档时指定每一类子窗口(严格的讲是文档)所使用的菜单,而不必显式的通过调用函数去改变主框架窗口的菜单,因为框架会自动完成这一任务。
、平铺、排列子窗口和新建子窗口等一些标准窗口操作提供了缺省的菜单响应。在响应新建子窗口命令时,框架调用CDocTemplate::CreateNewFrame()为当前活动文档创建一个子窗口。CreateNewFrame()不仅创建子窗口,还创建与文档相对应的视图。
与开发基于对话框的应用程序和SDI应用程序一样,使用AppWizard可生成一个MDI应用程序框架,在此基础上,程序员可使用ClassWizard和各种资源编辑器来充实自己的应用程序。
AppWizard为MDI程序框架创建了以下类:
类说明
CAboutDlg “关于”对话框
CChildFrame 子框架窗口,用于容纳视图
CMyApp 应用程序类
CmyDoc 绘图程序视图类
CMyView 绘图视图类
CMainFrame 框架窗口(用来容纳子窗口),是MDI应用程序的主窗口
可以看出,hildFrame(子框架窗口)类,而且CMainFrame的职责也不同了。
另外,MDI和SDI的初始化应用程序实例方法上也有所不同。MDI应用程序的InitInstance()函数代码为:
BOOL CDrawApp::InitInstance()
{
……// 初始化工作
CMultiDocTemplate* pDocTemplate; // MDI文档模板
pDocTemplate = new CMultiDocTemplate(
IDR_DRAWTYPE,
RUNTIME_CLASS(CDrawDoc),
hildFrame),
RUNTIME_CLASS(CDrawView));
AddDocTemplate(pDocTemplate);
CMainFrame* pMainFrame = new CMainFrame; // 建立MDI主框架窗口
if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
m_pMainWnd = pMainFrame;
m_pMainWnd->eptF