1第十二章文档视图结构中国地质大学信息工程学院林伟华VisualC++前一页休息2本章主要内容文档视图文档模板文档的序列化前一页休息3文档和视图文档类负责保存数据视图类负责显示数据和编辑数据1.文档类virtualBOOLCDocument::OnNewDocument();在MFC使用文档/视图结构创建新文档时,MFC会调用它初始化一个新文档在SDI应用程序中选择File|New命令,应用程序框架利用该函数重新初始化已存在的文档对象,而不是新建立一个文档对象在MDI应用程序中选择File|New命令,框架每次建立一个新的文档对象,然后调用该函数来进行初始化文档视图类CObjectCCmdTargetCDocument前一页休息4文档和视图文档视图类virtualBOOLCDocument::DeleteContent();在MFC使用文档/视图结构创建新文档时,MFC会调用它来删除一个文档所保留的任何数据对象,但并不破坏文档对象本身virtualBOOLCObject::Serialize(Carchive&ar);当用户创建一个新文档或编辑一个已有的文档时,如需要将该文档保存到磁盘上,就调用该函数2.视图类virtualvoidCview::OnDraw(CDC*pDC)=0;在窗口重画时,该函数会被自动调用前一页休息53.文档视图类相互作用voidCDocument::UpdateAllViews(CView*pSender,LPARAMlHint=0L,CObject*pHint=NULL);该函数被调用时,MFC会调用CView::OnUpdate()CDocument*CView::GetDocument()const获得文档对象指针virtualvoidCView::OnUpdate(CView*pSender,LPARAMlHint,CObject*pHint);该函数读取文档数据,触发视图的OnDraw()进行重新绘制窗口virtualvoidCView::OnInitialUpdate();只用来调用OnUpdate()函数文档和视图文档视图类前一页休息6文档和视图4.视图派生类(1)CCtrlView控件视图类CEditViewCListViewCRichEditViewCTreeView(2)CScrollView滚动视类CDaoRecordViewCHtmlViewCOleDBRecordViewCRecordView文档视图类前一页休息7文档模板1.文档模板类CSingleDocTemplate:使用主框架窗口来显示一个文档,每次只能打开一个文档CMultiDocTemplate:用主框架窗口作为工作空间,在其中可以打开单个或多个文档框架窗口,在每个文档窗口中显示一个文档多文档应用程序可支持多种类型的文档,不同类型可在同一时间打开文档模板构成:文档类、框架窗口类、视图类文档模板类前一页休息8文档模板2.文档模板的创建MFC中单文档框架类相互关系文档模板的创建文档类框架窗口类视图类应用程序类文档模板类InitInstance()theApppDocTemplate视图对象文档对象前一页休息9文档模板MFC中多文档框架类相互关系文档模板的创建文档类子框架窗口类视图类应用程序类文档模板类InitInstance()theApppDocTemplateCMainFrameCMDIFrameWndCDocumentCChildFrameCView多文档窗口前一页休息10文档模板3.文档、框架窗口和视图的创建单文档程序在程序运行之初进行上述创建过程一次多文档程序每打开一个文档就会执行这个创建过程,产生对应的三个对象文档模板的创建File/NewFile/OpenCWinApp选择适当的DocumentTemplate构造Document对象构造Frame对象产生Frame窗口读档案构造View对象产生View窗口前一页休息11框架类之间的相互访问1.获取应用程序类对象指针(父类的指针指向派生类对象,如需要经过强制转换即可)CWinApp*AfxGetApp();2.获取主框架窗口类对象指针CMainFrame*pMainFrame;pMainFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd;CMainFrame*pMainFrame;pMainFrame=(CMainFrame*)AfxGetMainWnd();3.获取活动视图类对象指针(由于利用的是CFrameWnd成员函数,故在获取视图对象指针之前,必须获取该视图窗口的外框架窗口指针)CView*CFrameWnd::GetActiveView()const;框架类之间的相互访问前一页休息12框架类之间的相互访问在单文档应用程序中CMainFrame*pMainFrame;pMainFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd;CMyView*pView;pView=(CMyView*)pMainFrame-GetActiveView();在多文档应用程序中CMainFrame*pMainFrame;pMainFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd;CChildFrame*pChildFrame;pChildFrame=(CChildFrame*)pMainFrame-GetActiveFrame();CMyView*pView;pView=(CMyView*)pChildFrame-GetActiveView();框架类之间的相互访问前一页休息13框架类之间的相互访问4.获取活动文档类对象指针(1)在获得活动视图之后,调用视图类的成员函数GetDocument获取视图所属的文档(2)在获取文档的外边框窗口后,使用CFrameWnd::GetActiveDocument()函数框架类之间的相互访问前一页休息14框架类之间的相互访问框架类之间的相互访问在单文档应用程序中CMainFrame*pMainFrame;pMainFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd;CMyDoc*pDoc;pDoc=(CMyDoc*)pMainFrame-GetActiveDocument();在多文档应用程序中CMainFrame*pMainFrame;pMainFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd;CChildFrame*pChildFrame;pChildFrame=(CChildFrame*)pMainFrame-GetActiveFrame();CMyDoc*pDoc;pDoc=(CMyDoc*)pChildFrame-GetActiveDocument();前一页休息15文档的序列化文档对象的序列化是指对象的持续性(对象的保存和恢复),即对象可以将其当前状态写入磁盘中,并可从磁盘中读取对象的状态,重建对象voidCMyDoc::Serialize(CArchive&ar){if(ar.IsStoring()){}else{}}CArchive包含一个CFile类型的文件指针,指向一个文件;并且Carchive对象为读写CFile对象中的可序列化数据提供了一种类型安全的缓冲机制。Data——Serialize——CArchive对象——CFile对象——物理磁盘文档的序列化