文档视图程序设计

文档视图程序设计

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

文档视图程序设计

时间: 2024-10-25 11:20:53

文档视图程序设计的相关文章

文档/视图结构详细介绍

以单文档界面(SDI)应用程序为例,介绍MFC的文档/视图程序结构. 学习要求 理解文档/视图结构,可在AppWizard生成的SDI程序框架的基础上添加必要的代码,以生成自己的应用程序. 授课内容 大部分应用程序均要使用数据,其主要工作可以分为两部分:一是对数据的管理,如存储.复制和查询等任务,一是对数据的处理和输入输出,包括显示和打印.MFC提供了“文档/视图”结构支持这类应用程序. 12.1文档/视图概念 在文档/视图结构里,文档可视为一个应用程序的数据元素的集合,MFC通过文档类提供了大

文档/视图结构的应用

用Visual C++的MFC AppWizar生成的函数,一般是"文档/视图"结构的. 在这种程序结构中,文档对象和视图对象的分工是十分明确的,文档对象用来存储.管理和维护数据,而视图对象用来显示和操作数据. 所以,在文档/视图结构的应用程序中,一般要在文档类的声明中定义数据对象,在文档类的构造函数中初始化数据对象,而对数据对象的操作和显示则在视图类对象中完成. 为了在视图对象中,对文档对象的成员进行访问,视图类提供了一个成员函数GetDocument,它的原型为: CDocumen

8.MFC多文档视图构架程序

一.多文档视图构架程序 1.相关问题 可以同时管理多个文档(可以有多个文档类对象) 2.相关类 CWinApp / CDocument / CView / CMIDChildWnd / CMIDFrameWnd CDocTemplate CMultiDocTemplate - 多文档模板类 CDocManager - 文档管理类

mfc学习---文档视图架构

MFC的AppWizard可以生成三种类型的应用程序:基于对话框的应用.单文档应用(SDI)和多文档应用(MDI). 一般情况下,采用文档/视结构的应用程序至少应由以下对象组成:       1.应用程序是一个CwinApp派生对象,它充当全部应用程序的容器.应用程序沿消息映射网络分配消息给它的所有子程序.       2.框架窗口是一CfrmeWnd派生对象.       3.文档是一个CDocument派生对象,它存储应用程序的数据,并把这些信息提供给应用程序的其余部分.       4.视

如何从一个对话框弹出单文档视图

如何从一个对话框弹出单文档视图 分类: Visual C++2006-06-01 20:02 9323人阅读 评论(19) 收藏 举报 文档initializationmfctemplatesvalidationcommand 朱金灿 相信不少人进行数据库编程都有这样的问题,如何设置一个登陆框,通过登陆框来进入单文档视图.我看到很多数据库编程方面的书,都是对话框之间的相互切换.而在对话框中添加菜单不少人都不太熟悉(当然这是可以办到的).我在想:为何不能在对话框中弹出单文档,这样添加菜单等工作就方

7.MFC单文档视图构架程序

一.单文档视图构架程序 1.相关问题 只能管理一个文档(只有一个文档类对象) 2.相关类 CWinApp / CFrameWnd / CView / CDocument CDocTemplate - 文档模板类 CSingleDocTemplate - 当文档模板类 CDocManager - 文档管理类 3.关系图

文档视图(DocumentView)和元素视图(ElementView)方法

文档视图(DocumentView)和元素视图(ElementView) 旗下有四个方法,如下:elementFromPoint() 返回给定坐标处所在的元素.是个在目前而言,兼容性不错的方法 getBoundingClientRect()  得到矩形元素的界线,返回的是一个对象,包含 top, left, right, 和 bottom四个属性值,大小都是相对于文档视图左上角计算而来   getClientRects() 返回元素的数个矩形区域,返回的结果是个对象列表,具有数组特性.这里的矩形

MFC 文档/视图

1.文档修改后,关闭时需要保存,主要用到2个函数,在需要更改文档内容的函数里调用SetModifiedFlag(TRUE),另一个就是SaveModified()函数,简单的例子: BOOL CMFC_Doc::SaveModified() { // TODO: 在此添加专用代码和/或调用基类 return CDocument::SaveModified(); } void CMFC_Doc::SetColor() { m_color=RGB(0,0,0); SetModifiedFlag(TR

mfc创建文档视图过程

一.如何创建文档视图界面: 创建新的文档视图界面,只需要调用CDocTemplate::OpenDocumentFile(strpath)即可.(strpath为要打开的文档路径,如果是NULL,则生成新的文档). 二.上面这个函数为何能够生成文档视图对象? 因为 1.它调用了CDocTemplate::CreateNewDocument()函数生成了CDocument对象: 2.它调用了CDocTemplate::CreateNewFrame()函数生成了CFrameWnd对象: 3.在生成文