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

下载本文档

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

文档简介

第8章文档和视图

8.1文档模板

8.2文档序列化

8.3文档视图结构

8.1文档模板

8.1.1文档模板类

BOOLCEx_SDIApp::InitInstance() { …

CSingleDocTemplate*pDocTemplate;//单文档模板 pDocTemplate=newCSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CEx_SDIDoc), RUNTIME_CLASS(CMainFrame),//mainSDIframewindow RUNTIME_CLASS(CEx_SDIView)); AddDocTemplate(pDocTemplate);

… returnTRUE;}8.1.1文档模板类

BOOLCEx_MDIApp::InitInstance() { …

CMultiDocTemplate*pDocTemplate;//多文档模板 pDocTemplate=newCMultiDocTemplate( IDR_EX_MDITYPE, //资源ID RUNTIME_CLASS(CEx_MDIDoc), //文档类

RUNTIME_CLASS(CChildFrame), //MDI文档窗口类

RUNTIME_CLASS(CEx_MDIView)); //视图类

AddDocTemplate(pDocTemplate); //创建主框架窗口

CMainFrame*pMainFrame=newCMainFrame; if(!pMainFrame->LoadFrame(IDR_MAINFRAME)) returnFALSE; m_pMainWnd=pMainFrame;

… returnTRUE;}8.1.2文档模板字串资源(CDocTemplate有相关成员函数同样可以达到更改效果)

①StringTable资源列表中有一个IDR_MAINFRAME项,用来标识文档类型、标题等内容,称为“文档模板字串资源”

Ex_SDI\n\nEx_SDI\n\n\nExSDI.Document\nEx_SDIDocument②IDR_MAINFRAME标识的字符串分成了一些以“\n”结尾的子串,含义如表。8.2文档序列化

8.2.1文档序列化过程-序列化是将数据从应用程序写入数据文件或从数据文件读入应用程序的过程。序列化在文档/视图结构中完成。8.2.2使用CFile类①文件的打开和关闭

(1)构造一个不带任何参数的CFile对象;(2)调用成员函数Open并指定文件路径以及文件标志。

BOOLOpen(LPCTSTRlpszFileName,UINTnOpenFlags,CFileException*pError=NULL);(3)使用Close关闭一个文件对象,若对象在堆内存中创建,需调用delete来删除它。②文件的读写和定位

(1)

UINTRead(void*lpBuf,UINTnCount);(2)voidWrite(constvoid*lpBuf,UINTnCount);(3)LONGSeek(LONGlOff,UINTnFrom);(4)函数voidSeekToBegin()和DWORDSeekToEnd()③CFile和CArchive类之间的关联(创建CArchive对象有两种方法:通过框架隐式创建CArchive对象显式创建CArchive对象)(1)可以将一个外部磁盘文件和一个CArchive对象关联起来。例如:

CFiletheFile; theFile.Open(...,CFile::modeWrite); CArchivearchive(&theFile,CArchive::store);

*CArchive构造函数的原型如下:

CArchive(CFile*pFile,UINTnMode,intnBufSize=4096,void*lpBuf=NULL);

(2)得到与一个CArchive对象关联的CFile类指针,如下面的代码:

constCFile*fp=ar.GetFile();voidCFileArchiveView::OnTxtRead(){CFilefile("1.txt",CFile::modeRead);CArchivear(&file,CArchive::load);inti;charch;floatf;CStringstr;CStringstrResult;ar>>i>>ch>>f>>str;strResult.Format("%d,%c,%f,%s",i,ch,f,str);MessageBox(strResult);}voidCFileArchiveView::OnTxtSave(){CFilefile("1.txt",CFile::modeCreate|CFile::modeWrite);CArchivear(&file,CArchive::store);inti=4;charch='a';floatf=1.3f;CStringstr("1.txt中的内容");ar<<i<<ch<<f<<str;}例1:编程显式利用CFile和CArchive类进行文件的读写。MFC框架隐式创建CArchive

对象8.2.3文档序列化操作

打开和保存文档时,自动调用Serialize函数。创建文档框架时已在文档类中重载了Serialize函数。

voidCEx_SDIDoc::Serialize(CArchive&ar) { if(ar.IsStoring()) //当文档数据需要存盘时

{ //TODO:addstoringcodehere } else //当文档数据需要读取时

{ //TODO:addloadingcodehere } }

CArchive类对文件数据进行缓存,还保存一个标识文档是存入还是载入内部标记。每次只能有一个活动的存档与ar相连。

CArchive类可以简化文件操作,提供“<<”和“>>”运算符,用于向文件写入简单的数据类型以及从文件中读取它们,如表。

CArchive类提供成员函数ReadString和WriteString从一个文件对象中读写一行文本,原型:

BoolReadString(CString&rString); LPTSTRReadString(LPTSTRlpsz,UINTnMax); voidWriteString(LPCTSTRlpsz);例2:在利用MFC生成的单文档程序中实现文档的读取。(1)用MFCAppWizard创建一个默认的单文档应用程序Ex_SDIArchive。(2)打开StringTable资源,文档模板字串资源IDR_MAINFRAME内容修改:

文档序列化操作\n\n\n自定义文件(*.my)\n.my\nExSDIArchive.Document\nEx_SDIDocument(3)为CEx_SDIArchiveDoc类添加下列成员变量:

public:

CStringm_strData;(4)在CEx_SDIArchiveDoc类OnNewDocument函数中添加下列代码: BOOLCEx_SDIArchiveDoc::OnNewDocument(){…m_strData="这a是一行文本!";returnTRUE;}(5)在CEx_SDIArchiveDoc::Serialize函数中添加下列代码:

voidCEx_SDIArchiveDoc::Serialize(CArchive&ar) { if(ar.IsStoring()) ar.WriteString(m_strData);elsear.ReadString(m_strData);}(6)为CEx_SDIArchiveView类添加下列成员变量:

public:

CStringm_str;(7)在CEx_SDIArchiveView类OnDraw函数中添加下列代码:voidCEx_SDIArchiveView::OnDraw(CDC*pDC){…m_str=pDoc->m_strData;pDC->TextOut(100,50,m_str);}(8)为CEx_SDIArchiveView类OnChar函数中添加下列代码:voidCEx_SDIArchiveView::OnChar(UINTnChar,UINTnRepCnt,UINTnFlags){CMy33Doc*pDoc=GetDocument();if(nChar=='\b')m_str.Delete(m_str.GetLength()-1,1);elsem_str+=(char)nChar;Invalidate();pDoc->m_strData=m_str;pDoc->SetModifiedFlag(1);CView::OnChar(nChar,nRepCnt,nFlags);}8.3文档视图结构

8.3.1文档与视图的相互作用

①CView::GetDocument函数//视图对象包含的GetDocument函数允许应用程序由视图得到与之相关联的文档。GetDocument函数返回的是指向文档的指针。②CDocument::UpdateAllViews函数

voidUpdateAllViews(CView*pSender,LPARAMlHint=0L,CObject*pHint=NULL);

//如果参数pSender指向某个特定的视图对象,那么除了该指定的视图之外,文档的所有其他视图的OnUpdate函数都会被调用。③CView::OnUpdate函数

virtualvoidOnUpdate(CView*pSender,LPARAMlHint=0,CObject*pHint=NULL);//参数pSender表示文档被更改的所关联的视图类指针。

lHint=0,pHint=NULL使得整个窗口矩形无效。④CView::OnInitialUpdate函数

//应用程序被启动时,或“文件”菜单中选择了“新建”或“打开”时,被自动调用。该函数除了调用无提示参数的OnUpdate函数之外,没有其他任何操作。⑤CDocument::OnNewDocument函数

在文档应用程序中,“文件”菜单中选择“新建”命令时,框架将首先构造一个文档对象,然后调用该虚函数。这里是设置文档数据成员初始值的好地方,当然文档数据成员初始化处理还有其他的一些方法。

8.3.2应用程序对象指针的互调①从文档类中获取视图对象指针

virtualPOSITIONGetFirstViewPosition()const; virtualCView*GetNextView(POSITION&rPosition)const;例子:

POSITIONpos=GetFirstViewPosition();

while(pos!=NULL)

{

CView*pView=GetNextView(pos);

........................

}②从视图类中获取文档对象和主框架对象指针 在视图类中获取文档对象指针只需调用视图类中的成员函数GetDocument。函数CWnd::GetParen

温馨提示

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

评论

0/150

提交评论