《《文档视图框架》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《文档视图框架》PPT课件.ppt(26页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、文档文档/视图框架视图框架基本内容基本内容n n文档文档/视图框架视图框架n n序列化序列化n nCFilen n不适用的情况不适用的情况CCmdTargetCWinThreadCWinAppCWndCFrameWndCObject主要负责初始化、运行和结束应用程序的执行。负责管理操作数据及显示,并接收用户的输入。结论:结论:CFrameWnd派生派生类的负担过重。类的负担过重。一、文档一、文档/视图框架视图框架l也是一种也是一种MVCMVC架构架构ModelDocumentViewViewControllerDocumentTemplatel将数据操作和数据显示、用户界面分离将数据操作和数据
2、显示、用户界面分离l程序每打开一个文件时,创建程序每打开一个文件时,创建3 3个对象:个对象:一个文档对象一个文档对象一个视图对象一个视图对象一个窗口框架对象一个窗口框架对象l由文档模板对象负责管理文档、视图和框架窗由文档模板对象负责管理文档、视图和框架窗体对象。体对象。CDocument:UpdateAllViews()CDocument:Serialize()该函数一般需要在文档子类中重载voidSXXXDoc:Serialize(CArchive&ar)()/向文件中写数据(ar)文档类的常用成员函数文档类的常用成员函数视窗类中的视窗类中的OnDrawOnDraw成员函数成员函数 每次当
3、视窗需要被重新绘制时,应用程序框架就要每次当视窗需要被重新绘制时,应用程序框架就要调用调用OnDraw函数。函数。驱使程序调用驱使程序调用OnDraw的两个途径:的两个途径:用户改变窗口的尺寸;窗口恢复先前被遮盖的部分;用户改变窗口的尺寸;窗口恢复先前被遮盖的部分;应用程序改变了窗口数据;应用程序改变了窗口数据;程序中调用程序中调用Invalidate(或者或者InvalidateRect),),通知通知Windows调用调用OnDraw函数函数常用视图类常用视图类CScrollView:提供自动滚动或缩放功能。提供自动滚动或缩放功能。CFormView:由对话框模板创建,并具有和对话框:由对
4、话框模板创建,并具有和对话框一样的设计方法。一样的设计方法。CRecordView:提供表单视图直接与:提供表单视图直接与ODBC记录集记录集对象关联;和所有的表单视图一样,对象关联;和所有的表单视图一样,CRecordView也是基于对话框模板设计的。也是基于对话框模板设计的。CEditView:提供包含编辑控件的视图:提供包含编辑控件的视图CRichEditView:提供包含复合编辑控件的视图:提供包含复合编辑控件的视图CListView:提供包含列表控件的视图。:提供包含列表控件的视图。CTreeView:提供包含树状控件的视图。:提供包含树状控件的视图。相互引用关系相互引用关系n nC
5、DocumentCDocument 有一个成员变量有一个成员变量 CDocTemplate*CDocTemplate*m_pDocTemplatem_pDocTemplate,用于回指其用于回指其DocumentDocument TemplateTemplate;另有一另有一个成员变量个成员变量 CPtrList m_viewListCPtrList m_viewList,表示它可以同时维护一系表示它可以同时维护一系列的列的 ViewsViews。n nCFrameWndCFrameWnd有一个成员变量有一个成员变量CView*m_pViewActiveCView*m_pViewActive
6、,指向指向目前正作用中的目前正作用中的ViewView。n n亦可用亦可用CFrameWnd:GetActiveView()CFrameWnd:GetActiveView()获得视图对象指针获得视图对象指针n nCFrameWnd:GetActiveDocument()CFrameWnd:GetActiveDocument()获得当前活动的文档对象获得当前活动的文档对象指针。指针。n nCViewCView有一个成员变量有一个成员变量 CDocument*m_pDocumentCDocument*m_pDocument,指向相指向相关的文档关的文档 DocumentDocument。n nCW
7、nd:GetParentFrameCWnd:GetParentFrame可实现从视图类中获取主框架指针。可实现从视图类中获取主框架指针。文档视图相互作用的典型实例文档视图相互作用的典型实例n n切分窗口切分窗口n n静态切分:窗口第一次被创建时,窗格就已静态切分:窗口第一次被创建时,窗格就已静态切分:窗口第一次被创建时,窗格就已静态切分:窗口第一次被创建时,窗格就已经被切分好了。最大窗格数目为经被切分好了。最大窗格数目为经被切分好了。最大窗格数目为经被切分好了。最大窗格数目为1616161616161616。n n动态切分:允许用户在任何时候对窗口进行动态切分:允许用户在任何时候对窗口进行动态
8、切分:允许用户在任何时候对窗口进行动态切分:允许用户在任何时候对窗口进行切分。最大窗格数目为切分。最大窗格数目为切分。最大窗格数目为切分。最大窗格数目为22222222。n n举例:举例:举例:举例:GraphGraphn n一档多视一档多视n n举例:举例:举例:举例:RectRect(1 1)切分窗口类)切分窗口类n nBOOL Create(CWnd*pParentWnd,int nMaxRows,int nMaxCols,SIZE sizeMin,CCreateContext*pContext,DWORD dwStyle=WS_CHILD|WS_VISIBLE|WS_HSCROLL|W
9、S_VSCROLL|SPLS_DYNAMIC_SPLIT,UINT nID=AFX_IDW_PANE_FIRST);n nBOOL CreateStatic(CWnd*pParentWnd,int nRows,int nCols,DWORD dwStyle=WS_CHILD|WS_VISIBLE,UINT nID=AFX_IDW_PANE_FIRST);(2 2)一档多视)一档多视MFCMFC对于对于“一档多视一档多视”提供下列三个模式:提供下列三个模式:1 1)在各自)在各自MDIMDI文档窗口中包含同一个视图类文档窗口中包含同一个视图类的多个视图对象。的多个视图对象。2 2)在同一个文档窗
10、口中包含同一个视图类的)在同一个文档窗口中包含同一个视图类的多个视图对象(即切分窗口运用于多个视图对象(即切分窗口运用于SDISDI)3 3)在单独一个文档窗口中包含不同视图类的)在单独一个文档窗口中包含不同视图类的多个视图对象。(例如,同一个文档可同时多个视图对象。(例如,同一个文档可同时有文字显示方式及图形显示方式的视图)。有文字显示方式及图形显示方式的视图)。二、永久性对象与序列化二、永久性对象与序列化l内存中的对象可以被以文件内存中的对象可以被以文件的形式存储在永久性存储的形式存储在永久性存储介质中,而当应用程序把介质中,而当应用程序把它再从永久性存储介质读它再从永久性存储介质读入后,
11、如果该对象在内存入后,如果该对象在内存中能恢复为原来的状态,中能恢复为原来的状态,那么这种对象就叫做那么这种对象就叫做永久永久性对象性对象。在面向对象理论。在面向对象理论中,能中,能使对象成为永久性使对象成为永久性对象的机制叫做序列化对象的机制叫做序列化 。磁盘磁盘对象在内存中的存储格式转换为文件的格式内存中的对象内存中的对象把文件的格式恢复为内存中的存储格式l所谓永久性对象,就是这种对象具有这样一种能所谓永久性对象,就是这种对象具有这样一种能力:它提供了一套描述自身的信息(例如对象的力:它提供了一套描述自身的信息(例如对象的类名称及数据在内存中的存储格式等)。当应用类名称及数据在内存中的存储
12、格式等)。当应用程序存储对象时,应用程序可以把这些信息与对程序存储对象时,应用程序可以把这些信息与对象的数据成员一起打包形成文件,存入永久性存象的数据成员一起打包形成文件,存入永久性存储体,而当再将它读入内存时,根据该文件中提储体,而当再将它读入内存时,根据该文件中提供的信息,可以把数据按原样组织起来,从而把供的信息,可以把数据按原样组织起来,从而把对象原原本本恢复出来。对象原原本本恢复出来。l使一个类的对象可以是永久性对象,那么在声明使一个类的对象可以是永久性对象,那么在声明这个类的时候必须使用这个类的时候必须使用MFCMFC定义的两个宏:定义的两个宏:DECLARE_SERIALIMPLE
13、MENT_SERIAL序列化序列化1 1、从、从CObjectCObject派生而来,即拥有了派生而来,即拥有了RTTIRTTI,动动态创建等机制态创建等机制2 2、在类声明中必须有、在类声明中必须有DECLARE_SERIALDECLARE_SERIAL宏宏3 3、在类实现中必须有、在类实现中必须有IMPLEMENT_SERIALIMPLEMENT_SERIAL宏宏4 4、重载、重载SerializeSerialize虚函数,使它能够适当的虚函数,使它能够适当的把类别的成员变量写入文件中。把类别的成员变量写入文件中。5 5、该类必须有一个缺省的构造函数。、该类必须有一个缺省的构造函数。对象的
14、序列化对象的序列化例如某类例如某类A为永久化类,如果它声明为:为永久化类,如果它声明为:ClassA:publicCObjectDECLARE_SERIAL(A)/声明了序列化声明了序列化private:intm_X,m_Y;public:A();/缺省的构造函数缺省的构造函数Serialize(CArchive&ar);/重写序列化虚函数重写序列化虚函数;IMPLEMENT_SERIAL(A,CObject,0)/实现序列化实现序列化那么在重写的序列化函数那么在重写的序列化函数Serialize的实现就应该是:的实现就应该是:A:Serialize(CArchive&ar)()/存储数据存储
15、数据arm_X;arm_Y;arm_X;l由由CArchive对象实现序列化工作对象实现序列化工作CArchive对象重载了操作符对象重载了操作符“”对原始数据进行序列化对原始数据进行序列化(BYTE,WORD,LONG,DWORD,float,double,int,unsignedint,short和char)l可序列化对象可序列化对象CString,CTime,CTimeSpan,COleVariant,COleCurreny,COleDateTime,COleDateTimeSpan,CSize,CPoint,CRect,SIZE,POINT和RECT三、CFile类类n n计算机的各种
16、应用程序、文档和各种图形计算机的各种应用程序、文档和各种图形是以文件的形式组织的是以文件的形式组织的n n文件是一块存储区域,可以包含任何以二文件是一块存储区域,可以包含任何以二进制或文本方式记录的信息进制或文本方式记录的信息n nCFile类是类是MFC中文件操作的基类,支持二中文件操作的基类,支持二进制文件,其派生类支持文本文件和内存进制文件,其派生类支持文本文件和内存文件文件n n文件操作一般是在构造函数中打开,在析文件操作一般是在构造函数中打开,在析构函数中关闭构函数中关闭CFile的构造函数lCFile的构造函数有三种类型:的构造函数有三种类型:1.CFile:CFile();仅仅有
17、一个文件句柄,需要手工打开、关闭2.CFile:CFile(inthFile);给出文件句柄,需要手工关闭文件3.CFile:CFile(LPCTSRlPszFileName,UINTnOpenFlags);最完整的构造函数,相当于缺省构造函数加上CFile:Open函数例如:例如:Char*pFileName=“”;CFile(pFileName,CFile:modeCreate|CFile:modeWrite);CFile打开文件的方式打开文件的方式CFile:modeCreate创建方式打开文件,如文件已存在则长度设置为0CFile:modeNoTruncate创建文件时如文件已存在不对
18、其进行截断CFile:modeRead只读方式打开文件CFile:modeReadWrite读写方式打开文件CFile:modeWrite写入方式打开文件CFile:shareCompat在使用过程中允许其他进程同时打开文件CFile:shareDenyNone在使用过程中允许其他进程对文件进行读写CFile:shareDenyRead在使用过程中不允许其他进程对文件进行读取CFile:shareDenyWrite在使用过程中不允许其他进程对文件进行写入CFile:shareExclusive取消对其他进程的所有访问CFile:typeBinary设置文件为二进制模式CFile:typeTex
19、t设置文件为文本模式其它有关函数其它有关函数1.Abort()关闭文件及CFile对象,无视任何警告与错误2.Open()打开文件,若成功返回非零值3.Close()关闭文件,禁止其它的读写操作,关闭后m_hFile的值为NULLl输入输出函数输入输出函数1.Read()将文件中的数据读入缓冲区使用方法:Read(void*lpBuf,UINTncount)2.Write()将缓冲区的内容写到文件当前的位置使用方法:Write(constvoid*lpBuf,UINTnCount)l文件定位函数文件定位函数1.Seek()文件定位函数,使用方法:Seek(LONGlOff,UINTnFrom)
20、2.SeekToBegin()移动文件定位指针到文件头3.SeekToEnd()移动文件定位指针到文件尾4.GetLength()返回DWORD型文件长度5.SetLength()设置文件的长度CFile:beginCFile:beginCFile:currentCFile:currentCFile:endCFile:endBOOLGetStatus(CFileStatus&rStatus)const;staticBOOLPASCALGetStatus(LPCTSTRlpszFileName,CFileStatus&rStatus);structCFileStatusCTimem_ctime;
21、/文件创建的日期和时间CTimem_mtime;/文件最后一次修改的日期和时间CTimem_atime;/文件最后一次访问的日期和时间LONGm_size;/文件大小BYTE m_attribute;/文件属性TCHARm_szFullName_MAX_PATH;/文件名;n 获取文件的有关信息获取文件的有关信息nCFile和和CArchive类之间的关联类之间的关联CFiletheFile;(,CFile:modeWrite);CArchivear(&theFile,CArchive:store);CArchive(CFile*pFile,UINTnMode,intnBufSize=4096,void*lpBuf=NULL);四、不适合情况不适合情况(1 1)不是面向数据的应用或数据量很少的)不是面向数据的应用或数据量很少的应用程序应用程序例如:磁盘扫描程序、时钟程序等。例如:磁盘扫描程序、时钟程序等。(2 2)不使用标准的窗口用户界面的程序)不使用标准的窗口用户界面的程序例如:游戏等。例如:游戏等。
限制150内