1、c+mfc上机实习报告 面向对象程序设计 课程设计报告学 号: 201* 班级序号: 11* 姓 名:* 指导老师: 陈亮老师 成 绩: 中国地质大学(武汉) 信息工程学院信息工程系 2014年6月17日上机题目一1、题目:橡皮筋画线程序,要求:(1)基本要求利用鼠标在视图上绘制线,能够设置线的颜色和宽度;能够用鼠标拾取绘制的某条线,被选中的线能够高亮显示,并且弹出对话框,输入线的属性保存起来;(2)高阶要求能够将绘制的线数据保存在Line.dat文本文件中;打开线数据文件Line.dat,可以显示出文件里面的线图形。(3)可选功能文字能够在视图任意地方点击鼠标后输入。(提示:可以使用STL中
2、的容器来管理数据。)2、设计思路:利用MFC中的单文档,在view函数中添加up和down的命令响应函数,使实现画线的功能,并在函数中增加特定代码使实现设置线宽和颜色(具体函数代码可以从书上找到),同样的添加保存和打开所画的线、能输入文字的命令函数。3、实现情况和能改进的地方:代码运行成果是可以改变线宽和颜色,并且在运行出的窗口的大小改变构绘制的线不会消失,可以保存并打开绘制的线,能在视图的任何地方输入文字。用鼠标拾取绘制的线并高亮显示没有实现,保存时直接保存的绘制的线,而并没有将所画线的属性保存下来,没有dat类型的文件。4、具体代码如下:设置线宽的对话框的代码:(因引入对话框,需添加头文件
3、)void CHuiView:OnSetting() / TODO: Add your command handler code here CSettingDlg dlg; dlg.m_nLineWidth=m_nLineWidth; if(IDOK=dlg.DoModal() m_nLineWidth=dlg.m_nLineWidth; 设置颜色的代码:void CHuiView:OnColor() / TODO: Add your command handler code here CColorDialog dlg; dlg.m_cc.rgbResult=m_clr; dlg.m_cc.F
4、lags |=CC_RGBINIT | CC_FULLOPEN; if(IDOK=dlg.DoModal() m_clr=dlg.m_cc.rgbResult; /dlg.DoModal();文件保存于打开的代码:void CHuiView:OnFileOpen() / TODO: Add your command handler code here HMETAFILE hmetaFile; hmetaFile=GetMetaFile(meta.wmf); m_dcMetaFile.PlayMetaFile(hmetaFile); DeleteMetaFile(hmetaFile); Inva
5、lidate();void CHuiView:OnFileSave() / TODO: Add your command handler code here HMETAFILE hmetaFile; hmetaFile=m_dcMetaFile.Close(); CopyMetaFile(hmetaFile,meta.wmf); m_dcMetaFile.Create(); DeleteMetaFile(hmetaFile);在视图的任何地方输入文字:(OnCreat和OnChar函数)int CHuiView:OnCreate(LPCREATESTRUCT lpCreateStruct) i
6、f (CView:OnCreate(lpCreateStruct) = -1) return -1; CClientDC dc(this); TEXTMETRIC tm; dc.GetTextMetrics(&tm); CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight); ShowCaret(); / TODO: Add your specialized creation code here return 0;void CHuiView:OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) / TODO: A
7、dd your message handler code here and/or call default CClientDC dc(this); TEXTMETRIC tm; dc.GetTextMetrics(&tm); if(0x0d=nChar) m_strLine.Empty(); m_ptOrigin.y+=tm.tmHeight; else if (0x08=nChar) COLORREF clr=dc.SetTextColor(dc.GetBkColor(); dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine); m_strLine=
8、m_strLine.Left(m_strLine.GetLength()-1); dc.SetTextColor(clr); else m_strLine+=nChar; CSize sz=dc.GetTextExtent(m_strLine); CPoint pt; pt.x=m_ptOrigin.x+sz.cx; pt.y=m_ptOrigin.y; SetCaretPos(pt); dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine); CView:OnChar(nChar, nRepCnt, nFlags);在运行窗口上保存绘制的线:void
9、CHuiView:OnDraw(CDC* pDC) CHuiDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CPen pen(PS_SOLID,m_nLineWidth,m_clr); CBrush* pBrush=CBrush:FromHandle(HBRUSH)GetStockObject(NULL_BRUSH); pDC-SelectObject(pBrush); for (int i=0;iMoveTo(CGraph*)m_ptrArray.GetAt(i)-m_ptOrigin); pDC-LineTo(CGraph*)m_ptrArra
10、y.GetAt(i)-m_ptEnd); HMETAFILE hmetaFile; hmetaFile=m_dcMetaFile.Close(); pDC-PlayMetaFile(hmetaFile); m_dcMetaFile.Create(); m_dcMetaFile.PlayMetaFile(hmetaFile); DeleteMetaFile(hmetaFile); / TODO: add draw code for native data here最终的up 和down函数:void CHuiView:OnLButtonDown(UINT nFlags, CPoint point
11、) / TODO: Add your message handler code here and/or call default m_ptOrigin=point; SetCaretPos(point); m_strLine.Empty(); CView:OnLButtonDown(nFlags, point);void CHuiView:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default CClientDC dc(this); CPen pe
12、n(PS_SOLID,m_nLineWidth,m_clr); CBrush* pBrush=CBrush:FromHandle(HBRUSH)GetStockObject(NULL_BRUSH); dc.SelectObject(&pen); dc.SelectObject(pBrush); dc.MoveTo(m_ptOrigin); dc.LineTo(point); m_dcMetaFile.MoveTo(m_ptOrigin); m_dcMetaFile.LineTo(point); m_dcMetaFile.SelectObject(&pen); /m_dcMetaFile.Sel
13、ectObject(pBrush); CGraph *pGraph=new CGraph(m_ptOrigin,point); m_ptrArray.Add(pGraph); CView:OnLButtonUp(nFlags, point);添加的成员变量及其初始化:m_ptOrigin=0; m_clr=RGB(255,0,0); m_nLineWidth=0; m_strLine= ; m_dcMetaFile.Create();运行结果为:上机题目二1、题目:学生学籍成绩管理系统学生的信息包括:姓名、学号、性别、班级、院系;学生的成绩信息包括英语、数学、程序设计及体育成绩等各门课的成绩;
14、定义如下类,并建立一个文本文件Student.dat,用于存储学生、课程与成绩的相关信息。文件格式自己定义。学生类CStudent(姓名、学号、性别、班级、院系);课程类CLessen(课程名称、课程开设时间);成绩类CGrade(学号、课程名称、成绩)要求实现如下功能: 在对话框上能够添加、删除、编辑和查询课程信息; 在对话框上能够添加、删除、编辑和查询学生信息学生信息; 在对话框上能够增加、删除、编辑和查询学生的选课信息; 在对话框上能够录入和编辑学生某门课的考试成绩; 在对话框上能够按照学生姓名查询学生的选课信息和选课成绩,并统计出其总成绩、平均成绩,计算出该学生的成绩的标准差; 显示全
15、班的学生成绩排名。 统计出各班的平均成绩,并进行排名。2、设计思路:对话框的应用,在对话框上添加控件,将控件与具体函数或成员变量绑定,该题中利用此来实现编辑框与列表控件的同步,从而实现录入、查询、和编辑等功能。将学生管理系统分为三部分:学生个人信息、成绩和选课情况,三部分在具体处理上是一样的,成绩计算时,需进行类型转换。3、实现结果及可改进的地方:实现结果是能在对话框上进行录入、查询、编辑和删除。在学生成绩的对话框上没有实现学生排名情况,可以无限录入但是没有数据的保存,不能整个班级排名和不同班级排名。该题目中查询、录入都是在同一对话框实现的,可以再不同对话框实现,实现需要变量对应。4、具体代码
16、如下:单击按钮,使弹出另一对话框:(固定,改变具体类名即可)void CXUESHENGDlg:OnButton1() / TODO: Add your control notification handler code here CStudent st; st.DoModal();学生信息:对编辑框定义对应的成员变量:m_xingming = _T(); m_xingbie = _T(); m_xuehao = _T(); m_yuanxi = _T(); m_zhuanye = _T();列表控件在相同对话框内,定义对用成员变量: DDX_Control(pDX, IDC_LIST1, m
17、_list); DDX_Text(pDX, IDC_EDIT1, m_xingming); DDX_Text(pDX, IDC_EDIT2, m_xingbie); DDX_Text(pDX, IDC_EDIT3, m_xuehao); DDX_Text(pDX, IDC_EDIT4, m_yuanxi); DDX_Text(pDX, IDC_EDIT5, m_zhuanye); /AFX_DATA_MAP录入按钮及列表控件设置代码:void CStudent:OnButton1() / TODO: Add your control notification handler code here
18、 UpdateData(TRUE);/将界面的数据更新到对应的变量中 int count=m_list.GetItemCount();/获取当前存在的数据总量 m_list.InsertItem(count,m_xingming);/插入一行 m_list.SetItemText(count,1, m_xingbie); m_list.SetItemText(count,2, m_xuehao); m_list.SetItemText(count,3, m_yuanxi); m_list.SetItemText(count,4, m_zhuanye); MessageBox(已录入学生信息!)
19、;BOOL CStudent:OnInitDialog() CDialog:OnInitDialog(); / TODO: Add extra initialization here DWORD dwStyle = m_list.GetExtendedStyle(); dwStyle |= LVS_EX_FULLROWSELECT; dwStyle |= LVS_EX_GRIDLINES; m_list.SetExtendedStyle(dwStyle); m_list.InsertColumn(0, 姓名,LVCFMT_LEFT,60); m_list.InsertColumn(1, 性别,
20、LVCFMT_LEFT,60); m_list.InsertColumn(2, 学号,LVCFMT_LEFT,60); m_list.InsertColumn(3, 院系,LVCFMT_LEFT,60); m_list.InsertColumn(4, 专业,LVCFMT_LEFT,60); return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSE删除按钮:void CStudent:OnButton2() / TODO:
21、 Add your control notification handler code here BOOL findok = FALSE; for(int i=0;im_list.GetItemCount();i+) if(m_list.GetItemState(i,LVIS_SELECTED)=LVIS_SELECTED) m_list.DeleteItem(i); MessageBox(已删除所选学生信息); findok=TRUE; if(findok!=TRUE) MessageBox(请先选择需要删除的学生); UpdateData(FALSE);查询按钮(按名字查询):void C
22、Student:OnSearch() / TODO: Add your control notification handler code here int i; BOOL temp = FALSE; UpdateData(TRUE); for(i=0;im_list.GetItemCount();i+) if(m_xingming=m_list.GetItemText(i,0) m_xingbie = m_list.GetItemText(i,1); m_xuehao = m_list.GetItemText(i,2); m_yuanxi= m_list.GetItemText(i,3);
23、m_zhuanye = m_list.GetItemText(i,4); UpdateData(FALSE); temp = TRUE; break; if(temp=FALSE) MessageBox(没有该学生的记录!); UpdateData(FALSE);编辑按钮:(按名字一样修改)void CStudent:OnGai() / TODO: Add your control notification handler code here Cgai ga; ga.DoModal(); int i; BOOL temp = FALSE; UpdateData(TRUE); for(i=0;i
24、m_list.GetItemCount();i+) /if(temp=true) if(ga.m_xingming=m_list.GetItemText(i,0) /m_xingming=ga.m_xingming; int count=m_list.GetItemCount();/获取当前存在的数据总量 / m_list.InsertItem(count,m_xingming);/插入一行 m_list.SetItemText(i,1, ga.m_xingbie); m_list.SetItemText(i,2, ga.m_xuehao); m_list.SetItemText(i,3, g
25、a.m_yuanxi); m_list.SetItemText(i,4, ga.m_zhuanye); /m_xingbie=ga.m_xingbie; /m_xuehao =ga.m_xuehao; /m_yuanxi = ga.m_yuanxi; /m_zhuanye = ga.m_zhuanye; UpdateData(FALSE); /temp = TRUE; break; if(ga.m_xingming!=m_list.GetItemText(i,0) MessageBox(修改失效!); 在成绩和选课情况的对话框上,录入、查询、编辑、删除的代码只需改变给的成员变量名,具体实现是一
26、样的。成绩:成员变量:m_chengxu = _T(); m_tiyu = _T(); m_xingming = _T(); m_pingjun = _T(); m_cha = _T(); m_shuxue = _T(); m_yingyu = _T();列表控件的变量: DDX_Control(pDX, IDC_LIST1, m_list1); DDX_Text(pDX, IDC_EDIT3, m_chengxu); DDX_Text(pDX, IDC_EDIT4, m_tiyu); DDX_Text(pDX, IDC_EDIT5, m_xingming); DDX_Text(pDX, ID
27、C_EDIT6, m_pingjun); DDX_Text(pDX, IDC_EDIT7, m_cha); DDX_Text(pDX, IDC_EDIT2, m_shuxue); DDX_Text(pDX, IDC_EDIT1, m_yingyu);列表控件与编辑框的同步,(录入)及平均数、方差的计算,并将计算结果同时在编辑框列表控件中显示。void CGrade:OnButton1() / TODO: Add your control notification handler code here UpdateData(TRUE);/将界面的数据更新到对应的变量中 int count=m_li
28、st1.GetItemCount();/获取当前存在的数据总量 m_list1.InsertItem(count,m_xingming);/插入一行 m_list1.SetItemText(count,1, m_yingyu); m_list1.SetItemText(count,2, m_shuxue); m_list1.SetItemText(count,3, m_chengxu); m_list1.SetItemText(count,4, m_tiyu); int a,b,c,d,e; char ch110,ch210,ch310,ch410,ch510,ch610,ch710; Get
29、DlgItemText(IDC_EDIT1,ch1,10); GetDlgItemText(IDC_EDIT2,ch2,10); GetDlgItemText(IDC_EDIT3,ch3,10); GetDlgItemText(IDC_EDIT4,ch4,10); GetDlgItemText(IDC_EDIT6,ch5,10); GetDlgItemText(IDC_EDIT7,ch6,10); GetDlgItemText(IDC_EDIT8,ch7,10); a=atoi(ch1); b=atoi(ch2); /类型转换 c=atoi(ch3); d=atoi(ch4); e=(a+b+c+d)/4; itoa(e,ch5,10); SetDlgItemText(IDC_EDIT6,ch5); m_list1.SetItemText(count,5,ch5); int m,n; m=sqrt(a-e)*(a-e)+(b-e)*(b-e)+(c-e)*(c-e)+(d-e)*(d-e)/4); n=a+b+c+d; itoa(m,ch6,1