实验三 文档视图结构
第11章文档视图结构
视图是数据的用户界面, 通过窗口显示 通过打印机打印 提供用户与文档中数 据的交互功能
11.1文档 视图概念 文档/视图概念 文档
文档( 文档(document)指的是数据组合的抽象,它通常对应磁盘 )指的是数据组合的抽象, 文件,也可以对应I/O端口(包括打印机、键盘)或一块内存空间 端口( 文件,也可以对应 端口 包括打印机、键盘) 串流) (串流)。 同样的数据,我们可以用不同的方式来表示。 同样的数据,我们可以用不同的方式来表示。把纯的数据放在 文件中或数据库中。而把显示方式分离出来, 文件中或数据库中。而把显示方式分离出来,可以让一份数据有多 种不同的显示方式,程序中的数据表现称为“ 数据表现称为 种不同的显示方式,程序中的数据表现称为“视” 。这样就可以 分别考虑数据的保存 数据的保存——文档,和数据的表现 文档, 分别考虑数据的保存 文档 和数据的表现——视。 视 MFC提供了一种应用程序框架,其核心就是文档 视结构。在 提供了一种应用程序框架,其核心就是文档/视结构 视结构。 提供了一种应用程序框架 三种最基本的MFC程序框架中有两种:多文档结构和单文档结构。 程序框架中有两种: 三种最基本的 程序框架中有两种 多文档结构和单文档结构。 MFC采用两个既相互独立又相互紧密联系的类来实现这一结构: 采用两个既相互独立又相互紧密联系的类来实现这一结构: 采用两个既相互独立又相互紧密联系的类来实现这一结构 1.文档类CDocument,它主要用于存取文档; .文档类 ,它主要用于存取文档; 2.视图类CView,它主要用于显示和打印文档,并支持与用户的 .视图类 ,它主要用于显示和打印文档, 交互。 交互。
视图类中主要工作
显示信息( 显示信息(OnDraw) 消息处理(键盘、 定时器等) 消息处理(键盘、鼠标 、定时器等) 读取数据 修改数据 要求重画数据( CWnd::InvalidateRect )
文档视图结构的应用程序开发
感谢您的观看
THANKS
发展
随着移动互联网的兴起,文档视图结构也在不断发展和演变。一些现代的文档视图结构框架,如 React、Vue和Angular等,已经成为了前端开发的热门选择。同时,一些新的技术如WebAssembly 和Web Components也为文档视图结构的发展带来了新的机遇和挑战。
02
文档视图结构的原理与实 现以档为中心文档是应用程序的核心,所有的操作和交互都围绕文档展开。
分割视图
将应用程序分割为多个视图,每个视图负责展示文档的不同部分,提 高了代码的可维护性和可扩展性。
数据绑定
通过数据绑定技术,将视图与底层数据源连接起来,实现数据的实时 更新和同步。
文档视图结构的重要性
提高开发效率
通过使用文档视图结构,开发人 员可以快速构建出功能丰富、结 构清晰的应用程序,提高了开发 效率。
Excel 的文档视图结构分析
总结词
Excel 是常用的电子表格软件,其文档视图 结构包括表格、公式、图表等。
详细描述
Excel 的文档视图结构主要包括表格、公式 和图表等。用户可以通过表格来存储和整理 数据,通过公式来进行计算和数据处理,通 过图表来展示数据和趋势。Excel 还提供了 多种视图模式,如普通视图、分页预览、页 面布局等,方便用户在不同场景下使用。
Photoshop 的文档视图结构分析
总结词
Photoshop 是专业的图像处理软件,其文 档视图结构包括图层、通道、蒙版等。
详细描述
Photoshop 的文档视图结构主要包括图层 、通道和蒙版等。用户可以通过图层来组织 和管理图像的不同部分,通过通道来调整图 像的颜色和亮度,通过蒙版来控制图像的显 示和隐藏。Photoshop 还提供了多种视图 模式,如标准屏幕模式、全屏模式、画布旋
《文档视图结构》课件
办公自动化软件中的文档视图通常支 持多种视图模式,如页面视图、大纲 视图和阅读模式等,以满足不同用户 的需求。
通过文档视图,用户可以方便地查看 、编辑和保存文档内容,提高工作效 率。
文档视图在网页设计中的应用
在网页设计中,文档视图主要用于展示网页内容和结构。
通过文档视图,网页设计师可以方便地查看和编辑网页元素,如文本、图片、视频 等。
常见的网页设计软件如Adobe Dreamweaver、Sublime Text等都提供了文档视图 功能,方便设计师进行网页设计和开发。
文档视图在软件开发中的应用
在软件开发中,文档视图主要用 于描述和展示软件的结构和功能
。
通过文档视图,开发人员可以方 便地查看和编辑软件文档,如需 求规格说明书、设计文档、用户
文档视图的发展挑战
技术创新和人才培养
随着文档视图的发展,需要不断进行技术创新和人才培养,以满 足用户需求和提高市场竞争力。
数据安全和隐私保护
随着互联网技术的发展,数据安全和隐私保护成为越来越重要的问 题,需要加强数据安全和隐私保护措施。
跨平台兼容性和互操作性
随着文档处理软件的发展,需要实现跨平台兼容性和互操作性,以 满足用户在不同平台上的需求。
灵活性
文档视图应支持多种文档格式 和类型,满足不同用户的需求 。
可扩展性
文档视图应具备良好的可扩展 性,方便添加新功能和改进现 有功能。
性能优化
文档视图应注重性能优化,确 保快速加载和渲染文档内容,
提高用户体验。
文档视图的实现技术
基于Web的技术
使用HTML、CSS和JavaScript等技术构建文档视图,支持跨平台 和浏览器访问。
文档解析与渲染引擎
实验三_视图和索引
实验三视图和索引一、实验目的使学生掌握SQL SERVER中的视图创建、查看、修改和删除的方法;索引的创建和删除方法二、实验内容在学生-课程数据库中(1)用图形工具和T-SQL两种方法创建视图,取名为view_stu_grade,要求查看学生的学号,姓名,课程名和成绩。
(2)若发现视图定义的结构不能很好满足要求,还可以对它进行修改。
(3)删除视图(4)尝试分别为student表的每一个属性列添加一个惟一索引,将出现的现象和原因分析一下。
(5)删除索引三、实验过程要求个人填写(要求有文字描述和适当的图片辅助说明)注:图片需要上机运行SQL Server软件之后,可用QQ的抓图工具把运行窗口抓下来,粘贴在word文档中。
(1)①用图形工具创建视图:展开stud_course数据库,右键单击“视图”,在弹出的快捷菜单中有“新建视图”菜单项,单击“新建视图”,就会出现新建视图对话框,保存视图,给视图取名为view_stu_grade.②用T-SQL创建视图:查看结果:(2)若发现视图定义的结构不能很好满足要求,还可以对它进行修改。
如需要修改则点击视图选中view_stu_grade右键修改例如将视图修改为显示出计算机科学系男生的情况,并要求加密(3)删除视图①用图形工具删除视图②用T-SQL删除视图(4)①选中Student表打开索引,右键新建索引,如图操作②创建索引问题1(未选择要添加到索引键的表列)解决办法问题2(记录相同不能建立唯一索引)解决办法:不建立唯一结果(5)删除索引①图形工具删除索引单击鼠标右键要删除的索引,选择“删除”命令,然后弹出“删除对象”对话框,单击确定按钮,即可删除索引。
②用T-SQL语句删除索引四、实验总结要求个人填写(实验中发现的问题和解决的办法)本次实验练习了视图创建、查看、修改和删除的方法;索引的创建和删除方法。
通过这次实验我认识到视图的作用,能够简化用户的操作,视图使用户能以多钟角度看待同一数据,适当的利用视图可以更清晰的表达查询。
文档结构
2016/5/30文档视图结构文档视图结构是MFC中结构最为复杂,体系最为庞大,最具有代表性的部分。
MFC之所以被称为应用程序框架,原因之一就是文档视图结构将应用程序数据管理与数据显示分离,允许用户对两部分代码进行独立编写。
一、MFC支持两种文档视图应用程序,1、单文档界面(SDI):只有一个窗口,即用户在同一时刻只能操作一个文档。
(记事本)多文档界面(MDI):可以同时操作多个文档。
(WORD)2、MFC隐藏了两种用户界面模型的许多差别,通过应用程序向导创建两种文档的过程完全一样,但SDI文档不生成类CChildFrame,SDI主框架类CMainFrame的基类是CFrameWnd,而MDI的类CMainFrame的基类是CMDIFrameWnd。
二、文档、视图、框架、文档模板文档视图结构由四个要素组成,文档,视图,框架和文档模板。
1、文档:用于管理应用程序的数据——应用程序数据的抽象表示1.1任务:1)对数据进行管理与维护,数据保存在文档类的成员变量中。
2)处理命令消息,如菜单,工具栏,加速键的WM_COMMAND通知消息(但不能处理其他WINDOWS 消息)(WINDOWS消息和控件消息只能被窗口和视图处理)。
类CDocument是所有文档类的基类,提供文档类所需要的,最基本的功能实现,为文档对象和其他对象的交互提供基本框架。
1.2类CDocument提供的三种方法:1)构造方法:创建CDocument类对象,函数声明:CDocument()。
2)操作方法(12种方法):AddView,为文档添加视图;GetTitle,返回文档标题;RemoveView,为文档移除视图;SetTitle,为文档设置标题;SetPathName,设置文档数据文件的路径。
3)虚拟方法(12种):使应用程序能够对其重写一=以获取类CDocument派生类方法。
DeleteContents,删除文档数据;OnChangeViewList,检查视图是否有增加或减少;OnNewDocument,创建文档;OnOpenDocument,打开文档;OnSaveDocument,保存文档。
文档视图结构
文档/视图结构一、文档/视图的概念●在MFC中,文档类负责管理数据,提供保存和加载数据的功能。
视图类负责数据的显示,以及给用户提供对数据的编辑和修改功能。
●MFC给我们提供Document/View结构,将一个应用程序所需要的“数据处理与显示”的函数空壳都设计好了,这些函数都是虚函数,我们可以在派生类中重写这些函数。
有关文件读写的操作在CDocument的Serialize函数中进行,有关数据和图形显示的操作在CView的OnDraw函数中进行。
我们在其派生类中,只需要去关注Serialize和OnDraw 函数就可以了,其它的细节我们不需要去理会,程序就可以良好地运行。
●当我们按下“打开文件”菜单项时,Application Framework会激活打开文件对话框,让你指定文件名,然后自动调用CMiniCADDoc::Serialize读取文件。
Application Framework 还会调用CMiniCADView::OnDraw,传递一个显示DC,让你重新绘制窗口内容。
●MFC给我们提供Document/View结构,是希望我们将精力放在数据结构的设计和数据显示的操作上,而不要把时间和精力花费在对象与对象之间、模块与模块之间的通信上。
●一个文档对象可以和多个视图类对象相关联,而一个视图类对象只能和一个文档对象相关联。
●MFC对“文档”的设计思想是:一个类中的所有成员变量,都应该能够保存到一个文件中去,反之,也应该能从一个文件中读出来,加载到该类相应的成员变量中去。
MFC 对此的实现机制就是文档/视图的串行化(Serialize)。
二、串行化基础知识:使用CArchive类对存储在内存中的变量进行存取。
打开“006菜单工具栏状态栏”一章中的项目“2MiniCAD_图形保持”,添加菜单项“写文件”和“读文件”,对应代码如下:void CMiniCADDoc::OnFileWrite(){CFile file("C:\\1.dat", CFile::modeCreate | CFile::modeWrite);CArchive ar(&file, CArchive::store); //将CFile类和CArchive类关联起来,保存//ar.IsStoring();int i = 4;char ch = 'a';float f = 1.3f;CString str("ITJob");ar << i << ch << f << str;AfxMessageBox("成功写入数据到文件C:\\1.dat");}以二进制形式查看C:\1.dat文件的内容,如下void CMiniCADDoc::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("从文件C:\\1.dat成功读取到数据:%d, %c, %f, %s", i, ch, f, str);AfxMessageBox(strResult);}上述代码说明,CArchive类具有对文件的读写功能,可以通过其流操作符<<将变量存入文件,通过>>将文件中的数据读取到变量中来。
文档视结构
GetScollStyle 为该分割器窗口共享的滚动条指定新的滚动
分割器视窗的实现
单文档应用程序和多文档应用程序的分割器窗口实现技 术基本相同,只是基于父框架窗口类不一样而已。单文档应 用程序嵌入一个CSplitterWnd成员变量是基于父框架窗口类 CMainFrame类,CMainFrame类是CFrameWnd的派生类;而多 文档应用程序是基于CMDIChildWnd的派生类,用AppWizard 生成的多文档应用程序嵌入一个CSplitterWnd成员变量是基于 CChildFrame类,CChildFrame类是CMDIChildWnd的派生类; 当然也可以基于用ClassWizard 生成的其他CMDIChildWnd的 派生类。
Visual C ++ 类CSplitterWnd 简介
类CSplitterWnd 是 MFC类库中实现分割器窗口的基类,根据需要可 以从该类派生自己的分割器窗口类。分割器窗口是含有多个窗格的窗口, 每个窗格通常是应用程序特定的由 CView派生类的对象,也可以是具有 适当子窗口 ID 的任何 CWnd对象。类CSplitterWnd是类CWnd的派生类, 因此,类CSplitterWnd除了继承类CWnd方法外,还有以下方法: 构造函数: CSplitterWnd 该函数构造一个类CSplitterWnd的对象 Create 该 函 数 创 建 动 态 分 割 器 窗 口 并 将 此 窗 口 连 接 给 类 CSplitterWnd的对象 CreateStatic 该 函 数 创 建 静 态 分 割 器 窗 口 并 将 此 窗 口 连 接 给 类 CSplitterWnd的对象 CreateView 该函数在分割器窗口中创建一个窗格
有文档的应用程序框架。
软件工程实验三-概要设计
软件工程实验三-概要设计人事工资管理系统概要设计目录1.导言 (3)1.1目的 (3)2.系统分析 (4)3.界面设计 (4)图2-5人事管理0层编号1的数据流图 (7)图2-6 人事管理0层编号2的1层数据流图 (8)图2-7 工资管理0层数据流图 (8)4.体系结构 (8)4.1体系结构 (9)4.1.1STRUCT体系结构 (9)4.1.2系统体系结构 (9)4.2系统运行环境 (10)4.2.1网络结构图........................................................................................... 错误!未定义书签。
4.2.2 硬件环境 (10)4.2.3软件环境 (10)5.数据模型 (11)5.1数据库的概念结构模型设计 (11)5.2数据库的逻辑结构模型设计 (11)5.3数据库管理物理结构模型设计 (11)6.模块设计 (12)6.1.1表示层设计 (12)6.1.2控制层 (12)6.1.3模型层 (12)6.2登录管理模块设计 (12)6.2.1表示层设计 (12)6.2.2控制层设计 (13)6.2.3模型层设计 (13)1.导言1.1目的该文档的目的是描述人事工资管理系统项目的概要设计,其主要内容包括:●系统功能简介●系统结构设计●系统接口设计●数据设计●模块设计●界面设计本文档的预期的读者是:●开发人员●项目管理人员●测试人员1.2范围该文档定义了系统的结构和单元接口,但未确定单元的实现方法,这部分内容将在详细设计/实现中确定。
1.3缩写说明UMLUnified Modeling Language(统一建模语言)的缩写,是一个标准的建模语言。
HRHuman resources management(人事工资管理管理)的缩写。
1.4引用标准[1] 《企业文档格式标准》北京长江软件有限公司[2] 《软件概要设计报告格式标准》北京长江软件有限公司软件工程过程化组织1.5参考资料[1] 《实战struct》〔美〕TedHusted机械工业出版社[2] 《软件重构》清华大学出版社2.系统分析本系统可以实现人事工资管理,人事管理者通过该系统进行人事工资管理。
文档视图结构详细介绍
⽂档视图结构详细介绍以单⽂档界⾯(SDI)应⽤程序为例,介绍MFC的⽂档/视图程序结构。
学习要求理解⽂档/视图结构,可在AppWizard⽣成的SDI程序框架的基础上添加必要的代码,以⽣成⾃⼰的应⽤程序。
授课内容⼤部分应⽤程序均要使⽤数据,其主要⼯作可以分为两部分:⼀是对数据的管理,如存储、复制和查询等任务,⼀是对数据的处理和输⼊输出,包括显⽰和打印。
MFC提供了“⽂档/视图”结构⽀持这类应⽤程序。
12.1⽂档/视图概念在⽂档/视图结构⾥,⽂档可视为⼀个应⽤程序的数据元素的集合,MFC通过⽂档类提供了⼤量管理和维护数据的⼿段。
视图是数据的⽤户界⾯,可将⽂档的部分或全部内容在其窗⼝中显⽰,或者通过打印机打印出来。
视图还可提供⽤户与⽂档中数据的交互功能,将⽤户的输⼊转化为对数据的操作。
在MFC中,有两种类型的⽂档视结构,即单⽂档界⾯(SDI:Single Document Interface)应⽤程序和多⽂档界⾯(MDI:Multiple Document Interface)应⽤程序。
在单⽂档界⾯(SDI)程序中,⽤户在同⼀时刻只能操作⼀个⽂档,例如Windows的NotePad(记事本)程序采⽤的就是单⽂档界⾯。
在SDI程序中,打开新⽂档时会⾃动关闭当前打开的活动⽂档,如果当前⽂档修改后尚未保存,会提⽰⽤户是否保存所做的修改。
SDI应⽤程序⼀般都提供⼀个File菜单,在该菜单下有⼀组命令,⽤于新建⽂档(New)、打开已有⽂档(Open)、保存或换名存盘⽂档等。
这类程序相对⽐较简单,常见的应⽤程序有终端仿真程序和⼀些⼯具程序。
多⽂档界⾯(MDI)应⽤程序允许同时对多个⽂档进⾏操作,例如Microsoft Word和Developer Studio本⾝采⽤的都是多⽂档界⾯。
在MDI程序中可以打开多个⽂档(同时也为每个⽂档打开⼀个窗⼝),可以通过切换活动窗⼝激活相应的⽂档进⾏编辑处理。
MDI应⽤程序也提供⼀个File菜单,⽤于新建、打开和保存⽂档。
文档视图结构的应用程序框架.ppt
3)文档/视图结构中的窗口客户区(也就是用来 展示数据的区域)也是一个窗口,这个窗口在 文档/视图结构中称为视,它由新增加的类CView 类来管理的。
视图类专门用来对应用程序的数据进行展 示,在视图类中有一个很重要的函数OnDraw(), OnDraw()函数就是用来进行应用程序数据展示 的函数,一般在派生类中要重写这一函数。
其中IDR_MENU1表示菜单等资源的ID, CMyDoc表示文档类的派生类,CMainWnd表 示框架窗口类的派生类,CMyView表示视图类 的派生类。
CSingleDocTemplate类是单文档模板类, 它是CDocTemplate类的派生类。
9.2 单文档/多文档的文档/视图结构
• 单文档应用程序 有且只有一个文档(如:Windows记事本)
在文档/视图结构中,重写的OnDraw()函数 首先清空客户区窗口,然后再在窗口上绘制客 户需要的内容,也就是说,OnDraw()函数将集 中管理所有的数据展示工作
4)视类负责应用程序数据的展示,但应用程序 的数据一般不直接由视图类管理,而是作为文 档类(CDocument)的数据成员,由文档类来 进行集中管理,而且文档类将直接与磁盘打交 道,把文档类中的数据存盘,或从磁盘中取出 存盘的数据。
第9章 文档/视图结构的应用程 序框架
9.1分工合作的文档/视图结构
• 文档/视图结构的5个类 CWinApp类、CFrameWnd类、CView
类、CDocument类和CDocTemplate类。 其中主角是CDocument类(文档类)
和CView类(视图类),这就是文档/视 图结构的由来。
9.3单文档应用程序框架的建立与 分析
• 利用框架自动生成工具AppWizard生成单文档 应用程序框架。
基于文档视图结构的程序
文档视图架构的重要性
提高软件的可维护性和可扩展性
文档视图架构使得数据和视图可以独立变化,当数据发生变化时,只需要更新模型,而不 需要修改视图;同样,当用户界面发生变化时,也只需要修改视图,而不需要修改模型。 这大大降低了软件维护和扩展的难度。
提高软件的可重用性
文档视图架构使得模型、视图和控制器可以独立使用,从而提高了软件组件的重用性。例 如,不同的应用程序可以使用相同的模型和视图,只需要更换控制器即可实现不同的功能 。
提高软件的可定制性
文档视图架构允许用户自定义视图和控制器,从而使得应用程序能够更好地满足用户的个 性化需求。例如,用户可以通过更换皮肤或主题来自定义应用程序的外观和风格。
事件处理
控制器模型负责监听和处理用户输入事件,如点击、拖拽和键盘输 入等。
协调机制
控制器模型应协调文档模型和视图模型之间的交互,确保数据的一致 性和程序的正常运行。
04
文档视图架构的优缺点
优点
1 2
灵活性
文档视图架构允许开发者根据需要灵活地组织应 用程序的各个部分,使得应用程序更加易于扩展 和维护。
协作与共享
基于文档视图结构的程序能够支持多人同 时编辑同一份文档,并实时同步更新,提 高团队协作效率。此外,通过共享和权限 管理功能,确保文档的安全性和保密性。
数据库管理系统
数据建模与关系管理
数据库管理系统(如MySQL、Oracle、SQL Server等)使用基于文档视图结构的程序来展示和管理 数据之间的关系。通过数据表、视图和查询等工具,用户可以创建、修改和查询数据库中的数据。
实验三 Word 操作训练
实验三Word 操作训练实验报告一、实验目的:通过该试验,掌握文档、文本、字符、段落、项目符号、分栏、图片、艺术字、表格、公式编辑器、页面排版等的使用和操作二、实验内容和步骤:1. 样张1:文字处理软件WPS之父金山软件是中国最知名的软件企业之一,中国领先的应用软件和互联网提供商。
做世界一流的软件公司,是所有金山人不变的梦想。
金山软件创造了WPS office、金山词霸、金山毒霸、剑侠情缘、封神榜等众多知名产品。
金山软件董事长兼CEO得求伯君——这位成功开发国内第一套文字处理软件WPS的软件业“教父”而言,如何扛起民族软件自主创新大旗,前方并非一路平坦。
1986年,求伯君辞去河北省徐水县国企的工作,加盟北京四通公司,并于次年调往深圳四通公司。
1988年,求伯君加入香港金山公司,在深圳从事软件开发,并于1989年成功开发国内第一套文字处理软件WPS.1994年,由于香港金山被方正合并,求伯君脱离出来,自己在珠海成立珠海金山电脑公司,任董事长兼总经理,WPS业迎来了它最强的对手——微软旗下的word。
主动出击迎战的求伯君,生产出一种类似office套件的产品,叫做盘古组件,包含WPS、电子词典和电子表等产品。
然而,盘古组件——这款珠海金山独立自主做出的第一个软件最终败兵麦城。
1997年9月,WPS97正式上市,成绩出乎意料的好,推出仅两个多月,销量便达到1.3万套,金山也借此迈过最艰难的时刻。
1998年至2003年,先后获得联想等注资的金山软件,重点发力WPS、金山词霸、金山毒霸三大业务,金山软件的发展进入平稳阶段。
2003年,金山软件迎来了战略转型,求伯君和是时的搭档雷军发现了网游这块大蛋糕。
事实上,这一年,金山软件本已打算前往纳斯达克上市融资,但他们发现了准备上市和马上进军网游业务间的矛盾。
几经权衡,求伯君和搭档雷军共同说服了公司股东。
后来雷军回忆说,那一年资源其实还很有限,无法在多个战场全部拉开。
(转)文档视图结构中的各个部分是如何联系到一起的
(转)文档视图结构中的各个部分是如何联系到一起的文档/视图结构是MFC中最有特色而又有难度的部分,在这当中涉及了应用、文档模板、文档、视图、MDI框架窗口、MDI子窗口等不同的对象,如果不了解这些部分之间如何关联的话,就可能犯错误,也就很难编出有水平的文档/视图程序。
比如我在初学VC编程的时候,为应用程序添加了两个文档模板,两个模板公用一个文档类,只是视图不一样,期望当一个模板的文档的视图改变了文档后,调用UpdateAllViews后也能更新另一个文档模板的视图,结果当然是不行的,原因就是对MFC的文档/视图结构没有深入的了解,了解的最好方法就是阅读一下MFC的源代码。
下面就是我的笔记:(一)应用程序对象与文档模板之间的联系:首先,在应用程序对象中有一个CDocManager指针类型的共有数据成员m_pDocManager,在CDocManager中维护一个 CPtrList类型的链表:m_tempateList,它是一个保护成员。
InitInstance函数中调用CWinApp:: AddDocTemplate函数,实际上是调用m_pDocManager的AddDocTemplate函数向链表m_templateList 添加模板指针。
CWinApp提供了GetFirstDocTemplatePosition和GetNextDocTemplate函数实现对m_templateList链表的访问(实际上是调用了CDocManager的相关函数)。
在文件操作方面CWinApp提供的最常用的功能是文件的新建(OnFileNew)和打开(OnFileOpen),它也是调用CDocManager 类的同名函数。
对于新建,一般的时候在只有一个文档模板的时候,它新建一个空白的文件;如果有多个文档模板的时候,它会出现一个对话框提示选择文档类型。
它的源代码如下:void CDocManager::OnFileNew(){if (m_templateList.IsEmpty()){.......return;}//取第一个文档模板的指针CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetHead();if (m_templateList.GetCount() > 1){// 如果多于一个文档模板,出现对话框提示用户去选择CNewTypeDlg dlg(&m_templateList);int nID = dlg.DoModal();if (nID == IDOK)pTemplate = dlg.m_pSelectedTemplate;elsereturn; // none - cancel operation}......//参数为NULL的时候OpenDocument File会新建一个文件pTemplate->OpenDocumentFile(NULL);}打开文件:void CDocManager::OnFileOpen(){// 出现打开文件对话框CString newName;if (!DoPromptFileName(newName, AFX_IDS_OPENFILE,OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, TRUE, NULL)) return; // open cancelledAfxGetApp()->OpenDocumentFile(newName); //实际也是调用文档模板的同名函数}(二)文档模板与文档之间的联系:从上面看出应用程序对象对文件的新建和打开是依靠文档模板的OpenDocumentFile函数实现的。
文档视图结构PPT课件
7.1.3 文档类 2、文档的序列化
用户单击菜单项“文件|保存”
打开当前文档所对应的文件
§7.1 文档视图结构
用户单击菜单项“文件|另存为…” 询问保存文件名 打开用户输入的文件
生成Carchive的一个对象,并使之与所保存的文件相关联
调用文档类的Serialize成员函数,并将生成的Carchive对象传递给该成员函数
§7.1 文档视图结构
7.1.3 文档类 2、文档的序列化 用户处理的数据往往需要存盘作永久备份。将文档类中的数据成员变量的值 保存在磁盘文件中,或者将存储的文档文件中的数据读取到相应的成员变量 中。这个过程称为序列化(Serialize)。序列化实质上就是让对象将其当前 的状态(由其成员变量的值表示)写入到永久性存储体(通常是指磁盘)中, 以后还可以从永久性存储体中读取对象的状态(载入),从而重建对象。这 种对象的保存和恢复的过程称为 “序列化”。序列化是一种实现对象持久 性(Persistent)的机制,它是一个将对象中的数据转换成一个单一元素 (通常是Stream)的过程。
§7.2 文档视图结构的主要组成类
7.2.2 多文档应用程序的组成类
§7.2 文档视图结构的主要组成类
7.3.3 文档视图结构中各对象之间的关系 1、文档视图结构中各个对象之间的关系
创建
文档对象 指向:●
应用程序对象 指向:● 创建 文档模板 指向:●
视图对象 指向:●
创建
框架窗口 指向:●
创建
教学内容
§7.1 文档视图结构 §7.2 文档视图结构的主要组成类 §7.3 多视图及窗口切分 §7.4 文件操作 §7.5 综合实例——宾馆管理系统的完善 §7.6 小结 思考与练习
实验三 使用文档视图模式进行程序设计
添加学号、姓名、班级,点击确定就可以把数据添加到数据库和 ListCtrl 控件中 6. 当点击删除菜单项时,同时删除 ListCtrl 和数据库中的该项。 7. 当双击 ListCtrl 中的一项时出现如下对话框可以对数据项进行修改
8、部分代码: void CTest3View::OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult) {
2.使用 Acess 建立数据库为:学生.accdb,数据库中有一个学生表:Student,表中有三项分别 是学号、姓名和班级。 3. 该文档中有一个 ListCtr 控件用来显示数据库的内容。ListCtrl 控件可以随着窗口最大化 或还原。 4. 当右击 ListCtrl 中的某一项时即弹出如下菜单。
if (pos == NULL) TRACE0("No items were selected!\n");
else {
int nItem = m_list.GetNextSelectedItem(pos); CPoint point; GetCursorPos(&point); CMenu Menu; Menu.LoadMenu(IDR_MENU); CMenu *popMenu=Menu.GetSubMenu(0); popMenu->TrackPopupMenu(TPM_LEFTBUTTON,point.x,point.y,this); }
Test3View::OnRclickList(NMHDR* pNMHDR, LRESULT* pResult) {
// TODO: Add your control notification handler code here POSITION pos = m_list.GetFirstSelectedItemPosition();
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三文档视图结构1.实验学时:4学时2.实验目的:学习MFC程序的文档视图结构。
3.实验内容:(1)创建一个标题为“ MySdi”的应用程序。
主窗口中显示一文本“您好, 单文档界面的例程!”。
“编辑”菜单含有菜单项“改变显示文本”,单击该项,弹出一个对话框,用以改变主窗口中的显示文本。
如图1所示。
(2)创建一个标题为“ My MDI Test–Mymdi1”多文档的应用程序,程序运行后,可以打开若干个文档,如图2所示, Mymdi1和Mymdi21是两个文档.图1 单文档应用程序图2 多文档应用程序4.实验步骤:对于单文档应用程序:1. 创建工程:创建一个MFC AppWizard(exe)工程文件Mysdi,并选择Single Document的的应用程序。
2. 添加资源:程序添加如图所示的对话框。
并使用ClassWizard为对话框生成CDialog类的派生类CDlgInput,并为其中的EditBox控件(其ID为IDC_EDIT1)添加相关联的成员变量m_input,其类型为Cstring。
3. 添加成员变量:为CMysdiDoc类添加成员变量,步骤如下:在Workspace窗口的ClassView选项卡中展开Mysdi Class,右击CMysdiDoc;在弹出菜单中,单击Add Member Variable;输入变量类型为CString, 变量名m_str, 访问类型public:单击OK。
4.文档变量初始化:在CMysdiDoc的OnNewDocument成员变量中为公有成员m_str赋以初值“您好, 单文档界面的例程!”。
方法是将OnNewDocument的实现替换为如下代码:BOOL CMymdiDoc2::OnNewDocument(){if (!CDocument::OnNewDocument()) return FALSE;m_str="您好, 单文档界面的例程!";return TRUE;}5.视图的输出为视图的框架窗口中显示文档类的m_str成员变量的内容,用如下代码替换类CMysdiView的OnDraw成员函数void CMysdiView::OnDraw(CDC* pDC){CMysdiDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);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);}6. 添加菜单项:在“编辑”菜单中添加一项改变文档内容的菜单,可将所修改的文档显示文本存入磁盘文件,实现方法如下:(1)单击Workspace窗口--> ResourceView选项卡--> 展开Mysdi resources|Menu --> 双击IDR_MAINFRAME --> 为“编辑”菜单添加一个菜单项“改变显示文本”--> 设置ID 为ID_EDIT_CHANGETEXT。
(2)为示例程序添加如图16-7所示的对话框。
然后,使用ClassWizard为对话框生成CDialog类的派生类CInputDlg,并为其中的EditBox控件(其ID为IDC_EDIT1)添加相关联的成员变量m_input,其类型为CString。
(3)在类CMysdiDoc中为菜单项“编辑|改变显示文本”(ID为ID_EDIT_CHANGETEXT)添加处理函数OnEditChangeText()void CMysdiDoc::OnEditChangetext(){CInputDlg inputDlg; //建立一个CinputDlg类的对象inputDlg//使inputDlg成为一个模式对话框if( inputDlg.DoModal()==IDOK ){m_str = inputDlg.m_input; //获取输入的字符串UpdateAllViews(NULL); //更新视图}}7. 为使CInputDlg类在CMysdiDoc类中成为可识别的,必须在mysdiDoc.cpp文件中加入CInputDlg类的说明头文件InputDlg.h#include “InputDlg.h”//加入头文件8. 运行,调试。
对于多文档应用程序:1. 创建MDI工程:创建一个MFC AppWizard(exe)工程文件Mymdi,并选择Multiple Document的的应用程序。
在Step4单击Advanced,并设置Advanced Option对话框。
在Step6设置基类为CEditView。
其它均取默认值设置。
2. 创建第二种文档和视图类:在View-->Class Wizard-- lass Info-->Add Class加入新类在New Class对话框设置Cdocument的派生类CMymdiDoc2。
同样方法,加入CScollView的派生类CMymdiView2。
3. 创建资源:(1) 文档、视图、框架窗口共同的资源ID在Resource.h文件中,手工加入下列代码:#define IDR_MYMDITYPE2 135这样,就定义了文档、视图、框架窗口共同的资源ID。
(2) 文档模板的资源对于第一个文档,利用应用程序向导直接产生了一个文档模板,现在必须手工地运用这种格式加入资源。
具体的方法是在mymdi.rc文件中,加入下列代码:IDR_MYMDITYPE2 “\nMymdi2\nMymdi2\nMymdi2 文件(*.mm2)\n.mm2 \nMymdi2.Document\nMymdi2 Document"(3) 菜单、对话框资源:为了实现可视化的程序,须添加一系列的资源,用户可将所修改文档显示文本保存入磁盘文件,需要时再打开并恢复该文档。
(a) 单击Workspace窗口的ResourceView选项卡,展开Mymdi resources|Menu,加入ID为IDR_MYMDITYPE2的菜单,使它与现有的ID为IDR_MYMDITYPE的菜单完全相同,然后,在其“编辑”菜单添加菜单项“改变显示文本”,并添加新菜单项ID为ID_EDIT_CHANGETEXT。
(b) 用与单文档应用程序完全相同的方法,添加的对话框。
使用ClassWizard为对话框生成CDialog类的派生类CDlgInput,并为其中的EditBox控件(其ID为IDC_EDIT1)添加相关联的成员变量m_input,其类型为CString。
4. 代码编辑1. 创建文档模板类在应用程序的InitInstance()函数中,通过使用文档模板的构造函数创建文档模板的对象如下:BOOL CMymdiApp::InitInstance(){ …CMultiDocTemplate* pDocTemplate2;pDocTemplate2 = new CMultiDocTemplate(IDR_MYMDITYPE2,RUNTIME_CLASS(CMymdiDoc2), //MDI派生文档类的CRuntimeClass对象的指针RUNTIME_CLASS(CChildFrame),//MDI派生子框架类的CRuntimeClass对象的指针RUNTIME_CLASS(CMymdiView2) // 创建文档模板的对象);//使用CwinApp::AddDocTemplate() 将新模板添加到应用程序的文档模板列表中AddDocTemplate(pDocTemplate2);…}为使CMymdiDoc2类和CMymdiView2类在CMymdiApp类中成为可识别的,必须在MymdiApp.cpp文件中加入说明CMymdiDoc2类和CMymdiView2类的MymdiDoc2.h和MymdiView2.h#include "MymdiDoc2.h" //加入头文件#include "MymdiView2.h"2. 扩展CMymdiDoc2类(a) 添加成员变量用对CMysdiDoc类同样的方法,对CmymdiDoc2类添加成员变量,最终,在CMymdiDoc2.h 的下述代码段中增加变量m_str声明语句。
// Attributespublic:CString m_str;(b) 文档变量初始化在CmymdiDoc2的OnNewDocument成员变量中为公有成员m_str赋以初值“您好, 多文档界面的例程!”。
方法是将OnNewDocument()代码替换如下:BOOL CMymdiDoc2::OnNewDocument(){if (!CDocument::OnNewDocument()) return FALSE;m_str="您好, 多文档界面的例程!";return TRUE;}(c) 添加菜单处理函数使用ClassWizard在类CmymdiDoc2中为菜单项“编辑|改变显示文本”(ID为ID_EDIT_CHANGETEXT)添加处理函数OnEditChangeText,其代码如下:void CmymdiDoc2::OnEditChangetext(){ CDlgInput inputDlg; //建立CinputDlg类的对象inputDlgif( inputDlg.DoModal()==IDOK )//inputDlg成为一个模式对话框{m_str = inputDlg.m_input; //获取输入的字符串UpdateAllViews(NULL); //更新视图}}为了在CMymdiDoc类中识别CinputDlg类,必须在文件MymdiDoc2.cpp中加入说明CinputDlg类的头文件。
#include "InputDlg.h"//加入头文件3.视图的输出为在视图的框架窗口中显示文档类中的m_str成员变量的内容,应为CmymdiView2类的OnDraw成员函数添加些代码,将OnDraw成员函数替换如下:void CmymdiView2::OnDraw(CDC* pDC){CmymdiDoc2* pDoc = (CmymdiDoc2*)GetDocument();ASSERT_VALID(pDoc);CRect rectClient; // 当前客户区GetClientRect(rectClient); // 获取当前客户区的指针CSize sizeClient=rectClient.Size(); // 获取当前客户区的大小CString str=pDoc->m_str; // 从文件中读取数据CSize sizeTextExtent=pDC->GetTextExtent(str);//用新字体绘制字符pDC->TextOut((sizeClient.cxsizeTextExtent.cx)/2,(sizeClient.cysizeTextExtent.cy)/2,str); // 确定文本输出位置5.实验要求:实验报告中要有演示程序运行的结果截图。