1、1启动Visual C+ 6.0打开计算机,启动Visual C+ 6.0 系统。2创建多文档应用程序Ex_MDI用MFC AppWizard 创建一个默认的多文档应用程序Ex_MDI。3复制“学生基本信息”和“课程信息”对话框 将Ex_Student 项目工作区切换到ResourceView 页面,展开Dialog 资源的所有项。 单击开发环境标准工具栏上的“打开”按钮,打开实验3 中Ex_Ctrls 的资源文件Ex_Ctrl.rc,展开Dialog 资源的所有项,选定IDD_STUINFO 对话框资源项,按住Ctrl键,将其拖放到Ex_Student 项目的Dialog 资源处。同样,再将
2、IDD_COURSE 对话框资源击中。4复制对话框类CStuInfoDlg 和CCourseDlg 单击标准工具栏上的“打开”按钮,在“打开”文件对话框中,定位到Ex_Ctrls项目文件夹,选中StuInfoDlg.h 和StuInfoDlg.cpp 以及CourseDlg.h 和CourseDlg.cpp 文件,按快捷键Ctrl+C,然后将“打开”文件对话框的文件“查找范围”定位到本项目Ex_MDI的文件夹中,按快捷键Ctrl+V、CStuInfoDlg 和CCourseDlg 类的源代码文件就复制过来了。 关闭“打开”文件对话框,选择“工程”“添加工程”Files 菜单,在弹出的Inser
3、t Files Into Project 对话框中选中刚才复制的源文件,单击“确定”按钮,CStuInfoDlg和CCourseDlg 类就添加到Ex_MDI 项目中。 打开StuInfoDlg.cpp 文件,将文件前面的头文件包含进行修改,如下所示:#include Ex_MDI.h / 修改原来的#include Ex_Ctrls.hStuInfoDlg.h 打开CourseDlg.cpp 文件,将文件前面的头文件包含进行修改,如下所示:CourseDlg.h5实现MFC ClassWizard对CStuInfoDlg和CCourse类的支持若此时打开MFC ClassWizard 对话框
4、,在Class name 组合框中有时是找不到刚添加的CStuInfoDlg 和CCourse 类。为此需要进行下列操作: 单击标准工具栏上的“打开”按钮,在“打开”文件对话框中,将文件类型选择为“所有文件(*.*)”,在文件列表框中,右击文件Ex_MDI.clw,从弹出的快捷菜单中选择“删除”命令。这里的Ex_MDI.clw 是项目Ex_MDI 的类向导文件。 关闭“打开”文件对话框后,按快捷键Ctrl+W,出现一个消息对话框,询问是否从资源中重新创建一个类向导文件,单击“是(Y)”按钮,出现如图6.3 所示的对话框。图6.3 重新创建类向导文件 单击Add All 按钮,再单击OK 按钮。
5、6添加一个CStudentInfo类并使该类可序列化 选择“文件”“新建”菜单命令,显示出“新建”对话框。单击“文件”标签,在左边的列表框中选择C/C+ Header File 项,在右边的“文件”下的编辑框中输入StudentInfo.h,单击“确定”按钮。 在文档窗口中输入下面的代码:class CStudentInfo : public CObjectCString strName; / 姓名CString strNO; / 学号BOOL bMale; / 性别,是否为男CTime tBirth; / 出生年月CString strSpecial; / 专业DECLARE_SERIAL(
6、CStudentInfo) / 序列化声明public:CStudentInfo() ;CStudentInfo(CString name, CString id, BOOL male, CTime birth, CString special);void Serialize(CArchive &ar);void Display(int y, CDC *pDC); / 在坐标为(0,y)处显示数据; 再次选择“文件”“新建”菜单命令,显示出“新建”对话框。单击“文件”标签,在左边的列表框中选择C+ Source File 项,在右边的“文件”下的编辑框中输入StudentInfo.cpp,单击
7、“确定按钮。 在文档窗口中输入下面的代码:stdafx.hStudentInfo.hCStudentInfo:CStudentInfo(CString name, CString id, BOOL male, CTime birth, CString special)strName = name;strNO = id;bMale = male;tBirth = birth;strSpecial = special;void CStudentInfo:Display(int y, CDC *pDC)CString str, strSex(女);if (bMale) strSex = 男;str.
8、Format(%s %s %s %s %s, strName, strNO,strSex, tBirth.Format(%Y-%m-%d), strSpecial);pDC-TextOut(0, y, str);IMPLEMENT_SERIAL(CStudentInfo, CObject, 1) / 序列化实现Serialize(CArchive &ar)if (ar.IsStoring()arstrNamestrNObMaletBirthstrNamestrNObMaletBirth 编译。7添加一个CCourseInfo类并使该类可序列化CourseInfo.h,单击“确定”按钮。clas
9、s CCourseInfo : / 课程号 / 课课名称 / 所属专业CString strType; / 课程类型BYTE nOpen; / 开课学期BYTE nHours; / 课时数float fCredit; / 学分DECLARE_SERIAL(CCourseInfo) / 序列化声明CCourseInfo() ;CCourseInfo(CString id, CString name, CString special, CString type,BYTE term, BYTE hours, float credit);CourseInfo.cpp,单击“确定”按钮。CourseIn
10、fo.hCCourseInfo:BYTE term, BYTE hours, float credit)strType = type;nOpen = term;nHours = hours;fCredit = credit;void CCourseInfo:CString str;%s %s %s %s %d %d %4.1f, strNO, strName,strSpecial, strType, nOpen, nHours, fCredit);IMPLEMENT_SERIAL(CCourseInfo, CObject, 1) / 序列化实现strSpecialstrTypenOpennHo
11、ursstrTypenOpennHours8实现课程信息文档序列化 在Ex_MDIDoc.h 文件的class CEx_MDIDoc 前面,添加包含CCourseInfo 类的头文件。 为CEx_MDIDoc 类添加下列成员变量,用来保存添加的CCourseInfo 类对象数据:CObArray m_courseObArray; / 对象集合类对象 为CEx_MDIDoc 类添加成员函数CCourseInfo* GetCourseInfoAt(int nIndex),用来获取m_courseObArray 中指定索引号的CCourseInfo 类指针,其代码如下:CCourseInfo* CE
12、x_MDIDoc:GetCourseInfoAt(int nIndex)if (nIndex m_courseObArray.GetUpperBound()return NULL; / 超界处理return (CCourseInfo *)m_courseObArray.GetAt(nIndex); 为CEx_MDIDoc 类添加成员函数int GetCourseRecNum(void),用于获取集合类中对象的个数其代码如下:int CEx_MDIDoc:GetCourseRecNum()return m_courseObArray.GetSize(); 在CEx_MDIDoc 类析构函数CEx
13、_MDIDoc 添加下列删除并释放对象的代码:CEx_MDIDoc:CEx_MDIDoc()int nIndex = GetCourseRecNum();while (nIndex-)delete m_courseObArray.GetAt(nIndex); / 删除并释放对象的内存空间m_courseObArray.RemoveAll(); 在CEx_StudentDoc:Serialize 函数中添加下列代码:void CEx_MDIDoc:Serialize(CArchive& ar)if (ar.IsStoring() m_courseObArray.Serialize(ar); el
14、se 在Ex_MDIDoc.cpp 文件的开始处,添加包含CCourseDlg 类的头文件包含:Ex_MDIDoc.h 在菜单资源IDR_EX_MDITYPE 中添加顶层菜单项“课程信息(&S)”,在该顶层菜单项中添加子菜单“添加(&A)”(ID_COURSEINFO_ADD)。 用MFC ClassWizard 为CEx_MDIDoc 类添加处理菜单项ID_COURSEINFO_ADD的COMMAND 消息,并添加下列代码:OnCourseinfoAdd()CCourseDlg dlg;if (dlg.DoModal() != IDOK) return;/ 添加记录CCourseInfo *
15、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_MDIView:OnDraw 代码,用来将所有的课程信息记录显示在视图中:void CEx_MDIView:OnDraw(CDC* pDC)CEx_MDIDo
16、c* pDoc = GetDocument();ASSERT_VALID(pDoc);int y = 0;for (int nIndex = 0; nIndex GetCourseRecNum(); nIndex+) pDoc-GetCourseInfoAt(nIndex)-Display(y, pDC);y += 16;打开文档的字串资源IDR_EX_MDITYPE,将其内容修改为:nCourseRecnEx_MDIn课程信息文件(*.cou)n.counExMDI.DocumentnEx_MDI Document编译并运行。9第一次测试 运行后,选择“课程基本信息”“添加”菜单命令,弹出“
17、课程信息”对话框,输入相关信息后,单击“确定”按钮。重复刚才的操作,添加两个课程信息记录,结果如图6.1 所示。 选择“文件”“保存”菜单命令,弹出保存文件对话框,指定要保存的文件名1.cou,单击“保存”按钮,这样就将添加的记录保存到1.cou 文件中。 关闭应用程序,然后重新运行。选择“文件”“打开”菜单命令,从弹出的打开文件对话框中指定刚才保存的1.cou 文件,单击“打开”按钮,该文件中的课程信息记录被保存到m_courseObArray 中,并在视图中显示出来。 再添加一个课程信息记录,保存后再打开,结果如何?10添加另一个文档模板类型 打开项目工作区窗口中String Table
18、的资源项,双击该项下的String Table,打开字符串表资源,拖动字符串表编辑器右边的滚动块,直到出现最后一个字符串项,双击最后的空行,在字符串属性对话框中将ID 设为IDR_STUDENT,值为130,标题内容设为:nStuRecnEx_Studentn学生基本信息文件(*.stu)n.stunExMDI.DocumentnEx_MDI Document 按快捷键Ctrl+W,打开MFC ClassWizard,单击Add Class 按钮,从弹出的菜单中选择New,出现New Class 对话框,在Name 框中输入类名CEx_StudentDoc,在Base class组合框中选择基
19、类CDocument。单击OK 按钮,新的文档类COtherDoc 就添加到Ex_MDI项目中。 类似地再添加一个新的视图类CEx_StudentView,基类为CView。单击“确定”按钮,关闭MFC ClassWizard 对话框。 修改CEx_MDIApp:InitInstance 函数代码,如下所示:BOOL CEx_MDIApp:InitInstance()CMultiDocTemplate* pDocTemplate;pDocTemplate = new CMultiDocTemplate(IDR_EX_MDITYPE,RUNTIME_CLASS(CEx_MDIDoc),RUNTI
20、ME_CLASS(CChildFrame), / custom MDI child frameRUNTIME_CLASS(CEx_MDIView);AddDocTemplate(pDocTemplate);IDR_STUDENT, / 指定新的资源RUNTIME_CLASS(CEx_StudentDoc), / 指定新的文档类RUNTIME_CLASS(CChildFrame),RUNTIME_CLASS(CEx_StudentView);/ 指定新的视图类 在文件Ex_MDI.cpp 的开始处,添加包含前面创建的两个派生类的头文件包含:Ex_MDIView.hEx_StudentDoc.hE
21、x_StudentView.h 编译并运行。11实现学生基本信息文档序列化 在Ex_StudentDoc.cpp 文件的开始处,添加包含CStuInfoDlg 类的头文件包含。 将项目工作区切换到ResourceView 页面, 展开Menu 所有节点, 选中IDR_EX_MDITYPE,然后按住Ctrl 键,将其拖放到Menu 节点上,将IDR_EX_MDITYPE1标识改为IDR_STUDENT。 保留“文件”和“帮助”菜单,其他删除。添加顶层菜单项“学生基本信息(&S)”,在该顶层菜单项中添加子菜单“添加(&A)”(ID_STUINFO_ADD)。 用MFC ClassWizard 为C
22、Ex_StudentDoc 类添加处理菜单项ID_STUINFO_ADD 的COMMAND 消息,并添加下列代码:void CEx_StudentDoc:OnStuinfoAdd()CStuInfoDlg dlg;CStudentInfo *pStudent = new CStudentInfo(dlg.m_strName,dlg.m_strNo, dlg.m_bMale, dlg.m_tBirth, dlg.m_strSpecial);m_stuObArray.Add(pStudent); 修改CEx_StudentDoc 类代码(与教材文档序列化示例Ex_Student 相同)。 在CEx
23、_StudentView:OnDraw 中添加下列代码:void CEx_StudentView:CEx_StudentDoc* pDoc = (CEx_StudentDoc*)GetDocument();GetAllRecNum();GetStudentInfoAt(nIndex)- 在Ex_StudentView.cpp 文件的前面添加CEx_StudentDoc 类的头文件包含: 编译运行。在文档类型“新建”对话框中,选中Ex_Student,单击“确定”按钮,出现程序主界面,然后进行测试,测试的内容与教材文档序列化示例Ex_Student 相同。结果如图6.2 所示。实验环境硬件环境:软件环境:程序测试及结果分析实验总结(1) 通过这次课程设计,可以说我粗略的掌握了MFC程序设计,对vc的关键技术之一的消息机制有了很深刻的认识,对MFC的的常用控件,列表,树控件,菜单,工具栏,状态栏,框架窗口,文本窗口以及切分窗口,图形,文本,打印有了理解.(2) 我还理解到程序的界面设计十分的重要,一个好的程序必须有便捷的操作和美观的界面.人性化的设计是程序的翅膀,长了翅膀的程序才能飞得更远更高。(3) 更重要的是此次课程设计让我从实践的角度了解了编
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1