MFC文档视图结构
MFC编程之文档、视图结构应用程序

第2章文档/视图结构应用程序2.0 知识要点1. 文档/视图结构的思想是将数据的管理与显示分离,其中文档用于管理应用程序的数据,而视图是用户界面,用于显示、打印文档中的数据,并管理与用户的交互。
2. SDI具有文档/视图结构的应用程序框架,该框架包括应用程序类、窗口框架类、文档类和视图类,编程的任务是在文档类和视图类中添加适当的代码。
其中文档类中一个重要的成员函数是OnNewDocument(),用户在此添加代码完成对数据的初始化;而视图类中最重要的成员函数是OnDraw(),通过在该函数中添加代码实现窗口内容的输出。
3. 通过介绍几种SDI结构的典型应用程序来了解其结构及设计方法,典型应用包括:•利用画笔、画刷等工具及位图处理的方法实现文字和图形的输出。
•利用定时器控件制作动画程序。
•对鼠标和键盘进行编程的基本方法。
•文件、字体、颜色等几种通用对话框的使用方法及自定义对话框的设计、调用方法。
•菜单的设计方法。
2.1 文档/视图结构SDI 应用程序由 AppWizard 创建好后,即使没有编写一行代码,仍然可以运行,并且具有一个标准 Windows应用程序所需要的组成成份,程序员的工作就是往这个框架添加必要的代码。
以下通过一个简单实例说明文档/视图结构应用程序的创建过程。
【例2-1】创建一个如图所示的应用程序,在窗口中显示一个矩形框,框中显示“同舟共济自强不息”。
假定本例的工程名为TEST,程序创建过程如下:(1)利用 AppWizard 创建一个 SDI 应用程序框架。
(2)文档类是存放数据的主要地方,本例在其中说明一个存放矩形框数据的 CRect 类对象 r 和一个存放字符串的 CString 对象s,方法为:在工作区的“ ClassView ”中,双击 CTESTDoc 类,在该类代码中添加如下代码:public:CRect r;CString s;说明:CRect 是 MFC 定义的一个类,有 4 个数据成员: left 、 top 、 right 和bottom 。
MFC文档视图结构-上机步骤

实验1 . MFC对话框应用程序练习一、上机题目:1.一个简单的单文档应用程序——记事本程序2.文档串行化编程3. 简单的班级学生查询系统(单文档多视图编程)二、上机目的:1.通过这些程序可以达到以下目的:2.文档视图框架3.文档、视图、框架之间的相互作用三、题目说明1.记事本程序利用AppWizard,自动产生一个记事本程序。
2. 文档串行化编程1)定义一个日期结构(包括年月日)置于文档对象中,在文档对象中序列化保存和读取,并在视图中显示日期信息(可以在编辑视图或普通视图中显示)。
并通过对话框修改该信息。
注:普通视图中显示文本方法:重载视图OnDraw函数,利用其中pDC->TextOut函数输出相关信息。
2)建立一个表单视图(FormView),在建立控件输入矩形的左上角和右下角,在另外一个控件中显示该视图。
注:视图会话函数:CDC* pDCTemp=m_Ctrl.GetWindowDC(); 得到视图的设备pDCTemp->Rectangle(m_x1,m_y1,m_x2,m_y2); 绘制矩形3.简单的班级学生查询系统1)建立两个视图,其中左边为一个树视图,根节点为为学院(系)(这一级至少要有两个节点如计算机学院、软件学院),二级节点为学院的系(专业)(可以只针对计算机学院输入相关二级节点,如包括网络工程、计算机科学、软件学院),右边为列表视图包含学生的姓名、学号、课程成绩等。
2)要求当选择左边的计算机学院时,右边视图显示所有计算机学院的学生信息,当选择网络工程专业,只选择网络工程专业的学生信息。
提交网站:实现步骤:例1.一个简单的单文档应用程序——记事本程序1. 只要在AppWizard的Step 6将Base Class设置为EditView,AppWizard就自动完成了一个记事本程序的设计:2. 运行程序,即可测试记事本的各种功能:3.说明:(1)打开Workshop中的Class视图,可以看到,一个简单的单文档应用程序向导自动:建立五个类(2(3)每个类的主要函数:void CAboutDlg::DoDataExchange(CDataExchange* pDX)int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)//创建窗体的工具栏,状态栏等BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)BOOL CXxxApp::InitInstance()void CXxxApp::OnAppAbout()BOOL CXxxDoc::OnNewDocument()//初始化文档字符数据、字体信息等void CXxxDoc::Serialize(CArchive& ar)BOOL CXxxView::PreCreateWindow(CREATESTRUCT& cs)void CXxxView::OnDraw(CDC* pDC)BOOL CXxxView::OnPreparePrinting(CPrintInfo* pInfo)//弹出打印对话框void CXxxView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)void CXxxView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)CXxxDoc* CXxxView::GetDocument() // non-debug version is inline例2.文档串行化编程将C++对象以字节流的形式保存在二进制文件中称为对象的串行化处理,经过串行化处理的称为持久对象,可以按需要在程序运行中存储和恢复。
MFC文档视图

应用程序对象
- 10 -
文档/视图框架—文档视图对象的创建过程
...... //注册应用程序的文档模板。 //文档模板将用作文档、框架窗口和视图之间的连接 CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CMytestDoc), RUNTIME_CLASS(CMainFrame), // 主 SDI 框架窗口 RUNTIME_CLASS(CMytestView)); if (!pDocTemplate) return FALSE; AddDocTemplate(pDocTemplate); //分析标准外壳命令、DDE、打开文件操作的命令行 ...... //根据命令行中的信息启动程序 ......
-3-
文档/视图框架—文档/视图结构概述
框架口
文档
文档当前可视部分
文档和视图的关系
-4-
文档/视图框架—文档/视图结构概述
使用文档/视图结构的意义:
将数据操作、数据显示和用户界面分离开。这是一种“分而治之” 的思想,这种思想使得模块划分更加合理、模块独立性更强。
MFC在文档/视图结构上提供了许多标准操作。如新建文件、打 开文件、保存文件、打印等操作,它们被框架自动完成,减轻了 程序员的工作量。
-7-
文档/视图框架—单文档主要类
单文档应用程序框架中,主要包含5个类:
SDICWinApp(应用程序类) CFrameWnd(框架窗口类) CView(视图类) CDocument(文档类) CDocTemplate(类文档模板)
VC第三章,MFC框架之文档与视图

实例:为MyDraw画线程序添加“画笔选择”工具栏(该例以另一种方式实现工 具栏按钮的基本功能).
(1)在视图类中头文件中手工添加工具条的消息映射函数的声明: afx_msg void OnPenChioce(UINT nID); (2)在实现文件中加入消息映射宏: ON_COMMAND_RANGE(ID_PEN_RED,ID_PEN_WIDTH,OnPenChioce)
3、为菜单命令设置加速键 在资源视图Accelerator中IDR_MAINFRAME项的加速键列表 最后一空行操作。
4、为新菜单添加“弹出式快捷菜单”
利用类向导为视图类添加WM_CONTEXTMENU消息处理函 数,并添加如下代码:
CMenu menuPopup; //声明菜单对象
if (menuPopup.CreatePopupMenu())
实例:为前述Biblioteka DrawCoins程序的工具栏添加两个对应按钮.
2、添加用户自定义工具栏的方法 添加用户自定义工具栏步骤: (1)在工程中插入新工具条资源, 并添加相关按钮; (2)在CMainFrame类头文件中加入:CToolBar my_ToolBar;
(3)在MainFrame.cpp文件的Create()函数中模仿生成标准工 具栏的方法, 书写生成新工具栏的语句, 并在最后“停泊 工具栏”的函数中加入第2个参数 AFX_IDW_DOCKBAR_LEFT;
第三章 MFC框架之文档与视图
本章内容
• • • • • • • • • MFC应用程序的开发流程 AppWizard生成的文件类型 ClassWizard的功能与应用初步 用户工程中“文档与视图结构” 菜单设计及应用 鼠标消息的处理 工具栏与状态栏设计 文档的读写 滚动视图与多视图
MFC应用程序结构

5.利用fstream类操作文件
操作举例:文件复制 void MyCopy(CString strSource, CString strTarget) { fstream fs, ft; CString str; char cs[200]; fs.open(strSource, ios::in) ; ft.open(strTarget, ios::out) ; while(! fs.eof() ) { fs.getline(cs,sizeof(cs)); str=cs; ft<<str<<endl;; } fs.close(); ft.close(); }
3. 文档视图结构 文档与视图的交互过程 1.CView类的GetDocument()函数 视图类CView的GetDocument()函数返回的是一个 CDocument或其派生类的指针。可用得到的文档指针来 访问文档中的数据。 从而在视图类中,实现文档类的数据与视图类的数据 进行交换。 2. CDocument类的UpdateAllViews()函数 当文档的数据发生了变化后,文档也要通知视图当 前的变化,以让视图能够及时更新,忠于文档的数据。 这样的一件工作是通过文档类中的UpdateAllViews()函 数来实现的。
MFC应用程序结构及开发实例 MFC
1. 创建一个MFC应用程序
1. 创建一个MFC应用程序
1. 创建一个MFC应用程序
2. 运行MFC应用程序
3. 文档视图结构
3. 文档视图结构
文档类继承于CDocument类,它描述了应用的数 据。抽象地说,文档是一个应用程序数据基本元素 的集合,它构成应用程序所使用的数据单元,文档 负责管理和维护应用的数据。 具体一点来说,文档是一种数据源,数据源有很 多种,最常见的是磁盘文件,但是文档不必非要是 一个磁盘文件,文档的数据源也可以来自串行口或 并行口的输入数据。文档对象负责来自所有数据源 的数据的管理。
5、MFC文档视图结构

三、文档视结构的运行机制(方式)
1)视图类调用GetDocument成员函数获 得相关联的文档对象指针,从文档中读取数 据。 2)视图把数据显示在屏幕上用户交互 数据修改。 3)视图将经过修改的数据传递给文档对象, 进行数据更新。
四、文档视结构中各类的重要函数 几个重要的函数
一个简单的数据分析软件
2、直方图计算算法
假如有一个有16个数的数列:1 1 1 3 2 1 4 5 3 2 4 5 5 4 3 3 ,这些数都在0~5之间。 数0,1,2,3,4,5在这个数列中出现的次数就是这个数 列的统计直方图。 思考: (1)这些数出现的概率呢? (2)计算机如何实现求直方图
MDI的应用程序每次可以读写多个文件 或文档,可以同时对多个文档进行操作, 可以有多个子窗口。
例如:Windows的Word
一、文档视结构概述
SDI和MDI主要差别(程序员角度)
SDI不需要生成CChildFrame类 SDI应用程序的CMainFrame类的基类为CFrameWnd MDI应用程序的CMainFrame类的基类为CMDIFrameWnd
应用程序类
管理应用程序本身,负责和OS进行交互(获取或发送 消息等)
二、基于文档视结构的程序框架构成
文档
class CDocument;
视图
class CView;
框架类
class CFrameWnd; class CMDIFrameWnd; class CMDIChildWnd; //standard SDI Main Frame //stardard MDI Main Frame // standard MDI child Frame
文档视图结构

文档/视图结构一、文档/视图的概念●MFC对“文档”的设计思想是:一个类中的所有成员变量,都应该能够保存到一个文件中去,反之,也应该能从一个文件中读出来,加载到该类相应的成员变量中去。
MFC 对此的实现机制就是文档/视图的串行化(Serialize)。
●在MFC中,文档类负责管理数据,提供保存和加载数据的功能。
视图类负责数据的显示,以及给用户提供对数据的编辑和修改功能。
●MFC给我们提供Document/View结构,将一个应用程序所需要的“数据处理与显示”的函数空壳都设计好了,这些函数都是虚函数,我们可以在派生类中重写这些函数。
有关文件读写的操作在CDocument的Serialize函数中进行,有关数据和图形显示的操作在CView的OnDraw函数中进行。
我们在其派生类中,只需要去关注Serialize和OnDraw 函数就可以了,其它的细节我们不需要去理会,程序就可以良好地运行。
●当我们按下“打开文件”菜单项时,Application Framework会激活文件打开对话框,让你指定文件名,然后自动调用CGraphicDoc::Serialize读取文件。
Application Framework 还会调用CGraphicView::OnDraw,传递一个显示DC,让你重新绘制窗口内容。
●当我们按下“保存文件”菜单项时,Application Framework会激活文件保存对话框,让你指定文件名,然后自动调用CGraphicDoc::Serialize保存文件。
●MFC给我们提供Document/View结构,是希望我们将精力放在数据结构的设计和数据显示的操作上,而不要把时间和精力花费在对象与对象之间、模块与模块之间的通信上。
●一个文档对象可以和多个视图类对象相关联,而一个视图类对象只能和一个文档对象相关联。
二、使用CArchive类对存储在变量(内存)进行保存或者读取void CGraphicView::OnFileWrite(){CFile file("C:\\1.dat",CFile::modeCreate | CFile::modeWrite);CArchive ar(&file,CArchive::store); //将CFile类和CArchive类关联起来int i =4;char ch='a';float f=1.3f;CString str("ITJob");ar<<i<<ch<<f<<str;}以二进制形式查看C:\1.dat文件的内容,如下void CGraphicView::OnFileRead(){CFile file("C:\\1.dat",CFile::modeRead);CArchive ar(&file,CArchive::load); //将CFile类和CArchive类关联起来int i;char ch;float f;CString str;CString strResult;ar>>i>>ch>>f>>str;strResult.Format("%d,%c,%f,%s",i,ch,f,str);MessageBox(strResult);}三、MFC对“新建文件”菜单项的路由路径等当点击“新建”按钮时,会发送WM_FILE_NEW消息,按照消息响应函数的命名规则,它的响应函数应该叫OnFileNew(),但是在代码中找不到,这是因为MFC对他进行了封装。
MFC多文档和单文档视结构

MFC多文档和单文档视结构★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★//这一页的代码最重要了,呵呵……什么都在这里面呢;单文档新建:CWinApp_________docManager->docSingleTemplate 的OpenDocumentFile函数参数为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。
多文档新建:CWinApp_________docManager->docMultTemplate的OpenDocumentFile函数参数为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。
单文档打开:CWinApp_________docManager中经过一个打开对话框传递参数,中途还调用了APP的OpenDocumentFile,当然如果我们的APP重载了这个函数也要调用我们的但是我们的函数一定别忘记最后返回是调用父类的此函数___________docSingleTemplate的OpenDocumentFile函数参数不为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。
多文档打开:CWinApp_________docManager中经过一个打开对话框传递参数,中途还调用了APP的OpenDocumentFile,当然如果我们的APP重载了这个函数也要调用我们的但是我们的函数一定别忘记最后返回是调用父类的此函数___________docMultTemplate的OpenDocumentFile函数参数不为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MFC文档视图结构
MFC(Microsoft Foundation Classes)是微软公司开发的一个用于Windows平台的C++类库,用于简化Windows桌面应用程序的开发。
MFC
提供了各种类和函数,用于实现常见的视图结构,其中包括文档视图结构。
文档视图结构是MFC中用于实现文档和视图之间交互的一种架构。
它
主要由文档类(CDocument)、视图类(CView)和框架窗口类(CFrameWnd)组成。
文档类(CDocument)是表示应用程序中特定文档的类,它负责管理
文档的数据和状态。
每个文档类通常只处理一个特定类型的文档,如文本
文档、图像文档等。
文档类中的成员函数包括OpenDocument、SaveDocument等,用于打开和保存文档。
文档类还可以包含数据成员,
用于存储文档的内容。
视图类(CView)是用户界面的一部分,用于显示和修改文档的内容。
每个文档类通常都有一个对应的视图类。
视图类中的成员函数包括OnDraw、OnUpdate等,用于绘制文档的内容和响应用户输入。
视图类还
可以处理鼠标、键盘等事件。
框架窗口类(CFrameWnd)是应用程序的主窗口,负责创建和管理文
档和视图。
每个应用程序通常只有一个框架窗口类。
框架窗口类中的成员
函数包括OnCreate、OnSize等,用于处理窗口的创建、大小调整等事件。
框架窗口类还可以包含菜单、工具栏等用户界面元素。
文档视图结构的工作流程通常如下:
1.应用程序启动时,框架窗口类创建,并创建一个文档类和一个视图类。
2.框架窗口类创建菜单、工具栏等用户界面元素,同时将文档和视图
关联起来。
3.用户可以通过菜单、工具栏等用户界面元素打开、保存文档,触发
相应的文档类成员函数。
4.文档类根据用户的操作,读取或写入文件的数据,更新文档的内容。
5. 视图类接收到文档类的数据变化通知(通过OnUpdate函数),根
据最新的数据,重新绘制文档的内容。
6.用户可以通过鼠标、键盘等与视图进行交互,触发相应的视图类成
员函数。
7.视图类根据用户的操作,修改文档的数据,通过文档类更新文档的
内容。
通过文档视图结构,可以将应用程序的逻辑分离,使得文档和视图可
以独立开发和测试。
文档类和视图类各自负责处理不同的逻辑,减少了耦
合性,提高了代码的可维护性和复用性。
总结起来,MFC文档视图结构是一种用于实现文档和视图之间交互的
架构。
它由文档类、视图类和框架窗口类组成,通过各自的成员函数和事
件处理函数,实现了文档和视图的打开、保存、绘制和交互等功能。
文档
视图结构能够提高应用程序的可维护性和复用性,是MFC开发的重要概念
之一。