收藏 分销(赏)

文档类对象持续性.pptx

上传人:天**** 文档编号:4245628 上传时间:2024-08-30 格式:PPTX 页数:26 大小:389.80KB
下载 相关 举报
文档类对象持续性.pptx_第1页
第1页 / 共26页
文档类对象持续性.pptx_第2页
第2页 / 共26页
文档类对象持续性.pptx_第3页
第3页 / 共26页
文档类对象持续性.pptx_第4页
第4页 / 共26页
文档类对象持续性.pptx_第5页
第5页 / 共26页
点击查看更多>>
资源描述

1、文档-视图结构(1)数据储存在文档类中,数据显示由视图负责。视图是程序窗口的客户区,用户通过视图与程序交互,框架窗口是客户区的框架;一个文档可以对应多个不同视图;一个视图一般只对应一个文档。当文档数据发生变化时,视图显示的状态也会随之变化;对于多个视图的情况,基于同一文档的多个视图的显示同步变化。第1页/共26页文档-视图结构(2)第2页/共26页文档模板文档模板用于存放与应用程序文档、视图和边框窗口有关的信息。创建或打开文档时,应用程序使用文档模板创建文档类对象来存放文档,创建视图类对象来显示文档,创建边框窗口类对象来画出视图窗口。第3页/共26页文档的创建过程第4页/共26页框架窗口对象产

2、生的次序第5页/共26页视图的创建过程第6页/共26页文档和视图对象之间相互作用的函数(1)1.CView:GetDocument()作用:返回该视图所联系的文档对象的指针;1.2.CDocument:GetFirstViewPosition()作用:返回该文档对象的视图列表中第一个视图的POSITION值。3.CDocument:GetNextView()作用:返回一个由POSITION值标识的视图对象指针。以上两个函数常搭配使用,来遍历一个文档对象的视图列表。第7页/共26页文档和视图对象之间相互作用的函数(2)1 4.CDocument:UpdataAllViews()作用:更新与该文档

3、相关联的视图。5.CView:OnUpdate()作用:更新视图。原型:virtual void OnUpdate(CView*pSender,LPARAM lHint,CObject*pHint);UpdataAllViews()-OnUpdate()-OnDraw()2.6.CView:OnInitialUpdate()作用:用于对视图对象进行初始化。OnInitialUpdate-OnUpdate()-OnDraw()3.7.CDocument:DeleteContens()作用:当文档关闭时,应用程序框架自动调用它。第8页/共26页一个文档视图结构程序Ex07a(1)步骤1.选择向导M

4、FCAppWizard(exe),创建一个名为Ex07a的项目.在MFCAppWizard对话框的第一步中选择多文档.选择视图的基类为CFormView步骤2.在VC+6.0中,单击“插入新建类”菜单,在NewClass对话框的Classtype栏中选择GenericClass,Name文本框栏输入CLine,在Baseclass栏的左边输入选择CObject。单击OK按钮,对话框类CStudent即被创建.第9页/共26页一个文档视图结构程序Ex07a(2)步骤3.编辑Student.h文件,使CStudent类的定义如下:classCStudent:publicCObjectpublic:

5、DECLARE_DYNCREATE(CStudent)longm_nCode;CStringm_sName;longm_lAge;doublem_lScore;CStudent();CStudent(long,CString,long,double);virtualCStudent();第10页/共26页一个文档视图结构程序Ex07a(3)步骤4.编辑Student.cpp文件,使CStudent类的实现如下:IMPLEMENT_DYNCREATE(CStudent,CObject)CStudent:CStudent()CStudent:CStudent(longcode,CStringnam

6、e,longage,doublescore)m_nCode=code;m_sName=name;m_lAge=age;m_lScore=score;CStudent:CStudent()第11页/共26页一个文档视图结构程序Ex07a(4)步骤5.在文档类CEx07aDoc中加入公有成员变量:POSITION curPos;CTypedPtrList m_dataList;其中CTypedPtrList 类是一个模板类,其定义格式如下:CtypedPtrList其中TYPE用来指定你的列表元素的类型;例如int,char,long,float,或为类和结构。BASE_CLASS用来指定CTyp

7、edPtrList 类的基类。CObList类支持指向Cobject派生类的对象的有序的指针列表。为了能在应用程序中使用CTypedPtrList,在文件stdafx.h中#include 第12页/共26页一个文档视图结构程序Ex07a(5)步骤6.在文档类CEx07aDoc中加入虚函数DeleteContents()void CEx07aDoc:DeleteContents()while(!m_dataList.IsEmpty()delete m_dataList.RemoveHead();CDocument:DeleteContents();/清除m_dataList占有的内存第13页/

8、共26页一个文档视图结构程序Ex07a(6)步骤7.在对话框资源编辑器中编辑向导自动生成的对话框资源ID_Ex07a_FORM,该资源与视图类CEx07aView相关联.第14页/共26页一个文档视图结构程序Ex07a(7)控件IDCode编辑控件IDC_CODEName编辑控件IDC_NAMEAge编辑控件IDC_AGEScore编辑控件IDC_SCOREAdd按钮IDC_ADDNext按钮IDC_NEXT对话框中各控件的ID为:第15页/共26页一个文档视图结构程序Ex07a(8)步骤8.为CEx07aView添加一些成员变量,与对话框中各编辑框相对应.ID成员变量名属性类型变量类型IDC

9、_CODEm_lCodeValuelongIDC_NAMEm_sNameValueCStringIDC_AGEm_lAgeValuelongIDC_SCOREm_lSCoreValuedouble第16页/共26页一个文档视图结构程序Ex07a(9)步骤9.在CEx07aView类中为IDC_ADD按钮添加消息处理函数OnAdd,并编辑该函数为:voidCEx07aView:OnAdd()UpdateData();CEx07aDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);CStudent*pStudent;pStudent=newCStudent(m_lC

10、ode,m_sName,m_lAge,m_lScore);pDoc-m_dataList.AddTail(pStudent);/文档类中的数据pDoc-curPos=pDoc-m_dataList.GetHeadPosition();步骤10.在CEx07aView类中为IDC_NEXT按钮添加消息处理函数OnNext,并编辑该函数为:第17页/共26页voidCEx07aView:OnNext()CEx07aDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);if(pDoc-curPos!=NULL)CStudent*pStudent=(CStudent*)p

11、Doc-m_dataList.GetAt(pDoc-curPos);/文档的数据传给视图类的数据成员m_lCode=pStudent-m_nCode;m_sName=pStudent-m_sName;m_lAge=pStudent-m_lAge;m_lScore=pStudent-m_lScore;/成员变量的数据传给控制ID,在对话框中显示数据UpdateData(false);pDoc-m_dataList.GetNext(pDoc-curPos);if(pDoc-curPos=NULL)pDoc-curPos=pDoc-m_dataList.GetHeadPosition();/为进行下

12、一轮循环做准备elseMessageBox(“当前列表中没有数据!”);第18页/共26页一个文档视图结构程序Editor(1)步骤1.选择向导MFCAppWizard(exe),创建一个名为Editor的项目.选择单文档界面.在AppWizardStep40f6对话框中,单击Advanced按钮,弹出AdvancedOption对话框,第19页/共26页一个文档视图结构程序Editor(2)步骤2.为文档类添加数据成员public:CStringListlines;intnLineNum;步骤3.在CEditorDoc:OnNewDocument函数中,初始化文档类的数据成员BOOLCEdi

13、torDoc:OnNewDocument()if(!CDocument:OnNewDocument()returnFALSE;nLineNum=0;POSITIONpos;pos=lines.GetHeadPosition();while(pos!=NULL)(CString)lines.GetNext(pos).Empty();lines.RemoveAll();returnTRUE;第20页/共26页一个文档视图结构程序Editor(3)步骤4.重载CEditorDoc:Serialize函数.voidCEditorDoc:Serialize(CArchive&ar)CStrings();

14、intnCount=0;CStringitem();if(ar.IsStoring()POSITIONpos;pos=lines.GetHeadPosition();if(pos=NULL)return;while(pos!=NULL)item=lines.GetNext(pos);aritem;lines.AddTail(item);nCount+;catch(CArchiveException*e)if(e-m_cause!=CArchiveException:endOfFile)TRACE0(Unknownexceptionloadingfile!n);throw;elseTRACE0(

15、Endoffilereached.n);e-Delete();break;/endofcatch/matchofwhile(1)nLineNum=nCount;/matchofelse第22页/共26页一个文档视图结构程序Editor(5)步骤5.在CEditorView类中处理WM_CHAR消息,编辑消息处理函数为:voidCEditorView:OnChar(UINTnChar,UINTnRepCnt,UINTnFlags)CEditorDoc*pDoc=GetDocument();CClientDCdc(this);CStringline();/存放编辑器当前行字符串POSITIONpo

16、s=NULL;/字符串链表位置指示if(nChar=r)/若是回车,则增加一行pDoc-nLineNum+;第23页/共26页else/按行号返回字符串链表中位置值pos=pDoc-lines.FindIndex(pDoc-nLineNum);if(pos=NULL)/没有找到该行号对应的行,因此它是一个空行,把它加到字符串链表中。line+=(char)nChar;pDoc-lines.AddTail(CString(line);else/当前文本行还没有换行结束,因此将文本加入到行末line=pDoc-lines.GetAt(pos);line+=(char)nChar;pDoc-line

17、s.SetAt(pos,line);TEXTMETRICtm;dc.GetTextMetrics(&tm);dc.TextOut(0,(int)pDoc-nLineNum*tm.tmHeight,line,line.GetLength();pDoc-SetModifiedFlag(TRUE);CView:OnChar(nChar,nRepCnt,nFlags);第24页/共26页一个文档视图结构程序Editor(7)步骤6.在CEditorView类重载OnDraw(),编辑该函数为:voidCEditorView:OnDraw(CDC*pDC)CEditorDoc*pDoc=GetDocum

18、ent();ASSERT_VALID(pDoc);TEXTMETRICtm;pDC-GetTextMetrics(&tm);intlHeight=tm.tmHeight+tm.tmExternalLeading;/纵向y坐标为0inty=0;POSITIONpos;CStringline;if(!(pos=pDoc-lines.GetHeadPosition()return;第25页/共26页一个文档视图结构程序Editor(8)/循环输出各文本行while(pos!=NULL)line=pDoc-lines.GetNext(pos);pDC-TextOut(0,y,line,line.GetLength();/更新y坐标值,让它加上文本行所用字体的高度y+=lHeight;步骤7.单击菜单“编译、执行”运行程序.第26页/共26页

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服