文档视图程序设计

来源:互联网 发布:mac book air后悔 编辑:程序博客网 时间:2024/06/10 15:24

文档视图程序设计

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资源的所有项。

单击开发环境标准工具栏上的打开按钮,打开实验2Ex_Ctrls的资源文件Ex_Ctrl.rc,展开Dialog资源的所有项,选定IDD_COURSE对话框资源项,按住Ctrl键,将其拖放到Ex_SDI项目的Dialog资源处。

4)复制对话框类CCourseDlg

ClassView视图中,生成CCourseDlg类,复制实验2中的CourseDlg.hCourseDlg.cpp文件中的代码覆盖CCourseDlg类中的代码。

5)添加一个CCourseInfo类并使该类可序列化

生成一个新类CCourseInfo,选择Generic Class

改写CCourseInfo继承自CObject

改写CCourseInfo的头文件在文档窗口中输入下面的代码:

class CCourseInfo : public CObject{CString strNO;// 课程号CString strName;// 课课名称CStringstrSpecial;// 所属专业CStringstrType;// 课程类型BYTEnOpen;// 开课学期BYTEnHours;// 课时数floatfCredit;// 学分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;elsear>>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* GetCourseInfoAtint 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 GetCourseRecNumvoid),用于获取集合类中对象的个数其代码如下:

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,在该顶层菜单项中添加子菜单添加(&AID_COURSEINFO_ADD)。

MFC ClassWizardCEx_SDIDoc类添加处理菜单项ID_COURSEINFO_ADDCOMMAND消息,并添加下列代码:

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中,并在视图中显示出来。

1 0