文档与视图结构_第1页
文档与视图结构_第2页
文档与视图结构_第3页
文档与视图结构_第4页
文档与视图结构_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1、 第第5 5章章 文档与视图结构文档与视图结构 了解文档了解文档/ /视图结构视图结构 掌握在视中显示数据方法掌握在视中显示数据方法 利用利用CFileCFile类对文档数据的存储和装入类对文档数据的存储和装入 利用串行化对文档数据的存储和装入利用串行化对文档数据的存储和装入教学目标Visual C+Visual C+程序设计电子教案程序设计电子教案-王明福编王明福编 教学内容 程序演示文档与视图的概念 单文档应用程序(SDI) 文档的存储和装入 添加串行化功能 5.1 5.1 学生档案管理程序 返回目录返回目录v 程序运行结果v 程序运行演示 学生档案管理程序(续) 返返 回回三大功能:1.

2、数据记录的录入 2.文档数据的存储和装入 3.数据记录的浏览功能分解:1.创建一个单文档学生档案管理应用程序,具有录入、浏览功能; 2.改进MySdi程序,利用CFile类,添加文档数据存储和装入功能; 3.改进MySdi程序,利用CArchive类,添加串行化存储和装入功能; 5.2 5.2 文档与视图的概念 5.2.1 5.2.1 文档文档5.2.2 5.2.2 视图视图 5.2.3 5.2.3 文档与视图的关系文档与视图的关系 5.2.4 5.2.4 文档与视图的交互过程文档与视图的交互过程 返回目录返回目录要点提示: 文档 返回目录返回目录 文档类继承于文档类继承于CDocumentC

3、Document类类,它描述了应用的它描述了应用的数据。抽象地说,文档是一个应用程序数据基本数据。抽象地说,文档是一个应用程序数据基本元素的集合,它构成应用程序所使用的数据单元,元素的集合,它构成应用程序所使用的数据单元,文档负责管理和维护应用的数据。文档负责管理和维护应用的数据。 具体一点来说,文档是一种数据源,数据源有具体一点来说,文档是一种数据源,数据源有很多种,最常见的是磁盘文件,但是文档不必非很多种,最常见的是磁盘文件,但是文档不必非要是一个磁盘文件,文档的数据源也可以来自串要是一个磁盘文件,文档的数据源也可以来自串行口或并行口的输入数据。文档对象负责来自所行口或并行口的输入数据。文

4、档对象负责来自所有数据源的数据的管理。有数据源的数据的管理。 视图返回目录返回目录 视图类则继承于视类CView,它是一个基于视类的窗口。 视图是数据的用户窗口,为用户提供了文档的可视的数据显示,它把文档的部分或全部内容在窗口中显示出来,视图给用户提供了一个同文件中的数据进行交互的界面,它把用户的输入转化为对文档中数据的操作。 文档与视图的关系 返回目录返回目录 文档用来保存数据,视图用来显示数据,视图是显示出的文档。一个文档可以有多个不同的视图。文档与视图的关系,可用下图来描述。 文档与视图的交互过程 返回目录返回目录 1 1CViewCView类的类的GetDocumentGetDocum

5、ent()()函数函数 视图类CViewCView的GetDocumentGetDocument()()函数返回的是一个CDocument或其派生类的指针。可用得到的文档指针来访问文档中的数据。 从而在视图类中,实现文档类的数据与视图类的数据进行交换。 2. 2. CDocumentCDocument类的类的UpdateAllViewsUpdateAllViews()()函数函数 当文档的数据发生了变化后,文档也要通知视图当前的变化,以让视图能够及时更新,忠于文档的数据 。 这 样 的 一 件 工 作 是 通 过 文 档 类 中 的UpdateAllViewsUpdateAllViews()(

6、)函数来实现的。 5.3 5.3 单文档应用程序(SDI) 5.3.1 创建工程 5.3.2 可视化设计 5.3.3 给文档类添加成员变量 5.3.4 给视图类添加成员变量5.3.5 变量初始化 5.3.6 处理数据记录的录入 5.3.8 技术要点返回目录返回目录要点提示: 创建工程返回目录返回目录在创建工程时,应注意以下两点:1. 在“MFC AppWizard-Step 1”对话框中,选择“Single Document”,创建一个基于单文档界面的应用程序 ;2. 在“MFC AppWizard-Step 6 of 6”对话框,如图5-5所示。其中显示MFC AppWizard为应用程创建

7、的所有类以及各个类对应的基类和相应的文件,选取CFormView作为视图基类(可以在主窗口内添加控件),其余接受缺省设置。选取CFormView作为视图基类 可视化设计返回目录返回目录 表5-1 对话框IDD_MYSDI_FORM中各控件的属性表对象属性属性值对象属性属性值Static TextIDCaptionIDC_STATIC姓名:Edit BoxIDIDC_EDIT_NAMEIDC_STATIC性别:Edit BoxIDIDC_EDIT_SEXIDC_STATIC年龄:Edit BoxIDIDC_EDIT_AGEIDC_STATIC电话: Edit BoxIDIDC_EDIT_TELI

8、DC_STATIC学号: Combo BoxIDTypeIDC_COMBODropdownIDC_STATIC生源简介:Edit BoxIDMultilineIDC_EDIT_SCHOOLChecked 表5-1 对话框IDD_MYSDI_FORM中各控件的属性表 可视化设计(续)返返 回回 表5-1 对话框IDD_MYSDI_FORM中各控件的属性表根据表5-1中的定义编辑对话框资源,设计完毕对话框如下图所示。 给文档类添加成员变量返回目录返回目录为了将程序的数据存储到文件中,或者从将文件中的数据装入。换句话说,文挡类中的数据就是要操作的对象,我们必须将其定义为文档类的数据成员。class

9、CMySdiDoc : public CDocumentprotected: / create from serialization onlyCMySdiDoc();DECLARE_DYNCREATE(CMySdiDoc) public: structstruct char name10char name10,sex3;sex3;int int age;age;char char teltel1414,school30;school30;m_student40;m_student40; ; 给视图类添加成员变量返回目录返回目录 视图类是负责屏幕的显示内容。在此,要加入的视图类数据成员实际上就是

10、文档类的数据成员在屏幕上的映射。而将视图类中的变量显示在屏幕上最简捷的方法是:将变量与某编辑控件关联,即为IDD_MYSDI_FORM对话框中编辑框引入变量。如下图5所示。 处理数据记录的录入1 1添加消息响应函数添加消息响应函数 返回目录返回目录 实现数据记录的编辑,就是处理编辑框的EN_CHANGE事件,即 为编辑框的EN_CHANGE事件添加响应函数; 在消息响应函数中,编写将编辑的数据传送给文档类对应的变量控件ID 事件(消息) 消息函数 说明 IDC_COMBO CBN_SELCHANGE OnSelchangeCombo 选择学号的组合框 IDC_EDIT_NAME EN_CHAN

11、GE OnChangeEditName 编辑与显示姓名 IDC_AGE EN_CHANGEOnChangeEditAge 编辑与显示年龄 IDC_EDIT_SCHOOLEN_CHANGEOnChangeEditSchool 编辑与显示原毕学校 IDC_EDIT_SEX EN_CHANGEOnChangeEditSex编辑与显示性别IDC_EDIT_TEL EN_CHANGEOnChangeEditTel编辑与显示电话号码 处理数据记录的录入(续一)2. 为为OnChangeEditNameOnChangeEditName函数函数编写程序代码编写程序代码返返 回回void CMySdiView:

12、OnChangeEditName() CMySdiDoc *pDoc = GetDocument();/获取指向文档类对象指针 UpdateData(true);/用控件的值去更新与之关联变量 if(strcmp( pDoc-m_studentm_nCurrentN,m_name) strcpy( pDoc-m_studentm_nCurrentN,m_name); pDoc-SetModifiedFlag();/设置数据修改标志 处理数据记录的录入(续二)3. 为为OnChangeEditAge函数函数编写程序代码编写程序代码返返 回回void CMySdiView:

13、OnChangeEditAge() CMySdiDoc *pDoc = GetDocument();UpdateData(true);if( pDoc-m_studentm_nCurrentNo.age != m_age) pDoc-m_studentm_nCurrentNo.age=m_age; pDoc-SetModifiedFlag(); 处理数据记录的录入(续三)4. 为为OnChangeEditSchool函数函数编写程序代码编写程序代码返返 回回void CMySdiView:OnChangeEditSchool() CMySdiDoc *pDoc = GetDocument();

14、 UpdateData(true); if(strcmp( pDoc-m_studentm_nCurrentNo.school,m_school) strcpy( pDoc-m_studentm_nCurrentNo.school,m_school); pDoc-SetModifiedFlag(); 处理数据记录的录入(续四)5. 为为OnChangeEditSex函数函数编写程序代码编写程序代码返返 回回void CMySdiView:OnChangeEditSex() CMySdiDoc *pDoc = GetDocument();UpdateData(true);if(strcmp( p

15、Doc-m_studentm_nCurrentNo.sex,m_sex) strcpy( pDoc-m_studentm_nCurrentNo.sex,m_sex); pDoc-SetModifiedFlag(); 处理数据记录的录入(续五)6. 为为OnChangeEditTel函数函数编写程序代码编写程序代码返返 回回void CMySdiView:OnChangeEditTel() CMySdiDoc *pDoc = GetDocument();UpdateData(true);if(strcmp( pDoc-m_studentm_nCurrentNo.tel,m_tel) strcpy

16、( pDoc-m_studentm_nCurrentNo.tel,m_tel); pDoc-SetModifiedFlag(); 处理数据记录的录入(续六)7. 为为OnSelchangeCombo函数函数编写程序代码编写程序代码返返 回回void CMySdiView:OnSelchangeCombo() CMySdiDoc *pDoc = GetDocument();m_nCurrentNo = m_noList.GetCurSel();m_name = pDoc-m_studentm_nCurrentN;m_age = pDoc-m_studentm_nCurrentNo.a

17、ge;m_school=pDoc-m_studentm_nCurrentNo.school;m_sex =pDoc-m_studentm_nCurrentNo.sex;m_tel =pDoc-m_studentm_nCurrentNo.tel;UpdateData(false); 处理数据记录的录入(续六)7. 为为OnSelchangeCombo函数函数编写程序代码编写程序代码返返 回回void CMySdiView:OnSelchangeCombo() CMySdiDoc *pDoc = GetDocument();m_nCurrentNo = m_noList.GetCurSel();m

18、_name = pDoc-m_studentm_nCurrentN;m_age = pDoc-m_studentm_nCurrentNo.age;m_school=pDoc-m_studentm_nCurrentNo.school;m_sex =pDoc-m_studentm_nCurrentNo.sex;m_tel =pDoc-m_studentm_nCurrentNo.tel;UpdateData(false); 技术要点技术要点组合框组合框返回目录返回目录 组合框可以看作是一个编辑框或静态文本框与一个列表框组合。当组合框可以看作是一个编辑框或静态文本框与一个列表框组合。当前选

19、定的项将显示在组合框的编辑框或静态文本框中,如果组合框具有下前选定的项将显示在组合框的编辑框或静态文本框中,如果组合框具有下拉列表(拉列表(drop-down listdrop-down list)样式,则用户可以在编辑框架中键入列表框中样式,则用户可以在编辑框架中键入列表框中某一项的首字母,在列表框可见时,与该字母相匹配的最近的项将被加亮某一项的首字母,在列表框可见时,与该字母相匹配的最近的项将被加亮显示。显示。Combo BoxCombo Box控件与控件与CComboBoxCComboBox类关联。类关联。CComboBoxCComboBox类常见的成员函数类常见的成员函数如下表所示。如

20、下表所示。 函 数说 明GetCount获得组合框中列表框项的数目GetCurSel返回组合框中列表框的当前选定项的索引SetCurSel设置组合框中列表框的一个字符串DeleteString从组合框的列表框中删除一个字符串InsertString向组合框的列表框中插入一个字符串AddString向组合框的列表框中添加一个字符串SelectString在组合框的列表框中查找字符串,如果找到,在列表框中选择该字符串,并复制到编辑框控件中 5.45.4文档的存储和装入文档的存储和装入 5.4.1 5.4.1 利用利用CFileCFile类操作文件类操作文件 5.4.2 5.4.2 工具栏的可视化设

21、计工具栏的可视化设计( (略略) ) 5.4.3 5.4.3 为为“打开打开”按钮编写代码按钮编写代码 5.4.4 5.4.4 为为“另存为另存为”按钮编写代按钮编写代码码返回目录返回目录要点提示: 利用利用CFileCFile类操作文件类操作文件知识要点:知识要点: 返回目录返回目录利用CFile类操作文件的步骤如下: 创建CFile类对象: CFile f; 打开文件: f.Open() 读/写文件: f.Read()/f.Write() 关闭文件: f.close() CFileCFile类介绍类介绍返回目录返回目录 CFile是MFC文件类的基类,它直接提供二进制文件的输入/输出操作,

22、并通过派生类支持文本文件和内存文件。该类与其派生类的层次关系让程序通过各种CFile接口使各种文件操作一致化。不论是内存文件、磁盘文件、二进制文件,还是文本文件都可以使用几乎相同的函数来操作,使程序更简单。CFile类的主要成员函数如下表所示。 成员函数 功 能 成员函数 功 能 Open打开磁盘文件 Read从打开的文件中读取数据Close关闭打开的文件Write将数据存储在打开的文件中Seek文件指针定位 GetLength 获取文件长度信息Remove删除指定的文件Rename 更改指定文件名 SetStatus设置文件状态信息 GetStatus获取文件状态信息 文件打开文件打开/ /

23、关闭(关闭(Open/Close)Open/Close) 返返 回回1. 1. CFileCFile类一般通过成员函数类一般通过成员函数OpenOpen来打开文件来打开文件 BOOL Open(LPCTSTR lpzsFileName,UINT nOpenFlag); 其中:lpzsFileName:为欲打开的文件名,可包含路经名;nOpenFlag: 用于设置访问模式,例如:Cfile f;f.Open(“D:My.TXT”, CFile:modeRead);表示以读方式打开“D:My.TXT”文件。2. 2. 关闭文件函数关闭文件函数CloseClose Close()函数用于关闭由Ope

24、n()函数打开的文件。例如 f.Close(); 文件的读写文件的读写( (Read/Write)Read/Write)返返 回回1. CFile类提供了Read()函数用于读入文件 UINT Read(void *lpBuf,UINT nCount) Read()函数返回值是传输到缓冲区的字节数。2. CFile类提供了Write()函数用于写入文件 void Write(void *lpBuf,UINT nCount) ; Write()函数的参数与Read()函数的参数类似。 文件的读写文件的读写( (Read/Write)Read/Write)返返 回回1. CFile类提供了Read

25、()函数用于读入文件 UINT Read(void *lpBuf,UINT nCount) Read()函数返回值是传输到缓冲区的字节数。2. CFile类提供了Write()函数用于写入文件 void Write(void *lpBuf,UINT nCount) ; Write()函数的参数与Read()函数的参数类似。 文件操作举例文件操作举例文件复制文件复制返回目录返回目录void MyCopy(CString strSource, CString strTarget) CFile fs, ft; STUDENT s; int nCount; if( !fs.Open(strSource

26、, CFile:modeRead) ) MessageBox(“Open Source File Fail !”);return; if( !ft.Open(strTarget, CFile:modeRead) ) MessageBox(“Open File Fail !”);fs.Close();return; nCount = fs.Read(&s, sizeof(STUDENT); while( nCount ) ft.Write(&s, sizeof(STUDENT); nCount = fs.Read(&s, sizeof(STUDENT); fs.Close(); ft.Close

27、(); 为为“打开打开”按钮编写代按钮编写代码码返回目录返回目录void CMySdiView:OnFileMyopen() CString strFilter = Dat Files (*.dat)|*.dat|All Files (*.*)|*.*|; /启动通用文件对话框,选择文件名CFileDialog FileDlg(true, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,(LPCSTR)strFilter, this);if (FileDlg.DoModal() != IDOK)return;CString strFileNam

28、e = FileDlg.GetPathName();/打开文件 CFile f; if(!f.Open(strFileName,CFile:modeRead)AfxMessageBox(打开文件失败);return; (转下页) 为为“打开打开”按钮编写代码按钮编写代码( (续续) )返返 回回/读出文件中的数据,存放到文档类的数据成员中 CMySdiDoc *pDoc = GetDocument(); f.Read(&m_nCurrentNo,sizeof(int);for(int i=0;im_,10);f.Read(pDoc-m_studenti.sex,3);

29、f.Read(&(pDoc-m_studenti.age),sizeof(int);f.Read(pDoc-m_studenti.tel,14);f.Read(pDoc-m_studenti.school,50); f.Close();/将文档类的数据传递给视类数据成员,并显示m_noList.SetCurSel(m_nCurrentNo); m_name = pDoc-m_studentm_nCurrentN;m_age = pDoc-m_studentm_nCurrentNo.age;m_school=pDoc-m_studentm_nCurrentNo.school;m_se

30、x =pDoc-m_studentm_nCurrentNo.sex;m_tel =pDoc-m_studentm_nCurrentNo.tel; UpdateData(false); (接上页)void CMySdiView:OnFileMysave() CFileDialog FileDlg(false, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,(LPCSTR)strFilter, this);if (FileDlg.DoModal() != IDOK)return; 启动通用文件对话框CString strFileName = Fi

31、leDlg.GetPathName();CFile f; /打开文件f.Open(strFileName,CFile:modeCreate|CFile:modeWrite); CMySdiDoc *pDoc = GetDocument(); /写文件,存储数据f.Write(&m_nCurrentNo,sizeof(int);for(int i=0;im_,10);f.Write(pDoc-m_studenti.sex,3);f.Write(&(pDoc-m_studenti.age),sizeof(int);f.Write(pDoc-m_studenti.tel,14);f.Write(pDoc-m_studenti.school,50);f.Close();/关闭文件 为为“另存为另存为”按钮编写代按钮编写代码码返返 回回 5.5 5.5 添加串行化功能添加串行化功能返回目录返回目录5.5.1 5.5.1 串行化概述串行化概述 5.5.2 5.5.2 添加串行化存储和装入添加串行化存储和装入 练练 习习 要点提示: 串行化概述串行化概述返回目录返回目录 一个对象通过某个操作,在程序退出时可被存储,当程序启动时又可被恢复。对象的这种存储和恢复处理过程称为“串行化” 。 串行化的基本思想是一个类对象能够将它记录在成员变量中的当前

温馨提示

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

评论

0/150

提交评论