第8章文档和视图_第1页
第8章文档和视图_第2页
第8章文档和视图_第3页
第8章文档和视图_第4页
第8章文档和视图_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第8章章 文档和视图文档和视图 8.1 8.1 文档模板文档模板 8.2 8.2 文档序列化文档序列化 8.3 8.3 文档视图结构文档视图结构 8.1 文档模板文档模板 8.1.1 文档模板类文档模板类BOOL CEx_SDIApp:InitInstance()CSingleDocTemplate* pDocTemplate; /单文档模板 pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CEx_SDIDoc), RUNTIME_CLASS(CMainFrame), / main SDI frame w

2、indow RUNTIME_CLASS(CEx_SDIView); AddDocTemplate(pDocTemplate);return TRUE; 8.1.1 文档模板类文档模板类BOOL CEx_MDIApp:InitInstance()CMultiDocTemplate* pDocTemplate; /多文档模板pDocTemplate = new CMultiDocTemplate( IDR_EX_MDITYPE,/ 资源ID RUNTIME_CLASS(CEx_MDIDoc),/ 文档类 RUNTIME_CLASS(CChildFrame), / MDI文档窗口类 RUNTIME_

3、CLASS(CEx_MDIView);/ 视图类AddDocTemplate(pDocTemplate);/ 创建主框架窗口CMainFrame* pMainFrame = new CMainFrame;if (!pMainFrame-LoadFrame(IDR_MAINFRAME)return FALSE;m_pMainWnd = pMainFrame;return TRUE; 8.1.2 文档模板字串资源文档模板字串资源(CDocTemplate有相关成员函数同样可以达到更改效果) String Table资源列表中有一个IDR_MAINFRAME项,用来标识文档类型、标题等内容,称为“文

4、档模板字串资源” Ex_SDInnEx_SDInnnExSDI.DocumentnEx_SDI DocumentIDR_MAINFRAME标识的字符串分成了一些以“n”结尾的子串,含义如表。8.2 文档序列化文档序列化 8.2.1 文档序列化过程文档序列化过程序列化是将数据从应用程序写入数据文件或从数据文件读入应用程序的过程。序列化在文档 /视图结构中完成。8.2.2 使用使用CFile类类 文件的打开和关闭文件的打开和关闭 (1)(1)构造一个不带任何参数的CFile对象;(2)(2)调用成员函数Open并指定文件路径以及文件标志。 BOOL Open( LPCTSTR lpszFileNa

5、me,UINT nOpenFlags,CFileException* pError = NULL ); ( (3)3)使用Close关闭一个文件对象,若对象在堆内存中创建,需调用delete来删除它。 文件的读写和定位文件的读写和定位 (1) UINT Read( void* lpBuf, UINT nCount );(2)void Write( const void* lpBuf, UINT nCount );(3)LONG Seek( LONG lOff, UINT nFrom );(4)函数void SeekToBegin( )和DWORD SeekToEnd( )CFile和和CArc

6、hive类之间的关联类之间的关联(创建 CArchive 对象有两种方法:通过框架隐式创建 CArchive 对象 显式创建 CArchive 对象 )(1)可以将一个外部磁盘文件和一个CArchive 对象关联起来。例如:CFile theFile;theFile.Open(., CFile:modeWrite);CArchive archive(&theFile, CArchive:store); *CArchive构造函数的原型如下:CArchive( CFile* pFile, UINT nMode, int nBufSize = 4096, void* lpBuf = NULL );

7、 (2)得到与一个CArchive 对象关联的CFile类指针,如下面的代码: const CFile* fp = ar.GetFile(); void CFileArchiveView:OnTxtRead() CFile file(1.txt,CFile:modeRead); CArchive ar(&file,CArchive:load); int i; char ch; float f; CString str; CString strResult; arichfstr; strResult.Format(%d,%c,%f,%s,i,ch,f,str); MessageBox(strRe

8、sult); void CFileArchiveView:OnTxtSave() CFile file(1.txt,CFile:modeCreate | CFile:modeWrite); CArchive ar(&file,CArchive:store); int i=4; char ch=a; float f=1.3f; CString str( 1.txt 中的内容); arichfstr; 例例1:编程显式利用利用CFile和CArchive类进行文件的读写。MFC框架框架隐式隐式创建创建 CArchive 对象对象 8.2.3 文档序列化操作文档序列化操作 打开和保存文档时,自动调用

9、Serialize函数。创建文档框架时已在文档类中重载了Serialize函数。void CEx_SDIDoc:Serialize(CArchive& ar)if (ar.IsStoring()/ 当文档数据需要存盘时/ TODO: add storing code hereelse/ 当文档数据需要读取时/ TODO: add loading code here CArchive类对文件数据进行缓存,还保存一个标识文档是存入还是载入内部标记。每次只能有一个活动的存档与ar相连。 CArchive类可以简化文件操作,提供“”运算符,用于向文件写入简单的数据类型以及从文件中读取它们,如表。 CA

10、rchive类提供成员函数ReadString和WriteString从一个文件对象中读写一行文本,原型:Bool ReadString(CString& rString );LPTSTR ReadString( LPTSTR lpsz, UINT nMax );void WriteString( LPCTSTR lpsz ); 例例2 2:在利用MFC生成的单文档程序中实现文档的读取。(1)用MFC AppWizard创建一个默认的单文档应用程序Ex_SDIArchive。(2)打开String Table资源,文档模板字串资源IDR_MAINFRAME内容修改: 文档序列化操作nnn自定义

11、文件(*.my)n.my nExSDIArchive.DocumentnEx_SDI Document(3)为CEx_SDIArchiveDoc类添加下列成员变量:public: CString m_strData;(4)在CEx_SDIArchiveDoc类OnNewDocument函数中添加下列代码:BOOL CEx_SDIArchiveDoc:OnNewDocument() m_strData=这a是一行文本!; return TRUE; (5)在CEx_SDIArchiveDoc:Serialize函数中添加下列代码:void CEx_SDIArchiveDoc:Serialize(C

12、Archive& ar)if (ar.IsStoring()ar.WriteString(m_strData); else ar.ReadString(m_strData); (6)为CEx_SDIArchiveView类添加下列成员变量:public: CString m_str;(7)在CEx_SDIArchiveView类OnDraw函数中添加下列代码: void CEx_SDIArchiveView :OnDraw(CDC* pDC) m_str=pDoc-m_strData; pDC-TextOut(100,50,m_str); (8)为为CEx_SDIArchiveView类类On

13、Char函数中添加下列代码:函数中添加下列代码:void void CEx_SDIArchiveView CEx_SDIArchiveView :OnChar(UINT nChar, UINT nRepCnt, UINT nFlags):OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) CMy33Doc *pDoc=GetDocument(); if(nChar=b) m_str.Delete(m_str.GetLength()-1,1); else m_str+=(char)nChar; Invalidate(); pDoc-m_strData=m_

14、str; pDoc-SetModifiedFlag(1); CView:OnChar(nChar, nRepCnt, nFlags); 8.3 文档视图结构文档视图结构 8.3.1 文档与视图的相互作用文档与视图的相互作用 CView:GetDocument函数函数/视图对象包含的GetDocument函数允许应用程序由视图得到与之相关联的文档。GetDocument函数返回的是指向文档的指针。CDocument:UpdateAllViews函数函数 void UpdateAllViews( CView* pSender, LPARAM lHint = 0L, CObject* pHint =

15、 NULL ); /如果参数pSender指向某个特定的视图对象,那么除了该指定的视图之外,文档的所有其他视图的OnUpdate函数都会被调用。CView:OnUpdate函数函数 virtual void OnUpdate( CViewvirtual void OnUpdate( CView* * pSender, LPARAM, LPARAM lHint0, CObject, CObject* * pHintNULL ); ); /参数pSender表示文档被更改的所关联的视图类指针。 lHint=0,pHint=NULL使得整个窗口矩形无效。CView:OnInitialUpdate函数

16、函数 /应用程序被启动时,或“文件”菜单中选择了“新建”或“打开”时,被自动调用。该函数除了调用无提示参数的OnUpdate函数之外,没有其他任何操作。CDocument:OnNewDocument函数函数 在文档应用程序中,“文件”菜单中选择“新建”命令时,框架将首先构造一个文档对象,然后调用该虚函数。这里是设置文档数据成员初始值的好地方,当然文档数据成员初始化处理还有其他的一些方法。 8.3.2 应用程序对象指针的互调应用程序对象指针的互调 从文档类中获取视图对象指针从文档类中获取视图对象指针 virtual POSITION GetFirstViewPosition( ) const;v

17、irtual POSITION GetFirstViewPosition( ) const;virtual CViewvirtual CView* * GetNextView( POSITION& GetNextView( POSITION& rPosition ) const; ) const;例子: POSITION pos = GetFirstViewPosition(); while (pos != NULL) CView* pView = GetNextView(pos); . 从视图类中获取文档对象和主框架对象指针从视图类中获取文档对象和主框架对象指针在视图类中获取文档对象指针只需

18、调用视图类中的成员函数GetDocumentGetDocument。 函数CWnd:GetParentFrame可实现从视图类中获取主框架指针,原型:CFrameWndCFrameWnd* * GetParentFrame( ) const; GetParentFrame( ) const; /该函数将获得父框架窗口指针,它在父窗口链中搜索,直到一个CFrameWnd(或其派生类)被找到为止。成功时返回一个CFrameWnd指针,否则返回NULL。 在主框架类中获取视图对象指针在主框架类中获取视图对象指针 (1)对单文档程序,只需调用CFrameWnd类的GetActiveView成员函数,原型:CView* GetActiveView( ) const; 在多文档应用程序中获取活动视图对象指针的正确方法是:先获得多文档应用程序的活动文档窗

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论