实验六 框架窗口、文档和视图
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验六框架窗口、文档和视图
一实验内容
创建一个基于ClistView视图的单文档应用程序Ex_Student, 通过对话框输入一个学生记录, 记录包括学生的姓名、学号和3门成绩。
然后将记录内容保存到一个对象数组集合类对象中, 最后通过文档序列化将记录保存到一个文件中。
当添加记录或打开一个记录文件时, 还会将数据显示在文档窗口中。
二实验步骤
1.创建工作文件夹
2.参照文档序列化实例添加用于学生记录输入的对话框, 对话框布局如图所示;
ID号标题属性
其中添加的控件设置
如下表:
控件
静态文本默认姓名:默认
静态文本默认学号:默认
静态文本默认成绩1: 默认
静态文本默认成绩2: 默认
静态文本默认成绩3: 默认
编辑框IDC_EDIT1 ----- 默认
编辑框IDC_EDIT2 ----- 默认
4.添加一个Cstudent类使该类可序列化
在Ex_StudentDoc.h文件中的class CEx_StudentDoc前添加
class CStudent:public CObject
{
CString strName;
CString strID;
float fScore1,fScore2,fScore3;
float fAverage;
DECLARE_SERIAL(CStudent)
public:
CStudent(){};
CStudent(CString name,CString id,float f1,float f2,float f3);
void Serialize(CArchive &ar);
void Display(int y,CDC*pDC);//在坐标为(0, y)处显示数据};
在Ex_StudentDoc.cpp文件中添加Cstudent实现代码CStudent::CStudent(CString name,CString id,float f1,float f2,float f3) {
strName=name;
strID=id;
fScore1=f1;
fScore2=f2;
fScore3=f3;
fAverage=(float)((f1+f2+f3)/3.0);
}
void CStudent::Display(int y,CDC*pDC)
{
CString str;
str.Format("%s %s %f %f %f %f",strName,strID,fScore1,fScor2,fScore3,fAverage);
pDC->TextOut(0,y,str);
}
IMPLEMENT_SERIAL(CStudent,CObject,1)
void CStudent::Serialize(CArchive &ar)
{
if(ar.IsStoring())
ar<<strName<<strID<<fScore1<<fScore2<<fScore3<<fAverage;
else
ar>>strName>>strID>>fScore1>>fScore2>>fScore3>>fAverage;
}
5.添加并处理菜单项
为CEx_StudentDoc类添加ID_STUREC_ADD的COMMAND消息映射, 并在映射函数中添加下列代码:
CAddDlg dlg;
if(IDOK==dlg.DoModal())
{//添加记录
CStudent *pStudent=new CStudent(dlg.m_strName,
dlg.m_strID,dlg.m_fScore1,dlg.m_fScore2,dlg.m_fScore3);
m_stuObArray.Add(pStudent);
SetModifiedFlag();//设置文档更改标志
UpdateAllViews(NULL);//更新视图
}
6.在Ex_StudentDoc.cpp文件的开始处增加包含CAddDlg的头文件
#include "AddDlg.h"
7.完善代码
(1)在Ex_StudentDoc.h文件中, 添加下列成员变量和成员函数
public:
CObArray m_stuObArray;
int GetAllRecNum(void);
CStudent* GetStudentAt(int nIndex);
(2)在Ex_StudentDoc.cpp文件中添加函数的实现代码: CStudent*CEx_StudentDoc::GetStudentAt(int nIndex)
{
if((nIndex<0)||nIndex>m_stuObArray.GetUpperBound()) return 0;
return(CStudent*)m_stuObArray.GetAt(nIndex);
}
int CEx_StudentDoc::GetAllRecNum()
{
return m_stuObArray.GetSize();
}
(3)在CEx_StudentDoc析构函数中添加下列代码: int nIndex=GetAllRecNum();
while(nIndex--)
delete m_stuObArray.GetAt(nIndex);
m_stuObArray.RemoveAll();
(4)在Serialize函数中添加下列代码:
void CEx_StudentDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
m_stuObArray.Serialize(ar);
}
else
{
m_stuObArray.Serialize(ar);
}
}
(5)在OnDraw函数中添加代码:
int y=0;
for(int nIndex=0;nIndex<pDoc->GetAllRecNum();nIndex++) {
pDoc->GetStudentAt(nIndex)->Display(y,pDC);
y+=16;
}
(6)打开文档字串资源将其内容修改为
编译运行后点击学生记录中的添加记录显示如下:
而且生成一个文件
8.在上述基础上修改代码
(1)修改类Cstudent的声明:
将void Display(int y,CDC*pDC);改为void Display(int nIndex,CListCtrl *pList); (2)修改Display成员函数的实现代码为:
void CStudent::Display(int nIndex,CListCtrl *pList)
{ int nSub=pList->InsertItem(nIndex,strName);
CString str;
pList->SetItemText(nSub,1,strID);
str.Format("%5.1f",fScore1);
pList->SetItemText(nSub,2,strID);
str.Format("%5.1f",fScore2);
pList->SetItemText(nSub,3,strID);
str.Format("%5.1f",fScore3);
pList->SetItemText(nSub,4,str);
}
(3)修改OnStureAdd函数中的代码:
将UpdateAllViews(NULL);//更新视图改为
UpdateAllViews(NULL,1);//更新视图
(4)在View类中添加一个成员函数DispAllRec, 用于将文档中的记录数据全部显示在列表控件中, 其代码如下:
void CEx_StudentView::DispAllRec()
{
CEx_StudentDoc* pDoc=GetDocument();
ASSERT_V ALID(pDoc);
CListCtrl&m_ListCtrl=GetListCtrl();
m_ListCtrl.DeleteAllItems();
int y=0;
for(int nIndex=0;nIndex<pDoc->GetAllRecNum();nIndex++)
{
pDoc->GetStudentAt(nIndex)->Display(y,&m_ListCtrl);
y++;
}
}
(5)在CEx_StudentView::PreCreateWindow函数中添加下列代码:
cs.style|=LVS_REPORT;
(6)在OnInitialUpdate函数中添加设置列表控件表头的代码:
//删除列表头
int nColumnCount=m_ListCtrl.GetHeaderCtrl()->GetItemCount();
for(int i=0;i<nColumnCountli++)
m_ListCtrl.DeleteColumn(0);
//添加列表头
CListCtrl& m_ListCtrl=GetListCtrl();
char* arCols[5]={"姓名","学号","成绩1","成绩2","成绩3");
for(int nCol=0;nCol<5;nCol++)
m_ListCtrl.InsertColumn(nCol,arCols[nCol],LVCFMT_LEFT,100);
m_ListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
DispAllRec();
(7)为View类添加OnUpdate消息函数, 并添加下列代码;
void CEx_StudentView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
if(lHint==1) DispAllRec();
}
(8)删除刚才在Draw中添加的代码
三. 实验结果
能通过对话框添加一个学生记录, 还能显示在表格里面, 最后记录内容保存到一个文件中四. 实验心得
本次试验中用到CListCtrl&m_ListCtrl=GetListCtrl();如果开始创建的单文档应用程序不是基于ClistView, 此处就会报错, 说GetListCtrl();没有定义, 因为此函数是继承ClistView这个基类的。