MFC报告.doc
《MFC报告.doc》由会员分享,可在线阅读,更多相关《MFC报告.doc(15页珍藏版)》请在冰点文库上搜索。
面向对象课程设计指导书
《面向对象程序设计》
课程设计报告
学号:
班级序号:
姓名:
指导老师:
成绩:
XXX大学
XXX学院XXX系
2010年7月
实习题目一
1、橡皮筋画线程序,要求:
²利用鼠标在视图上绘制线,能够设置线的颜色和宽度;
²能够用鼠标拾取绘制的某条线,被选中的线能够高亮显示,并且弹出对话框,输入线的属性保存起来;
²能够将绘制的线数据保存在Line.dat文本文件中;
²打开线数据文件Line.dat,可以显示出文件里面的线图形。
【算法设计】
(1)设计思想:
首先自己定义一支画笔,通过对话框改变其宽度,颜色(RGB值).当点击划线按钮时开始划线,点击设置按钮能够改变线的各种属性,划线完成后点击拾取按钮,用鼠标左键点击你要选中的线条,可以发现选中的线条会变成黄色的,高亮度显示,然后弹出对话框,通过它课以改变这条线的属性,最后是文件管理按钮,里面包含有保存和打开两个选项,当你划线完成后点击保存所画的线条各个属性通过OnSave()函数就会保存在line.dat文件中.其中的拾取需要一个确定你选的点是不是在画的线条上,设计的算法为:
选中的点到所画线条的两个端点的距离之和(A+B)是否等于线段的长度C,由于一次选中可能较小,于是可以让(A+B)-C在一个范围里变成一个扁的椭圆.重点就是这个选中算法.
(2)设计表示:
划
线
文
件
管
理
设
置
开
始
拾
取
保
存
打
开
点击开始划线否则不能执行此操作
设置线条属性
对选中的线条高亮显示并可以改变属性
存线条属性
打开线条
【调试报告】
菜单栏:
点击开始,所画线条:
点击设置按钮:
宽度设置为110颜色改变为(255,0,0)后所画线条:
点击拾取按钮所画线条高亮显示并弹出改变属性按钮:
点击保存按钮:
【附录】
添加消息响应函数:
voidCDrawlineView:
:
OnLButtonDown(UINTnFlags,CPointpoint)鼠标左键点下响应
voidCDrawlineView:
:
OnLButtonUp(UINTnFlags,CPointpoint)鼠标左键弹起响应
voidCDrawlineView:
:
OnMouseMove(UINTnFlags,CPointpoint)鼠标移动响应
创建画笔画笔的线性,颜色,宽度和划线功能的实现:
CClientDCdc(this);
CPenMypen;
CPen*pOldPen;
Mypen.CreatePen(PS_SOLID,width,RGB(red,green,blue));
pOldPen=dc.SelectObject(&Mypen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen);
保存线条属性:
CGraph*pGraph=newCGraph(m_ptOrigin,m_ptEnd,width,red,green,blue);
m_ptrArray.Add(pGraph);新建一个指针型类对象保存各个属性。
窗口重绘使得窗口放大后依然显示所画的图像在OnDraw()函数中实现:
voidCDrawlineView:
:
OnDraw(CDC*pDC)
{
CDrawlineDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
for(inti=0;i {
CClientDCdc(this);
CPenMypen;
CPen*pOldPen;
还原划线时的画笔的属性值以便重新划线:
Mypen.CreatePen(PS_SOLID,((CGraph*)m_ptrArray.GetAt(i))->width,RGB(((CGraph*)m_ptrArray.GetAt(i))->red,((CGraph*)m_ptrArray.GetAt(i))->green,((CGraph*)m_ptrArray.GetAt(i))->blue));
pOldPen=dc.SelectObject(&Mypen);
dc.MoveTo(((CGraph*)m_ptrArray.GetAt(i))->m_ptOrigin);
dc.LineTo(((CGraph*)m_ptrArray.GetAt(i))->m_ptEnd);
dc.SelectObject(pOldPen);
}
//TODO:
adddrawcodefornativedatahere
}
设置对话框中传值函数,通过对话框设置线条的各个属性:
CGetDlggetdlg;设置对话框的调用。
getdlg.m_nwidth=width;
getdlg.m_nred=red;
getdlg.m_ngreen=green;
getdlg.m_nblue=blue;
if(IDOK==getdlg.DoModal())
{
width=getdlg.m_nwidth;线宽传值
red=getdlg.m_nred;
green=getdlg.m_ngreen;传值的实现
blue=getdlg.m_nblue;传值的实现
}
拾取函数,确定是否选中的是所画的线条:
boolCGraph:
:
GetLength(CPointpoint)
{
doubledistent1,distent2,distent3;声明三个变量
distent1=sqrt((point.x-m_ptOrigin.x)*(point.x-m_ptOrigin.x)+(point.y-m_ptOrigin.y)*(point.y-m_ptOrigin.y));
distent2=sqrt((point.x-m_ptEnd.x)*(point.x-m_ptEnd.x)+(point.y-m_ptEnd.y)*(point.y-m_ptEnd.y));
distent3=sqrt((m_ptEnd.x-m_ptOrigin.x)*(m_ptEnd.x-m_ptOrigin.x)+(m_ptEnd.y-m_ptOrigin.y)*(m_ptEnd.y-m_ptOrigin.y));线段的长度
if(((distent1+distent2)-distent3)<0.1&&((distent1+distent2)-distent3)>-0.1)计算距离
{
return1;返回的值用以响应是否高亮显示函数
}
else
{
return0;
}
}
保存与打开函数的实现:
voidCDrawlineView:
:
OnSave()
{
//TODO:
Addyourcommandhandlercodehere
char*filename="D:
\\Line.dat";
CStdioFileLine;
CFileExceptionfileException;
if(Line.Open(filename,CFile:
:
typeText|CFile:
:
modeCreate|CFile:
:
modeReadWrite),&fileException)
{
CStringstr;
for(inti=0;i {
str.Format("%d,%d,%d,%d,%d,%d,%d,%d,",((CGraph*)m_ptrArray.GetAt(i))->width,((CGraph*)m_ptrArray.GetAt(i))->red,((CGraph*)m_ptrArray.GetAt(i))->green,((CGraph*)m_ptrArray.GetAt(i))->blue,((CGraph*)m_ptrArray.GetAt(i))->m_ptOrigin.x,((CGraph*)m_ptrArray.GetAt(i))->m_ptOrigin.y,((CGraph*)m_ptrArray.GetAt(i))->m_ptEnd.x,((CGraph*)m_ptrArray.GetAt(i))->m_ptEnd.y);
保存的线条的各个属性值
Line.WriteString(str);
}
}
Line.Close();
MessageBox("文件已成功保存在D盘得line.dat中!
");
}
voidCDrawlineView:
:
OnOpen()
{
//TODO:
Addyourcommandhandlercodehere
char*filename="D:
\\Line.dat";
CStdioFileLine;
CFileExceptionfileException;
if(Line.Open(filename,CFile:
:
typeText|CFile:
:
modeReadWrite),&fileException)
{
long length=Line.GetLength();
int *Line_Array;
Line_Array=newint[length/2];
CStringstr="",str1="";
charch[1];
Line.SeekToBegin();
intm=0;
for(intj=0;j {
Line.Read(ch,1);
if(ch[0]!
=',')
{
str=str+ch[0];
}
else
{
Line_Array[m++]=atoi(str);
str="";
}
}
Line.Close();
for(intn=0;n {
delete(m_ptrArray.GetAt(n));
}
m_ptrArray.RemoveAll();
for(inti=0;i {
m_ptOrigin.x=Line_Array[i+4];
m_ptOrigin.y=Line_Array[i+5];
m_ptEnd.x=Line_Array[i+6];
m_ptEnd.y=Line_Array[i+7];
CGraph*pGraph=newCGraph(m_ptOrigin,m_ptEnd,width=Line_Array[i],red=Line_Array[i+1],green=Line_Array[i+2],blue=Line_Array[i+3]);
m_ptrArray.Add(pGraph);
}
Invalidate();
}
}
主要的函数就是大体这些。
最后能够很好的运行。
实习题目二
学生学籍成绩管理系统
学生的信息包括:
姓名、学号、性别、班级、院系;学生的成绩信息包括英语、数学、程序设计及体育成绩等各门课的成绩;
定义如下类,并建立一个文本文件Student.dat,用于存储学生、课程与成绩的相关信息。
文件格式自己定义。
学生类CStudent(姓名、学号、性别、班级、院系);
课程类CLessen(课程名称、课程开设时间);
成绩类CGrade(学号、课程名称、成绩)
要求实现如下功能:
²在对话框上能够添加、删除、编辑和查询课程信息;
²在对话框上能够添加、删除、编辑和查询学生信息学生信息;
²在对话框上能够增加、删除、编辑和查询学生的选课信息;
²在对话框上能够录入和编辑学生某门课的考试成绩;
²在对话框上能够按照学生姓名查询学生的选课信息和选课成绩,并统计出其总成绩、平均成绩,计算出该学生的成绩的标准差;
²显示全班的学生成绩排名。
²统计出各班的平均成绩,并进行排名。
【算法设计】
(1)设计思想:
本题我个人认为最主要的是对话框的设计,能够达到一个对话框多用途,通过添加信息然后能够查询。
其次是类的设计,由于这题用到得对话框较多,所以变量的申明也要有技巧,还有就是对话上的按钮了,按钮的功能要齐全,并且达到最少等都比较重要。
能够进行计算每次输入的学生信息进行计算总分,平均分和方差等,还要对所有的学生成绩进行处理排名。
(2)设计表示:
基本信息编辑
基本信息添加
全部信息显示
选课信息添加
选课信息编辑
学生信息
信息管理
【调试报告】
菜单栏:
添加信息对话框通过它可以添加学生的各类基本信息:
添加两个以上然后点击全部信息,然后查询:
点击编辑学生信息按钮来改变学生的基本信息:
对选课信息进行编辑添加一门课程:
然后可以在基本信息栏内进行查询可以看到学生的选课信息。
一些基本信息保存在student.dat文件夹中,如
文件夹内部是保存的学生信息:
代码设计:
建立学生类用来存放学生基本信息:
CStudent:
:
CStudent(CStringm_stuname,CStringm_stunum,CStringm_stusex,CStringm_stuclass,CStringm_stuyard)
{
this->m_stuname=m_stuname;
this->m_stunum=m_stunum;
this->m_stusex=m_stusex;
this->m_stuclass=m_stuclass;
this->m_stuyard=m_stuyard;
}
建立成绩类用来放学生的成绩信息:
CLesson:
:
CLesson(CStringm_lesname,CStringm_lestime)
{
this->m_lesname=m_lesname;
this->m_lestime=m_lestime;
}
添加学生信息函数的响应及保存函数的响应:
voidCStuManageView:
:
OnAddinfo()
{
//TODO:
Addyourcommandhandlercodehere
CAddinfDlgaddinf;
if(IDOK==addinf.DoModal())
{
CStudent*stu=newCStudent(addinf.m_Aname,addinf.m_Anum,addinf.m_Asex,addinf.m_Aclass,addinf.m_Ayard);
m_ptrArrayS.Add(stu);
CSocre*soc=newCSocre(addinf.m_Amath,addinf.m_Aenglish,addinf.m_Acomputer,addinf.m_Asport);
m_ptrArrayG.Add(soc);
char*filename="Student.dat";
CStdioFileStudent;
CFileExceptionfileException;
if(Student.Open(filename,CFile:
:
typeText|CFile:
:
modeCreate|CFile:
:
modeReadWrite),&fileException)
{
CStringstr;
for(inti=0;i {
str.Format("%s,%s,%s,%s,%s,%s,%s,%s,%s",((CStudent*)m_ptrArrayS.GetAt(i))->m_stuname,((CStudent*)m_ptrArrayS.GetAt(i))->m_stunum,((CStudent*)m_ptrArrayS.GetAt(i))->m_stusex,((CStudent*)m_ptrArrayS.GetAt(i))->m_stuclass,((CStudent*)m_ptrArrayS.GetAt(i))->m_stuyard,((CSocre*)m_ptrArrayG.GetAt(i))->m_stumath,((CSocre*)m_ptrArrayG.GetAt(i))->m_stuengl,((CSocre*)m_ptrArrayG.GetAt(i))->m_stucomp,((CSocre*)m_ptrArrayG.GetAt(i))->m_stuspor);保存输入的信息
Student.WriteString(str);
str.Format("\r\n");
Student.WriteString(str);
}
}
Student.Close();
MessageBox("信息已成功保存在Student.datÎ文件中!
");
}
}
编辑键的消息响应函数:
voidCExercise5Dlg:
:
OnDelete()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
for(longi=0;i {
查询要删除的对象信息
if(m_studentNumber!
=0&&m_studentNumber==m_studentList[i].m_CSstudentNumber)
{
m_studentList[i].clear();
删除
//while(m_studentList[i+1].m_CSstudentNumber!
=0)
//{
// i++;
//}
//¸üÐÂÊý¾Ý
if((i+1) {
m_studentName=m_studentList[i+1].m_CSstudentName;
m_studentNumber=m_studentList[i+1].m_CSstudentNumber;
m_studentSex=m_studentList[i+1].m_CSstudentSex;
m_studentClass=m_studentList[i+1].m_CSstudentClass;
m_studentCollege=m_studentList[i+1].m_CSstudentCollege;
m_ComputerGrade=m_studentList[i+1].m_CSComputerGrade;
m_EnglishGrade=m_studentList[i+1].m_CSEnglishGrade;
m_MathGrade=m_studentList[i+1].m_CSMathGrade;
m_PEGrade=m_studentList[i+1].m_CSPEGrade;
m_totalGrade=m_MathGrade+m_EnglishGrade+m_ComputerGrade+m_PEGrade;
m_averageGrade=m_totalGrade/4;
m_standardDiffer=sqrt(((m_averageGrade-m_MathGrade)*(m_averageGrade-m_MathGrade)+(m_averageGrade-m_EnglishGrade)*(m_averageGrade-m_EnglishGrade)+(m_averageGrade-m_ComputerGrade)*(m_averageGrade-m_ComputerGrade)+(m_averageGrade-m_PEGrade)*(m_averageGrade-m_PEGrade))/4);
UpdateData(false);
break;
}
else
{
m_studentName=m_studentList[i].m_CSstudentName;
m_studentNumber=m_studentList[i].m_CSstudentNumber;
m_studentSex=m_studentList[i].m_CSstudentSex;
m_studentClass=m_studentList[i].m_CSstudentClass;
m_studentCollege=m_studentList[i].m_CSstudentCollege;
m_ComputerGrade=m_studentList[i].m_CSComputerGrade;
m_EnglishGrade=m_studentList[i].m_CSEnglishGrade;
m_MathGrade=m_studentList[i].m_CSMathGrade;
m_PEGrade=m_studentList[i].m_CSPEGrade;
m_totalGrade=m_MathGrade+m_EnglishGrade+m_ComputerGrade+m_PEGrade;
m_averageGrade=m_totalGrade/4;
m_standardDiffer=sqrt(((m_averageGrade-m_MathGrade)*(m_averageGrade-m_MathGrade)+(m_averageGrade-m_EnglishGrade)*(m_averageGrade-m_EnglishGrade)+(m_averageGrade-m_ComputerGrade)*(m_averageGrade-m_ComputerGrade)+(m_averageGrade-m_PEGrade)*(m_averageGrade-m_PEGrade))/4); UpdateData(false);
}
break;
}