您好,欢迎访问三七文档
文档/视图框架基本内容文档/视图框架序列化CFile不适用的情况CCmdTargetCWinThreadCWinAppCWndCFrameWndCObject主要负责初始化、运行和结束应用程序的执行。负责管理操作数据及显示,并接收用户的输入。结论:CFrameWnd派生类的负担过重。一、文档/视图框架也是一种MVC架构Model——DocumentView——ViewController——DocumentTemplate将数据操作和数据显示、用户界面分离程序每打开一个文件时,创建3个对象:一个文档对象一个视图对象一个窗口框架对象由文档模板对象负责管理文档、视图和框架窗体对象。CDocument::UpdateAllViews(…)CDocument::Serialize()该函数一般需要在文档子类中重载voidSXXXDoc::Serialize(CArchive&ar){if(ar.IsStoring()){//向文件中写数据(ar)}else{//从文件中读数据(ar)}}文档类的常用成员函数视窗类中的OnDraw成员函数每次当视窗需要被重新绘制时,应用程序框架就要调用OnDraw函数。驱使程序调用OnDraw的两个途径:用户改变窗口的尺寸;窗口恢复先前被遮盖的部分;应用程序改变了窗口数据;程序中调用Invalidate(或者InvalidateRect),通知Windows调用OnDraw函数常用视图类CScrollView:提供自动滚动或缩放功能。CFormView:由对话框模板创建,并具有和对话框一样的设计方法。CRecordView:提供表单视图直接与ODBC记录集对象关联;和所有的表单视图一样,CRecordView也是基于对话框模板设计的。CEditView:提供包含编辑控件的视图CRichEditView:提供包含复合编辑控件的视图CListView:提供包含列表控件的视图。CTreeView:提供包含树状控件的视图。相互引用关系CDocument有一个成员变量CDocTemplate*m_pDocTemplate,用于回指其DocumentTemplate;另有一个成员变量CPtrListm_viewList,表示它可以同时维护一系列的Views。CFrameWnd有一个成员变量CView*m_pViewActive,指向目前正作用中的View。亦可用CFrameWnd::GetActiveView()获得视图对象指针CFrameWnd::GetActiveDocument()获得当前活动的文档对象指针。CView有一个成员变量CDocument*m_pDocument,指向相关的文档Document。CWnd::GetParentFrame可实现从视图类中获取主框架指针。文档视图相互作用的典型实例切分窗口静态切分:窗口第一次被创建时,窗格就已经被切分好了。最大窗格数目为16×16。动态切分:允许用户在任何时候对窗口进行切分。最大窗格数目为2×2。举例:Graph一档多视举例:Rect(1)切分窗口类BOOLCreate(CWnd*pParentWnd,intnMaxRows,intnMaxCols,SIZEsizeMin,CCreateContext*pContext,DWORDdwStyle=WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|SPLS_DYNAMIC_SPLIT,UINTnID=AFX_IDW_PANE_FIRST);BOOLCreateStatic(CWnd*pParentWnd,intnRows,intnCols,DWORDdwStyle=WS_CHILD|WS_VISIBLE,UINTnID=AFX_IDW_PANE_FIRST);(2)一档多视MFC对于“一档多视”提供下列三个模式:1)在各自MDI文档窗口中包含同一个视图类的多个视图对象。2)在同一个文档窗口中包含同一个视图类的多个视图对象(即切分窗口运用于SDI)3)在单独一个文档窗口中包含不同视图类的多个视图对象。(例如,同一个文档可同时有文字显示方式及图形显示方式的视图)。二、永久性对象与序列化内存中的对象可以被以文件的形式存储在永久性存储介质中,而当应用程序把它再从永久性存储介质读入后,如果该对象在内存中能恢复为原来的状态,那么这种对象就叫做永久性对象。在面向对象理论中,能使对象成为永久性对象的机制叫做序列化。磁盘对象在内存中的存储格式转换为文件的格式内存中的对象把文件的格式恢复为内存中的存储格式所谓永久性对象,就是这种对象具有这样一种能力:它提供了一套描述自身的信息(例如对象的类名称及数据在内存中的存储格式等)。当应用程序存储对象时,应用程序可以把这些信息与对象的数据成员一起打包形成文件,存入永久性存储体,而当再将它读入内存时,根据该文件中提供的信息,可以把数据按原样组织起来,从而把对象原原本本恢复出来。使一个类的对象可以是永久性对象,那么在声明这个类的时候必须使用MFC定义的两个宏:DECLARE_SERIALIMPLEMENT_SERIAL序列化1、从CObject派生而来,即拥有了RTTI,动态创建等机制2、在类声明中必须有DECLARE_SERIAL宏3、在类实现中必须有IMPLEMENT_SERIAL宏4、重载Serialize虚函数,使它能够适当的把类别的成员变量写入文件中。5、该类必须有一个缺省的构造函数。对象的序列化例如某类A为永久化类,如果它声明为:ClassA:publicCObject{DECLARE_SERIAL(A)//声明了序列化private:intm_X,m_Y;…public:A();//缺省的构造函数Serialize(CArchive&ar);//重写序列化虚函数};IMPLEMENT_SERIAL(A,CObject,0)//实现序列化那么在重写的序列化函数Serialize的实现就应该是:A::Serialize(CArchive&ar){if(ar.IsStoring())//存储数据{arm_X;arm_Y;}else//读取数据{arm_Y;arm_X;}}由CArchive对象实现序列化工作–CArchive对象重载了操作符“”和“”–对原始数据进行序列化(BYTE,WORD,LONG,DWORD,float,double,int,unsignedint,short和char)可序列化对象–CString,CTime,CTimeSpan,COleVariant,COleCurreny,COleDateTime,COleDateTimeSpan,CSize,CPoint,CRect,SIZE,POINT和RECT三、CFile类计算机的各种应用程序、文档和各种图形是以文件的形式组织的文件是一块存储区域,可以包含任何以二进制或文本方式记录的信息CFile类是MFC中文件操作的基类,支持二进制文件,其派生类支持文本文件和内存文件文件操作一般是在构造函数中打开,在析构函数中关闭CFile的构造函数CFile的构造函数有三种类型:1.CFile::CFile();-仅仅有一个文件句柄,需要手工打开、关闭2.CFile::CFile(inthFile);-给出文件句柄,需要手工关闭文件3.CFile::CFile(LPCTSRlPszFileName,UINTnOpenFlags);-最完整的构造函数,相当于缺省构造函数加上CFile::Open函数例如:Char*pFileName=“test.dat”;CFile(pFileName,CFile::modeCreate|CFile::modeWrite);CFile打开文件的方式CFile::modeCreate创建方式打开文件,如文件已存在则长度设置为0CFile::modeNoTruncate创建文件时如文件已存在不对其进行截断CFile::modeRead只读方式打开文件CFile::modeReadWrite读写方式打开文件CFile::modeWrite写入方式打开文件CFile::shareCompat在使用过程中允许其他进程同时打开文件CFile::shareDenyNone在使用过程中允许其他进程对文件进行读写CFile::shareDenyRead在使用过程中不允许其他进程对文件进行读取CFile::shareDenyWrite在使用过程中不允许其他进程对文件进行写入CFile::shareExclusive取消对其他进程的所有访问CFile::typeBinary设置文件为二进制模式CFile::typeText设置文件为文本模式其它有关函数1.Abort()-关闭文件及CFile对象,无视任何警告与错误2.Open()-打开文件,若成功返回非零值3.Close()-关闭文件,禁止其它的读写操作,关闭后m_hFile的值为NULL输入输出函数1.Read()-将文件中的数据读入缓冲区使用方法:Read(void*lpBuf,UINTncount)2.Write()-将缓冲区的内容写到文件当前的位置使用方法:Write(constvoid*lpBuf,UINTnCount)文件定位函数1.Seek()-文件定位函数,使用方法:Seek(LONGlOff,UINTnFrom)2.SeekToBegin()-移动文件定位指针到文件头3.SeekToEnd()-移动文件定位指针到文件尾4.GetLength()-返回DWORD型文件长度5.SetLength()-设置文件的长度CFile::beginCFile::currentCFile::endBOOLGetStatus(CFileStatus&rStatus)const;staticBOOLPASCALGetStatus(LPCTSTRlpszFileName,CFileStatus&rStatus);structCFileStatus{CTimem_ctime;//文件创建的日期和时间CTimem_mtime;//文件最后一次修改的日期和时间CTimem_atime;//文件最后一次访问的日期和时间LONGm_size;//文件大小BYTEm_attribute;//文件属性TCHARm_szFullName[_MAX_PATH];//文件名};获取文件的有关信息CFile和CArchive类之间的关联CFiletheFile;theFile.Open(…,CFile::modeWrite);CArchivear(&theFile,CArchive::store);CArchive(CFile*pFile,UINTnMode,intnBufSize=4096,void*lpBuf=NULL);四、不适合情况(1)不是面向数据的应用或数据量很少的应用程序例如:磁盘扫描程序、时钟程序等。(2)不使用标准的窗口用户界面的程序例如:游戏等。
本文标题:5、文档视图框架
链接地址:https://www.777doc.com/doc-3096893 .html