《文档视图程序基础.pptx》由会员分享,可在线阅读,更多相关《文档视图程序基础.pptx(39页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、WindowsWindows 程序设计程序设计文档视图文档视图(Document/View)(Document/View)基础基础于东2012上,第八周2形而上者谓之道,形而下者谓之器。形而上者谓之道,形而下者谓之器。易经易经得道可为师,得器可为匠。得道可为师,得器可为匠。3利用Class Wizard创建Doc/View程序Doc/View程序框架分析View类的编程方法(1)基于基于CEditViewCEditView的编程的编程基于基于CFormViewCFormView的编程的编程Doc类的编程文档序列化4内容内容5创建单文档创建单文档/视图程序视图程序(1)(1)全部下一步,直至完成
2、全部下一步,直至完成6创建单文档创建单文档/视图程序视图程序(2)(2)自动创建自动创建4 4个类,分个类,分别是:别是:视图类视图类应用程序类应用程序类程序主框架类程序主框架类文档类文档类指定指定ViewView类的基类,类的基类,可获得不可获得不同视图类同视图类型型演示W8_17创建单文档创建单文档/视图程序视图程序(3)(3)标题栏菜单栏工具栏状态栏Document窗口AppApp类对象类对象DocDoc类对象类对象MainFrmMainFrm对象对象ViewView对象对象在Dlg程序中,App类负责启动程序,创建Dlg类对象,之后所有操作都放在Dlg类中完成,包括消息映射函数消息映射
3、函数窗口各种控件变量窗口各种控件变量需要保存的各种数据需要保存的各种数据子子DlgDlg对象、操作函数等对象、操作函数等如果程序比较复杂,Dlg类会变得混乱不堪。比如,要在程序中添加一个算法,再添加一组文件格式操比如,要在程序中添加一个算法,再添加一组文件格式操作方法,再添加一组变量,再添加数据库的读取,再添加。作方法,再添加一组变量,再添加数据库的读取,再添加。都在。都在dlgdlg类中?类中?8DocDoc和和ViewView的概念的概念(1)(1)暂时忘记简单的Dlg,回顾Win程序的最初理解。用户对Windows程序的要求要有界面,界面能够处理用户消息要有界面,界面能够处理用户消息可能
4、是很复杂的界可能是很复杂的界面操作。比如画图,比如面操作。比如画图,比如3D3D显示,比如复杂文档显示。显示,比如复杂文档显示。要能够处理、保存数据要能够处理、保存数据可能是很复杂的数据,比如可能是很复杂的数据,比如EcxelEcxel、wordword文档数据文档数据为了应对复杂的操作,可以考虑将这两者分开实现。单独写一个类,处理界面操作单独写一个类,处理界面操作即即CviewCview视图类视图类单独写一个类,处理用户的数据操作单独写一个类,处理用户的数据操作即即CDocCDoc文档类文档类9DocDoc和和ViewView的概念的概念(2)(2)Doc+View的搭配是MFC成功的灵魂在
5、在DocDoc中,可以使用多种数据结构,实现各种数据的保存、中,可以使用多种数据结构,实现各种数据的保存、处理、加工等。处理、加工等。在在ViewView中,将数据中,将数据“画画”在屏幕上,使用坐标、画笔、颜在屏幕上,使用坐标、画笔、颜色、字体、鼠标控制,等等。色、字体、鼠标控制,等等。ViewView还负责人机交互,负责消息响应,负责从还负责人机交互,负责消息响应,负责从DocDoc中读写中读写数据。数据。10DocDoc和和ViewView的概念的概念(3)(3)程序框架MainFrm将程序将程序“界面界面”进一步分为两部分,第一部分是与程序进一步分为两部分,第一部分是与程序DocDoc
6、和和ViewView无关的部分,比如,程序外框、标题栏、关闭按钮、菜单、无关的部分,比如,程序外框、标题栏、关闭按钮、菜单、状态栏等,将这些部分作为程序状态栏等,将这些部分作为程序“框架框架”。Doc和View程序需要处理的数据以及对应的显示数据的手段。程序需要处理的数据以及对应的显示数据的手段。每个每个ViewView对象都需要与至少一个对象都需要与至少一个DocDoc对象对象“绑定绑定”实现数据传输实现数据传输每个每个DocDoc对象也需要通过对象也需要通过ViewView来显示给用户来显示给用户单文档(SDI)和多文档(MDI)程序SDISDI程序中只允许使用一个程序中只允许使用一个Do
7、cDoc对象。对象。MDIMDI程序中在同一时间允许使用多个程序中在同一时间允许使用多个DocDoc对象。对象。11Doc/ViewDoc/View程序的理念程序的理念利用Class Wizard创建Doc/View程序Doc/View程序框架分析View类的编程方法(1)基于基于CEditViewCEditView的编程的编程基于基于CFormViewCFormView的编程的编程Doc类的编程文档序列化12内容内容应用程序类应用程序类W8_1.hW8_1.h程序主框架类程序主框架类MainFrm.hMainFrm.h视图类视图类View.hView.h文档类文档类Doc.hDoc.h13S
8、DISDI程序文件结构程序文件结构14解析:解析:CAppCApp应用程序类应用程序类(1)(1)从头文件看,与Dlg程序基本一致,也是只实现了InitInstanceInitInstance方法。Dlg程序的InitInstance负责创建、显示Dlg类对象SDI程序的InitInstance,创建的是“文档模板类”对象15解析:解析:CAppCApp应用程序类应用程序类(2)(2)文档模板类的意义SDI程序中,View类和Doc类相互独立,而MainFrm类实际上是View类的一个容器。三者共同组成了程序的表里。由于三者实际上是并行的类,因此三者之间的数据传输就成了问题。简单的相互访问可通
9、过获取指针实现,但如果要求数据的自动同步,就很难实现。在App类的InitInstance中,通过通过CSingleDocTemplateCSingleDocTemplate模板类,模板类,用一种复杂的手段将三者绑定在一起。用一种复杂的手段将三者绑定在一起。在此之后,三者之间可以通过各自内部的成员函数,实现相互的数据访问。16解析:解析:CAppCApp应用程序类应用程序类(3)(3)参考资料:应用程序类应用程序类W8_1.hW8_1.h程序主框架类程序主框架类MainFrm.hMainFrm.h视图类视图类View.hView.h文档类文档类Doc.hDoc.h17SDISDI程序文件结构程
10、序文件结构18解析:解析:MainFrmMainFrm类类这里定义了默认的状态栏和工具栏对象与Dlg程序中的OnInitDlgOnInitDlg类似,这里的初始化函数叫做OnCreateOnCreate。SDI的OnCreateOnCreate函数中,完成了状态栏和工具栏的初始化,并实现了工具栏的Docking应用程序类应用程序类W8_1.hW8_1.h程序主框架类程序主框架类MainFrm.hMainFrm.h视图类视图类View.hView.h文档类文档类Doc.hDoc.h19SDISDI程序文件结构程序文件结构20解析:视图类解析:视图类ViewView类类(1)(1)View类访问D
11、oc类对象的通路21解析:视图类解析:视图类ViewView类类(2)(2)View类默认的消息响应重要:重绘消息重绘消息响应函数应用程序类应用程序类W8_1.hW8_1.h程序主框架类程序主框架类MainFrm.hMainFrm.h视图类视图类View.hView.h文档类文档类Doc.hDoc.h22SDISDI程序文件结构程序文件结构23解析:文档类解析:文档类DocDoc类类(1)(1)OnNewDocumentOnNewDocument函数,即为菜单中函数,即为菜单中“新建新建”对应的响应函数对应的响应函数SerializeSerialize函数,实现文档序列化,即实现数据的存储、读
12、写操作。函数,实现文档序列化,即实现数据的存储、读写操作。文档序列化函数中,程序并不知道用户需要处理什么样的文档序列化函数中,程序并不知道用户需要处理什么样的数据,因此只给出一个数据,因此只给出一个“空壳空壳”结构,没有实现任何操作。结构,没有实现任何操作。在点击菜单或工具栏中的打开、保存、另存为按钮时,程在点击菜单或工具栏中的打开、保存、另存为按钮时,程序会通过序会通过“绑定绑定”机制执行序列化函数。机制执行序列化函数。24解析:文档类解析:文档类DocDoc类类(2)(2)程序框架包含4个类:App、MainFrm、View、DocAppApp类类负责启动程序,创建负责启动程序,创建“文档
13、模板对象文档模板对象”实现实现View/Doc/MainFrmView/Doc/MainFrm的绑定的绑定MainFrmMainFrm类类负责实现程序框架,以及其中的界面元素负责实现程序框架,以及其中的界面元素ViewView类类负责实现数据内容的展示和处理界面,并且负责处负责实现数据内容的展示和处理界面,并且负责处理界面消息。理界面消息。DocDoc类类在初始化的时候,并未定义任何数据,需要用户按在初始化的时候,并未定义任何数据,需要用户按照自己需求编写该类。框架程序仅在照自己需求编写该类。框架程序仅在ViewView类中实现类中实现GetDocumentGetDocument方法,获取方法
14、,获取DocDoc对象指针。对象指针。25小结:小结:SDISDI程序结构程序结构ViewView类编程是重点内容类编程是重点内容利用Class Wizard创建Doc/View程序Doc/View程序框架分析View类的编程方法(1)基于基于CEditViewCEditView的编程的编程基于基于CFormViewCFormView的编程的编程Doc类的编程文档序列化26内容内容Dlg程序通过组合多种控件完成程序功能SDI框架为View视图类提供了若干种基类,可以直接实现各种典型应用。如:CEditViewCEditView:提供包含编辑控件的视图,可实现文本编辑:提供包含编辑控件的视图,可
15、实现文本编辑CFormViewCFormView:提供类似对话框模板的视图,:提供类似对话框模板的视图,CScrollViewCScrollView:提供自动滚动、缩放功能的视图:提供自动滚动、缩放功能的视图CListViewCListView:提供列表控件视图提供列表控件视图CTreeViewCTreeView:提供树控件视图提供树控件视图CCtrlViewCCtrlView:提供以上各种视图的基类视图提供以上各种视图的基类视图CViewCView:直接对视图进行编程直接对视图进行编程27ViewView类编程类编程(1)(1)概述概述创建方法:在创建的第6步中,选择View类的基类为CEd
16、itView。28基于基于CEditViewCEditView的编程的编程什么都不需要做,就能实现最简单的文本文件读取、保存、修改等操作。29基于基于CEditViewCEditView的编程的编程当然,这个程序非常简单,以至于只能展示看看,基本无法使用。更常用的一种视图,是FormView演示概念:Form即表单,类似于无模式对话框的样式,可以安置各种控件,当作一个对话框来使用。通过FormView,可以在SDI程序中很方便的使用各种Dlg程序中的控件。实例:实例:以以FormViewFormView为视图类的基类,实现一个文本编辑器。为视图类的基类,实现一个文本编辑器。30基于基于CFor
17、mViewCFormView的编程的编程(1)(1)Step1Step1:建立SDI程序,在第6步时,选择View类的基类为CFormViewStep2Step2:在出现的类似于对话框的面板上安置控件31基于基于CFormViewCFormView的编程的编程(2)(2)与Dlg的使用完全一致,可以添加各种控件。在View类中,为这些控件添加相应的消息响应和变量Step3Step3:添加Button消息响应,为Edit添加Cstring变量32基于基于CFormViewCFormView的编程的编程(3)(3)在资源管理器中,Form也属于一种对话框Step4Step4:在Doc类中,添加Cs
18、tring变量,用来存储Edit字符串数据Step5Step5:通过文档序列化实现文档打开文档打开33基于基于CFormViewCFormView的编程的编程(4)(4)Step6Step6:在View类中添加OnUpdate函数实现文档到视图的自动更新34基于基于CFormViewCFormView的编程的编程(5)(5)Step6Step6:在View类中添加OnUpdate函数实现文档到视图的自动更新到目前,程序可以打开显示一个文本文档,但无法保存到目前,程序可以打开显示一个文本文档,但无法保存35基于基于CFormViewCFormView的编程的编程(5)(5)Step7:Step7
19、:修改文档序列化函数,实现文档保存文档保存36基于基于CFormViewCFormView的编程的编程(6)(6)获取窗口框架指针获取当前视图指针序列化,保存数据Step8:Step8:为了使界面更好看,为控件添加一个WM_SIZE消息响应,来实现自动调整页面大小。37基于基于CFormViewCFormView的编程的编程(7)(7)可以将可以将FormViewFormView看作看作DlgDlg的扩展,的扩展,dlgdlg能做的事情,能做的事情,formviewformview都能做都能做使用使用FormViewFormView编程,如果跟以前编程,如果跟以前dlgdlg程序一样,把所有东西程序一样,把所有东西都堆在都堆在viewview类中,从理论上是没有问题的。但建议不要这类中,从理论上是没有问题的。但建议不要这么做,把数据放在么做,把数据放在DocDoc类中更合理。类中更合理。要学会使用要学会使用OnSizeOnSize函数调整函数调整FormViewFormView中各种控件的位置关中各种控件的位置关系。系。38FormViewFormView编程小结编程小结39The endThe end
限制150内