




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 养猪场租赁合同
- 林地承包合同模板
- 中亚股合同样本
- 餐饮技术入股合同协议书
- 业主出行收租合同标准文本
- 个人抵押贷款合同样本
- 2024年二月专卖店虚拟试衣间体型数据存储周期协议
- 小学一年级下册心理健康教育教案
- 名师工作室考核方案-基本要求
- 光伏分期合同样本
- 2025-2030全球藻源虾青素行业调研及趋势分析报告
- 2025年广东深圳市慢性病防治中心选聘专业技术人员3人历年高频重点提升(共500题)附带答案详解
- 新生儿感染的个案护理
- 国省道公路标志标线维护方案投标文件(技术方案)
- 面具的设计制作课件
- 病历书写规范细则(2024年版)
- 《国内手语翻译人才供求现状调研报告》
- 2023年西藏初中生物学业水平考试卷试题真题(含答案解析)
- 人教版八年级下册地理2024-2025学年八年级下册地理期末综合测试卷(二)(含答案)
- 护理学科建设规划
- 环境监测知识培训
评论
0/150
提交评论