文档视图程序设计
1、实验目的和要求
(1)创建一个多文档应用程序Ex_SDI,用来操作“课程信息”文档。
(2)创建一个可序列化类CCourseInfo,用于“课程信息”的序列化操作。
(3)建立用于类型文档的菜单系统,其基本菜单命令包括“添加”、“打开”和“保存”。选择“添加”菜单命令,弹出相应的信息对话框,添加后信息显示在视图中,并保存在相应的CObArray类对象。选择“保存”菜单命令,将添加的信息保存在指定的文件中。选择“打开”菜单命令,将保存的文件内容读取并显示在视图中。图3.1是“课程信息”文档添加时的界面。
2、实验准备和说明
(1)具备知识:框架窗口、文档模板和文档的读写。
(2)创建本次实验工作文件夹“…\实验\实验3”。
3、实验内容和步骤
1)启动Visual C++ 6.0
打开计算机,启动Visual C++ 6.0系统。
2)创建多文档应用程序Ex_SDI
用MFC AppWizard创建一个默认的多文档应用程序Ex_SDI。
3)复制“课程信息”对话框
① 将Ex_SDI项目工作区切换到ResourceView页面,展开Dialog资源的所有项。
② 单击开发环境标准工具栏上的“打开”按钮,打开实验2中Ex_Ctrls的资源文件Ex_Ctrl.rc,展开Dialog资源的所有项,选定IDD_COURSE对话框资源项,按住Ctrl键,将其拖放到Ex_SDI项目的Dialog资源处。
4)复制对话框类CCourseDlg
在ClassView视图中,生成CCourseDlg类,复制实验2中的CourseDlg.h和CourseDlg.cpp文件中的代码覆盖CCourseDlg类中的代码。
5)添加一个CCourseInfo类并使该类可序列化
①生成一个新类
CCourseInfo,选择Generic Class。
②改写CCourseInfo,继承自CObject。
③改写CCourseInfo的头文件,在文档窗口中输入下面的代码:
class CCourseInfo : public CObject { CString strNO; // 课程号 CString strName; // 课课名称 CString strSpecial; // 所属专业 CString strType; // 课程类型 BYTE nOpen; // 开课学期 BYTE nHours; // 课时数 float fCredit; // 学分 DECLARE_SERIAL(CCourseInfo) // 序列化声明 public: CCourseInfo() {}; CCourseInfo(CString id, CString name, CString special, CString type, BYTE term, BYTE hours, float credit); void Serialize(CArchive &ar); void Display(int y, CDC *pDC); // 在坐标为(0,y)处显示数据 };
④ 改写CStudentInfo的实现文件,在文档窗口中输入下面的代码:
#include "stdafx.h" #include "CourseInfo.h" CCourseInfo::CCourseInfo(CString id, CString name, CString special, CString type, BYTE term, BYTE hours, float credit) { strNO = id; strName = name; strSpecial = special; strType = type; nOpen = term; nHours = hours; fCredit = credit; } void CCourseInfo::Display(int y, CDC *pDC) { CString str; str.Format("%s %s %s %s %d %d %4.1f", strNO, strName, strSpecial, strType, nOpen, nHours, fCredit); pDC->TextOut(0, y, str); } IMPLEMENT_SERIAL(CCourseInfo, CObject, 1) // 序列化实现 void CCourseInfo::Serialize(CArchive &ar) { if (ar.IsStoring()) ar<<strNO<<strName<<strSpecial<<strType<<nOpen<<nHours<<fCredit; else ar>>strNO>>strName>>strSpecial>>strType>>nOpen>>nHours>>fCredit; }
⑤ 编译。
6)实现课程信息文档序列化
① 在Ex_SDIDoc.h文件的class
CEx_SDIDoc前面,添加包含CCourseInfo类的头
文件。
#include "CourseInfo.h"
② 为CEx_SDIDoc类添加下列成员变量,用来保存添加的CCourseInfo类对象数据:
public: CObArray m_courseObArray; // 对象集合类对象
③ 为CEx_SDIDoc类添加成员函数CCourseInfo*
GetCourseInfoAt(int nIndex),用来获取m_courseObArray中指定索引号的CCourseInfo类指针,其代码如下:
CCourseInfo* CEx_SDIDoc::GetCourseInfoAt(int nIndex) { if ((nIndex < 0) || nIndex > m_courseObArray.GetUpperBound()) return NULL; // 超界处理 return (CCourseInfo *)m_courseObArray.GetAt(nIndex); }
④ 为CEx_SDIDoc类添加成员函数int GetCourseRecNum(void),用于获取集合类中对象的个数其代码如下:
int CEx_SDIDoc::GetCourseRecNum() { return m_courseObArray.GetSize(); }
⑤ 在CEx_SDIDoc类析构函数~CEx_SDIDoc添加下列删除并释放对象的代码:
CEx_SDIDoc::~CEx_SDIDoc() { int nIndex = GetCourseRecNum(); while (nIndex--) delete m_courseObArray.GetAt(nIndex); // 删除并释放对象的内存空间 m_courseObArray.RemoveAll(); }
⑥ 在CEx_SDIDoc::Serialize函数中添加下列代码:
void CEx_SDIDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { m_courseObArray.Serialize(ar); } else { m_courseObArray.Serialize(ar); } }
⑦ 在Ex_SDIDoc.cpp文件的开始处,添加包含CCourseDlg类的头文件包含:
#include "Ex_SDIDoc.h" #include "CourseDlg.h"
⑧ 在菜单资源IDR_EX_MDITYPE中添加顶层菜单项“课程信息(&S)”,在该顶层菜单项中添加子菜单“添加(&A)”(ID_COURSEINFO_ADD)。
⑨ 用MFC ClassWizard为CEx_SDIDoc类添加处理菜单项ID_COURSEINFO_ADD的COMMAND消息,并添加下列代码:
void CEx_SDIDoc::OnCourseinfoAdd() { CCourseDlg dlg; if (dlg.DoModal() != IDOK) return; // 添加记录 CCourseInfo *pCourse = new CCourseInfo(dlg.m_strNO, dlg.m_strName, dlg.m_strSpecial, dlg.m_strType, dlg.m_nOpen, dlg.m_nHours, dlg.m_fCredit); m_courseObArray.Add(pCourse); SetModifiedFlag(); // 设置文档更改标志 UpdateAllViews(NULL); // 更新视图 }
⑩ 修改CEx_SDIView::OnDraw代码,用来将所有的课程信息记录显示在视图中:
void CEx_SDIView::OnDraw(CDC* pDC) { CEx_SDIDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); int y = 0; for (int nIndex = 0; nIndex < pDoc->GetCourseRecNum(); nIndex++) { pDoc->GetCourseInfoAt(nIndex)->Display(y, pDC); y += 16; } }
7)第一次测试
① 运行后,选择“课程基本信息”→“添加”菜单命令,弹出“课程信息”对话框,输入相关信息后,单击“确定”按钮。重复刚才的操作,添加两个课程信息记录,结果如图3.1所示。
② 选择“文件”→“保存”菜单命令,弹出保存文件对话框,指定要保存的文件名1.cou,单击“保存”按钮,这样就将添加的记录保存到1.cou文件中。
③ 关闭应用程序,然后重新运行。选择“文件”→“打开”菜单命令,从弹出的打开文件对话框中指定刚才保存的1.cou文件,单击“打开”按钮,该文件中的课程信息记录被保存到m_courseObArray中,并在视图中显示出来。
文档视图程序设计