第12讲 单文档与多文档
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
当前视图当前文档与当前视图/文档关联的文档模 板子框架窗口(只有MDI有该步骤)主框架窗口应 用程序对象
四 SDI编程实例
【例11-1】在主窗 口中央显示一文 本“您好, 单文档 界面的例程!”。单 击“改变显示文 本”菜单项,可 弹出一个对话框, 通过此对话框可 改变主窗口中的 显示文本内容
MDI 程序
MDI程序有多个子视图。因此,对应多个文档。 MDI程序中框架窗口、文档和视图的创建是在应用程序对象 的InitInstance()成员函数中通过文档模板类完成的: 下面程序:创建多文档模板 CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate( IDR_MYMDITYPE, RUNTIME_CLASS(CMyDoc), // 文档类 RUNTIME_CLASS(CChildFrame), // 框架窗口类 RUNTIME_CLASS(CMyView)); // 视图类 …… 如果是多种文档,可定义多个文档模板( pDocTemplate )
二、Doc/View框架的主要成员
MFC的Doc/View框架的核心类只有五个: CWinApp: 应用类(主程序) CView:视图基类 CDocument:文档基类 CDocTemplate:文档模板类 CFrameWnd:框架窗口类
1 CWinApp 类
CWinApp类代表主程序,CWinApp本身是不可见的, 它负责维护进程的启动、终止、消息循环、命令行参数、 资源管理 成员 InitInstance ExitInstance 描述 初始化实例 结束实例
用以存放字符串
(3) 初始化文档类成员变量
在T11-1Doc.cpp文件中,选择 OnNewDocument成员函 数加入以下代码: BOOL CT111Doc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; m_str=L"您好,单文档界面的例程!"; //初始化成员变量 return TRUE; }
个不同但又紧密相关的类——文档类和视图类负
责。
视图、文档、框架窗口
视图负责显示和编辑文档数据。用户对数据的编辑需 要依靠窗口上的鼠标与键盘操作才得以完成,这些消 息都是由视图类接收后进行处理或通知文档类,如收 到窗口刷新消息时调用视图类的成员函数OnDraw()显 示文档内容。 文档负责数据的读写操作。数据通常被保存在文档类 的成员变量中,文档类通过一个称为串行化的成员函 数Serialize()将成员变量的数据保存到磁盘文件中。
CView的子类
4 CDocTemplate类
文档模板类将原本独 立的文档、视图和框 架窗口对象联系在一 起。 每一种文档类型都有 一种文档模板与之相 对应,文档模板负责 创建和管理该文档类 型的所有文档。 SDI程序中只有一个文 档模板对象 MDI程序需要针对不 同类型的文档定义不 同的文档模板对象。
MDI CMDIFrameWnd子类 CMDIChildWnd子类
三、文档操作中的一些重要概念
串行化处理:将对象写入字节流和从字节流恢复 对象的操作。可以通过文件、网络、串口传输 数据。 文档的消息映射:确定消息传递时具体要传递给 哪一个函数。通常MFC使用ClassWizard添加 消息映射,有时也需要手工添加消息映射。 文档消息传递:明确接收者,判断消息传递的顺 序。 MFC消息处理搜索顺序
使用MFC向导创建 SDI和MDI的应用程 序的过程几乎完全一 样 主 要 差 别
在创建SDI界面的应用程序时, CMainFrame类的基类为CFrameWnd
在创建MDI界面的应用程序时, CMainFrame类的基类为MDIFrameWnd , 增加了CChildFrame类
文档/视图结构
使用MFC向导创建SDI和MDI的程序框架时, 构成了一个相互关联的结构,称为文档/视图结构。 在这个框架中,数据的维护及其显示,分别由两
OnChange
Serialize CT111View OnDraw
单文档与多文档的区别
SDI 打开一个文档 框架窗口CMainFrame 有一个菜单 CMainFrame的基类 CFrameWnd MDI 打开多个或多种文档 框架窗口CMainFrame, CClideFrame 有两个菜单 CMainFrame的基类 CMDIFrameWnd 使用模板: CMultiDocTemplate
文档 子类 SDI CSingleDocTemplate MDI CMultiDocTemplate
5 CFrameWnd类
CFrameWnd类是CMainFrame主框架窗 口的基类,CWnd的子类。 框架窗口维护了很多幕后的工作,例如工 具条、菜单、状态条的显示、更新,视图的位 置和显示,其它可停靠空间的停靠和动态尺寸 调整。许多默认为MFC应用程序应该具备的基 本功能都是CFrameWnd类在完成 。
(5) 增加菜单项与对话框关联
在 “编辑” 菜单中添加菜单项“改变显示文本” (ID_CHANGE )。单击此菜单项可以将对视图中显示文本所 做的修改保存到一个磁盘文件中,具体的实现方法如下: 选择菜单项,快捷菜单:“添加事件处理程序”,选择 Command消息,添加函数如下。 void CT111Doc::OnChange() { CInput Dlg; //创建一个CInput类的对象Dlg if(Dlg.DoModal()==IDOK) //显示对话框 { m_str=Dlg.m_input; //获取输入的字符串 UpdateAllViews(NULL); } } 在T111Doc.cpp文件中加入CInput类的头文件Input.h代码如下 : #include "Input.h" //加入头文件
(4) 视图输出显示( OnDraw )
在T11-1View.cpp文件中,选择OnDraw成员函数: void CT111View::OnDraw(CDC* pDC) { … // TODO: 在此处为本机数据添加绘制代码 CRect rectClient; GetClientRect(rectClient); // 获取当前客户区的指针 CSize sizeClient=rectClient.Size(); // 获取当前客户区的大小 CString str=pDoc->m_str; // 从文件中读取数据 CSize sizeTextExtent=pDC->GetTextExtent(str); // 用新选定的字体绘制字符串 pDC->TextOut((sizeClient.cx-sizeTextExtent.cx)/2, (sizeClient.cy-sizeTextExtent.cy)/2,str); } 调用GetDocument()得到文档类的指针,将文档对象成员变量 复制到字符串str中,调用TextOut()将m_str的内容显示到框架 窗口中的视图中。
常用成员函数
2 CDocument类
文档类的基类。在现在流行的 MVC(Modal、View、Control) 设计模式中相当于其中的Modal, 表示抽象数据模型。
成员 SetModifyFlag UpdateAllView GetFirstViewPosition GetNextView Serialize
第12讲 单文档与多文档
要点: 1、介绍Visual C++中的文档/视图 结构的工作机制 2、编写单文档应用程序 3、编写多文档应用程序
1
一、单文档与多文档
SDI的应用程序 只有一个窗口 VC的MFC库支 持三种不同 的应用程序
单文档界面(SDI) 多文档界面(MDI)
基于对话框的应用程序 MDI的应用程序每次 可以读写多个文件或 文档,可同时对多个 文档进行操作,可以 有多个子窗口
CEditView:简单的文本编辑器,类似Notepad CListView:基于列表的视图,类似文件夹浏览
CTreeView:基于树状控件的视图,类似文件浏览左侧的树状结构 CRichEditView:支持多种字体、OLE和RTF格式的高级编辑器 CScrollView:支持滚动条的视图 CFormView:窗体视图,支持在上边使用对话框控件 CRecordView:连接到ODBC数据库的视图 CDaoRecordV 程序
SDI程序只有一个视图。因此,对应一个文档。 SDI程序中框架窗口、文档和视图的创建是在应用 程序对象的InitInstance()成员函数中通过文档模板 类完成的: 下面程序:创建单文档模板
CSingleDocTemplate * pDocTemplate; //单文档模板类对象 pDocTemplate = new CSingleDocTemplate (IDR_MAINFRAME, RUNTIME_CLASS (CMyDoc), //文档类 RUNTIME_CLASS (CMainFrame), //框架窗口 RUNTIME_CLASS (CMyView) ); //视图类 …..
(1) 创建工程文件和对话框资源
创建一个单文档项目 文件T11-1,然后添加对 话框资源IDD_DIALOG1 新类:CInput, Edit 控件关联变量m_input
(2) 声明文档类成员变量
在CT111Doc类的T111Doc.h文件中增加如下的代码:
Public: CString m_str;
[例12-1]小结: 步骤 创建SDI工程 创建对话框资源 声明文档类成员变量 初始化文档类成员变量
类
T11-1 CInput
函数与变量
m_input
T11-1Doc.h m_str
CT111Doc OnNewDocument
增加菜单项与对话框关联 文档数据的保存与读取 视图输出显示
(6) 文档数据的保存与读取
为了把文档数据(m_str)修改保存到磁盘文件 中,并在需要时可以打开所保存的磁盘文件读 取文档,需要重载CExampleDoc类的Serialize函 数来完成串行化。重载后的Serialize函数的代码 如下: void CT111Doc::Serialize(CArchive& ar) { if (ar.IsStoring()) ar<<m_str; //保存文档内容 else ar>>m_str; //读取文档内容 }
视图通过GetDocument 成员函数获得指向相关 联的文档对象的指针 通过该指针调用文 档类的成员函数来 从文档中读取数据
视图把数据显示 于计算机屏幕上
视图通过相关联的文档类 的成员函数将经过修改的 数据传递给文档对象
文档对象获得修改过的数据之后,对其 进行必要的修改,最后保存到磁盘)中
用户通过与视图的 交互来查看数据并 对数据进行修改
框架窗口就是通常所说的Windows主窗口,视图是一
个没有边框的窗口,必须依存在一个框架窗口内。
MFC文档/视图结构数据处理工作分工:
数据处理分为数据的管理和显示 文档用于管理和维护数据 视图用来显示和编辑数据 MFC通过其文档类和视图类提供了大 量有关数据处理的方法。
文档/视图结构的工作机制
描述 设置修改标志 刷新与文档关联的视图 获得与文档关联的视图头指针 获得下一个视图指针 实现文档数据串行化
常用成员函数
3 CView类
CWnd类是视图类(CView)的基类。 视图类具有CWnd的所有功能如: 创建、移动、显示和隐藏窗口等。 CView类可以接收任何Windows 消息,而CDocument类则不行 成员 OnDraw() OnUpdate() Invalidate 描述 由MFC调用重新绘制屏幕 由MFC调用对文档的修改进行响应 强制刷新屏幕 CView主要 虚拟方法
四 SDI编程实例
【例11-1】在主窗 口中央显示一文 本“您好, 单文档 界面的例程!”。单 击“改变显示文 本”菜单项,可 弹出一个对话框, 通过此对话框可 改变主窗口中的 显示文本内容
MDI 程序
MDI程序有多个子视图。因此,对应多个文档。 MDI程序中框架窗口、文档和视图的创建是在应用程序对象 的InitInstance()成员函数中通过文档模板类完成的: 下面程序:创建多文档模板 CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate( IDR_MYMDITYPE, RUNTIME_CLASS(CMyDoc), // 文档类 RUNTIME_CLASS(CChildFrame), // 框架窗口类 RUNTIME_CLASS(CMyView)); // 视图类 …… 如果是多种文档,可定义多个文档模板( pDocTemplate )
二、Doc/View框架的主要成员
MFC的Doc/View框架的核心类只有五个: CWinApp: 应用类(主程序) CView:视图基类 CDocument:文档基类 CDocTemplate:文档模板类 CFrameWnd:框架窗口类
1 CWinApp 类
CWinApp类代表主程序,CWinApp本身是不可见的, 它负责维护进程的启动、终止、消息循环、命令行参数、 资源管理 成员 InitInstance ExitInstance 描述 初始化实例 结束实例
用以存放字符串
(3) 初始化文档类成员变量
在T11-1Doc.cpp文件中,选择 OnNewDocument成员函 数加入以下代码: BOOL CT111Doc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; m_str=L"您好,单文档界面的例程!"; //初始化成员变量 return TRUE; }
个不同但又紧密相关的类——文档类和视图类负
责。
视图、文档、框架窗口
视图负责显示和编辑文档数据。用户对数据的编辑需 要依靠窗口上的鼠标与键盘操作才得以完成,这些消 息都是由视图类接收后进行处理或通知文档类,如收 到窗口刷新消息时调用视图类的成员函数OnDraw()显 示文档内容。 文档负责数据的读写操作。数据通常被保存在文档类 的成员变量中,文档类通过一个称为串行化的成员函 数Serialize()将成员变量的数据保存到磁盘文件中。
CView的子类
4 CDocTemplate类
文档模板类将原本独 立的文档、视图和框 架窗口对象联系在一 起。 每一种文档类型都有 一种文档模板与之相 对应,文档模板负责 创建和管理该文档类 型的所有文档。 SDI程序中只有一个文 档模板对象 MDI程序需要针对不 同类型的文档定义不 同的文档模板对象。
MDI CMDIFrameWnd子类 CMDIChildWnd子类
三、文档操作中的一些重要概念
串行化处理:将对象写入字节流和从字节流恢复 对象的操作。可以通过文件、网络、串口传输 数据。 文档的消息映射:确定消息传递时具体要传递给 哪一个函数。通常MFC使用ClassWizard添加 消息映射,有时也需要手工添加消息映射。 文档消息传递:明确接收者,判断消息传递的顺 序。 MFC消息处理搜索顺序
使用MFC向导创建 SDI和MDI的应用程 序的过程几乎完全一 样 主 要 差 别
在创建SDI界面的应用程序时, CMainFrame类的基类为CFrameWnd
在创建MDI界面的应用程序时, CMainFrame类的基类为MDIFrameWnd , 增加了CChildFrame类
文档/视图结构
使用MFC向导创建SDI和MDI的程序框架时, 构成了一个相互关联的结构,称为文档/视图结构。 在这个框架中,数据的维护及其显示,分别由两
OnChange
Serialize CT111View OnDraw
单文档与多文档的区别
SDI 打开一个文档 框架窗口CMainFrame 有一个菜单 CMainFrame的基类 CFrameWnd MDI 打开多个或多种文档 框架窗口CMainFrame, CClideFrame 有两个菜单 CMainFrame的基类 CMDIFrameWnd 使用模板: CMultiDocTemplate
文档 子类 SDI CSingleDocTemplate MDI CMultiDocTemplate
5 CFrameWnd类
CFrameWnd类是CMainFrame主框架窗 口的基类,CWnd的子类。 框架窗口维护了很多幕后的工作,例如工 具条、菜单、状态条的显示、更新,视图的位 置和显示,其它可停靠空间的停靠和动态尺寸 调整。许多默认为MFC应用程序应该具备的基 本功能都是CFrameWnd类在完成 。
(5) 增加菜单项与对话框关联
在 “编辑” 菜单中添加菜单项“改变显示文本” (ID_CHANGE )。单击此菜单项可以将对视图中显示文本所 做的修改保存到一个磁盘文件中,具体的实现方法如下: 选择菜单项,快捷菜单:“添加事件处理程序”,选择 Command消息,添加函数如下。 void CT111Doc::OnChange() { CInput Dlg; //创建一个CInput类的对象Dlg if(Dlg.DoModal()==IDOK) //显示对话框 { m_str=Dlg.m_input; //获取输入的字符串 UpdateAllViews(NULL); } } 在T111Doc.cpp文件中加入CInput类的头文件Input.h代码如下 : #include "Input.h" //加入头文件
(4) 视图输出显示( OnDraw )
在T11-1View.cpp文件中,选择OnDraw成员函数: void CT111View::OnDraw(CDC* pDC) { … // TODO: 在此处为本机数据添加绘制代码 CRect rectClient; GetClientRect(rectClient); // 获取当前客户区的指针 CSize sizeClient=rectClient.Size(); // 获取当前客户区的大小 CString str=pDoc->m_str; // 从文件中读取数据 CSize sizeTextExtent=pDC->GetTextExtent(str); // 用新选定的字体绘制字符串 pDC->TextOut((sizeClient.cx-sizeTextExtent.cx)/2, (sizeClient.cy-sizeTextExtent.cy)/2,str); } 调用GetDocument()得到文档类的指针,将文档对象成员变量 复制到字符串str中,调用TextOut()将m_str的内容显示到框架 窗口中的视图中。
常用成员函数
2 CDocument类
文档类的基类。在现在流行的 MVC(Modal、View、Control) 设计模式中相当于其中的Modal, 表示抽象数据模型。
成员 SetModifyFlag UpdateAllView GetFirstViewPosition GetNextView Serialize
第12讲 单文档与多文档
要点: 1、介绍Visual C++中的文档/视图 结构的工作机制 2、编写单文档应用程序 3、编写多文档应用程序
1
一、单文档与多文档
SDI的应用程序 只有一个窗口 VC的MFC库支 持三种不同 的应用程序
单文档界面(SDI) 多文档界面(MDI)
基于对话框的应用程序 MDI的应用程序每次 可以读写多个文件或 文档,可同时对多个 文档进行操作,可以 有多个子窗口
CEditView:简单的文本编辑器,类似Notepad CListView:基于列表的视图,类似文件夹浏览
CTreeView:基于树状控件的视图,类似文件浏览左侧的树状结构 CRichEditView:支持多种字体、OLE和RTF格式的高级编辑器 CScrollView:支持滚动条的视图 CFormView:窗体视图,支持在上边使用对话框控件 CRecordView:连接到ODBC数据库的视图 CDaoRecordV 程序
SDI程序只有一个视图。因此,对应一个文档。 SDI程序中框架窗口、文档和视图的创建是在应用 程序对象的InitInstance()成员函数中通过文档模板 类完成的: 下面程序:创建单文档模板
CSingleDocTemplate * pDocTemplate; //单文档模板类对象 pDocTemplate = new CSingleDocTemplate (IDR_MAINFRAME, RUNTIME_CLASS (CMyDoc), //文档类 RUNTIME_CLASS (CMainFrame), //框架窗口 RUNTIME_CLASS (CMyView) ); //视图类 …..
(1) 创建工程文件和对话框资源
创建一个单文档项目 文件T11-1,然后添加对 话框资源IDD_DIALOG1 新类:CInput, Edit 控件关联变量m_input
(2) 声明文档类成员变量
在CT111Doc类的T111Doc.h文件中增加如下的代码:
Public: CString m_str;
[例12-1]小结: 步骤 创建SDI工程 创建对话框资源 声明文档类成员变量 初始化文档类成员变量
类
T11-1 CInput
函数与变量
m_input
T11-1Doc.h m_str
CT111Doc OnNewDocument
增加菜单项与对话框关联 文档数据的保存与读取 视图输出显示
(6) 文档数据的保存与读取
为了把文档数据(m_str)修改保存到磁盘文件 中,并在需要时可以打开所保存的磁盘文件读 取文档,需要重载CExampleDoc类的Serialize函 数来完成串行化。重载后的Serialize函数的代码 如下: void CT111Doc::Serialize(CArchive& ar) { if (ar.IsStoring()) ar<<m_str; //保存文档内容 else ar>>m_str; //读取文档内容 }
视图通过GetDocument 成员函数获得指向相关 联的文档对象的指针 通过该指针调用文 档类的成员函数来 从文档中读取数据
视图把数据显示 于计算机屏幕上
视图通过相关联的文档类 的成员函数将经过修改的 数据传递给文档对象
文档对象获得修改过的数据之后,对其 进行必要的修改,最后保存到磁盘)中
用户通过与视图的 交互来查看数据并 对数据进行修改
框架窗口就是通常所说的Windows主窗口,视图是一
个没有边框的窗口,必须依存在一个框架窗口内。
MFC文档/视图结构数据处理工作分工:
数据处理分为数据的管理和显示 文档用于管理和维护数据 视图用来显示和编辑数据 MFC通过其文档类和视图类提供了大 量有关数据处理的方法。
文档/视图结构的工作机制
描述 设置修改标志 刷新与文档关联的视图 获得与文档关联的视图头指针 获得下一个视图指针 实现文档数据串行化
常用成员函数
3 CView类
CWnd类是视图类(CView)的基类。 视图类具有CWnd的所有功能如: 创建、移动、显示和隐藏窗口等。 CView类可以接收任何Windows 消息,而CDocument类则不行 成员 OnDraw() OnUpdate() Invalidate 描述 由MFC调用重新绘制屏幕 由MFC调用对文档的修改进行响应 强制刷新屏幕 CView主要 虚拟方法