c++mfc上机实习报告.docx
- 文档编号:13525691
- 上传时间:2023-06-15
- 格式:DOCX
- 页数:25
- 大小:540.16KB
c++mfc上机实习报告.docx
《c++mfc上机实习报告.docx》由会员分享,可在线阅读,更多相关《c++mfc上机实习报告.docx(25页珍藏版)》请在冰点文库上搜索。
c++mfc上机实习报告
《面向对象程序设计》
课程设计报告
学号:
201*****
班级序号:
11*****
姓名:
******
指导老师:
陈亮老师
成绩:
中国地质大学(武汉)
信息工程学院信息工程系
2014年6月17日
上机题目一
1、题目:
橡皮筋画线程序,要求:
(1)基本要求
利用鼠标在视图上绘制线,能够设置线的颜色和宽度;
能够用鼠标拾取绘制的某条线,被选中的线能够高亮显示,并且弹出对话框,输入线的属性保存起来;
(2)高阶要求
能够将绘制的线数据保存在Line.dat文本文件中;
打开线数据文件Line.dat,可以显示出文件里面的线图形。
(3)可选功能
文字能够在视图任意地方点击鼠标后输入。
(提示:
可以使用STL中的容器来管理数据。
)
2、设计思路:
利用MFC中的单文档,在view函数中添加up和down的命令响应函数,使实现画线的功能,并在函数中增加特定代码使实现设置线宽和颜色(具体函数代码可以从书上找到),同样的添加保存和打开所画的线、能输入文字的命令函数。
3、实现情况和能改进的地方:
代码运行成果是可以改变线宽和颜色,并且在运行出的窗口的大小改变构绘制的线不会消失,可以保存并打开绘制的线,能在视图的任何地方输入文字。
用鼠标拾取绘制的线并高亮显示没有实现,保存时直接保存的绘制的线,而并没有将所画线的属性保存下来,没有dat类型的文件。
4、具体代码如下:
设置线宽的对话框的代码:
(因引入对话框,需添加头文件)
voidCHuiView:
:
OnSetting()
{
//TODO:
Addyourcommandhandlercodehere
CSettingDlgdlg;
dlg.m_nLineWidth=m_nLineWidth;
if(IDOK==dlg.DoModal()){
m_nLineWidth=dlg.m_nLineWidth;
}
}
设置颜色的代码:
voidCHuiView:
:
OnColor()
{
//TODO:
Addyourcommandhandlercodehere
CColorDialogdlg;
dlg.m_cc.rgbResult=m_clr;
dlg.m_cc.Flags|=CC_RGBINIT|CC_FULLOPEN;
if(IDOK==dlg.DoModal())
{
m_clr=dlg.m_cc.rgbResult;
}
//dlg.DoModal();
}
文件保存于打开的代码:
voidCHuiView:
:
OnFileOpen()
{
//TODO:
Addyourcommandhandlercodehere
HMETAFILEhmetaFile;
hmetaFile=GetMetaFile("meta.wmf");
m_dcMetaFile.PlayMetaFile(hmetaFile);
DeleteMetaFile(hmetaFile);
Invalidate();
}
voidCHuiView:
:
OnFileSave()
{
//TODO:
Addyourcommandhandlercodehere
HMETAFILEhmetaFile;
hmetaFile=m_dcMetaFile.Close();
CopyMetaFile(hmetaFile,"meta.wmf");
m_dcMetaFile.Create();
DeleteMetaFile(hmetaFile);
}
在视图的任何地方输入文字:
(OnCreat和OnChar函数)
intCHuiView:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CView:
:
OnCreate(lpCreateStruct)==-1)
return-1;
CClientDCdc(this);
TEXTMETRICtm;
dc.GetTextMetrics(&tm);
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
ShowCaret();
//TODO:
Addyourspecializedcreationcodehere
return0;
}
voidCHuiView:
:
OnChar(UINTnChar,UINTnRepCnt,UINTnFlags)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
CClientDCdc(this);
TEXTMETRICtm;
dc.GetTextMetrics(&tm);
if(0x0d==nChar){
m_strLine.Empty();
m_ptOrigin.y+=tm.tmHeight;
}
elseif(0x08==nChar){
COLORREFclr=dc.SetTextColor(dc.GetBkColor());
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
m_strLine=m_strLine.Left(m_strLine.GetLength()-1);
dc.SetTextColor(clr);
}
else{
m_strLine+=nChar;
}
CSizesz=dc.GetTextExtent(m_strLine);
CPointpt;
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);
}
在运行窗口上保存绘制的线:
voidCHuiView:
:
OnDraw(CDC*pDC)
{
CHuiDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
CPenpen(PS_SOLID,m_nLineWidth,m_clr);
CBrush*pBrush=CBrush:
:
FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
pDC->SelectObject(pBrush);
for(inti=0;i pDC->MoveTo(((CGraph*)m_ptrArray.GetAt(i))->m_ptOrigin); pDC->LineTo(((CGraph*)m_ptrArray.GetAt(i))->m_ptEnd); } HMETAFILEhmetaFile; hmetaFile=m_dcMetaFile.Close(); pDC->PlayMetaFile(hmetaFile); m_dcMetaFile.Create(); m_dcMetaFile.PlayMetaFile(hmetaFile); DeleteMetaFile(hmetaFile); //TODO: adddrawcodefornativedatahere } 最终的up和down函数: voidCHuiView: : OnLButtonDown(UINTnFlags,CPointpoint) { //TODO: Addyourmessagehandlercodehereand/orcalldefault m_ptOrigin=point; SetCaretPos(point); m_strLine.Empty(); CView: : OnLButtonDown(nFlags,point); } voidCHuiView: : OnLButtonUp(UINTnFlags,CPointpoint) { //TODO: Addyourmessagehandlercodehereand/orcalldefault CClientDCdc(this); CPenpen(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.SelectObject(pBrush); CGraph*pGraph=newCGraph(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、题目: 学生学籍成绩管理系统 学生的信息包括: 姓名、学号、性别、班级、院系;学生的成绩信息包括英语、数学、程序设计及体育成绩等各门课的成绩; 定义如下类,并建立一个文本文件Student.dat,用于存储学生、课程与成绩的相关信息。 文件格式自己定义。 学生类CStudent(姓名、学号、性别、班级、院系); 课程类CLessen(课程名称、课程开设时间); 成绩类CGrade(学号、课程名称、成绩) 要求实现如下功能: ✧在对话框上能够添加、删除、编辑和查询课程信息; ✧在对话框上能够添加、删除、编辑和查询学生信息学生信息; ✧在对话框上能够增加、删除、编辑和查询学生的选课信息; ✧在对话框上能够录入和编辑学生某门课的考试成绩; ✧在对话框上能够按照学生姓名查询学生的选课信息和选课成绩,并统计出其总成绩、平均成绩,计算出该学生的成绩的标准差; ✧显示全班的学生成绩排名。 ✧统计出各班的平均成绩,并进行排名。 2、设计思路: 对话框的应用,在对话框上添加控件,将控件与具体函数或成员变量绑定,该题中利用此来实现编辑框与列表控件的同步,从而实现录入、查询、和编辑等功能。 将学生管理系统分为三部分: 学生个人信息、成绩和选课情况,三部分在具体处理上是一样的,成绩计算时,需进行类型转换。 3、实现结果及可改进的地方: 实现结果是能在对话框上进行录入、查询、编辑和删除。 在学生成绩的对话框上没有实现学生排名情况,可以无限录入但是没有数据的保存,不能整个班级排名和不同班级排名。 该题目中查询、录入都是在同一对话框实现的,可以再不同对话框实现,实现需要变量对应。 4、具体代码如下: 单击按钮,使弹出另一对话框: (固定,改变具体类名即可) voidCXUESHENGDlg: : OnButton1() { //TODO: Addyourcontrolnotificationhandlercodehere CStudentst; st.DoModal(); } 学生信息: 对编辑框定义对应的成员变量: m_xingming=_T(""); m_xingbie=_T(""); m_xuehao=_T(""); m_yuanxi=_T(""); m_zhuanye=_T(""); 列表控件在相同对话框内,定义对用成员变量: DDX_Control(pDX,IDC_LIST1,m_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 录入按钮及列表控件设置代码: voidCStudent: : OnButton1() { //TODO: Addyourcontrolnotificationhandlercodehere UpdateData(TRUE);//将界面的数据更新到对应的变量中 intcount=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("已录入学生信息! "); } BOOLCStudent: : OnInitDialog() { CDialog: : OnInitDialog(); //TODO: Addextrainitializationhere DWORDdwStyle=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,"性别",LVCFMT_LEFT,60); m_list.InsertColumn(2,"学号",LVCFMT_LEFT,60); m_list.InsertColumn(3,"院系",LVCFMT_LEFT,60); m_list.InsertColumn(4,"专业",LVCFMT_LEFT,60); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol //EXCEPTION: OCXPropertyPagesshouldreturnFALSE } 删除按钮: voidCStudent: : OnButton2() { //TODO: Addyourcontrolnotificationhandlercodehere BOOLfindok=FALSE; for(inti=0;i { if(m_list.GetItemState(i,LVIS_SELECTED)==LVIS_SELECTED) { m_list.DeleteItem(i); MessageBox("已删除所选学生信息"); findok=TRUE; } } if(findok! =TRUE) MessageBox("请先选择需要删除的学生"); UpdateData(FALSE); } 查询按钮(按名字查询): voidCStudent: : OnSearch() { //TODO: Addyourcontrolnotificationhandlercodehere inti; BOOLtemp=FALSE; UpdateData(TRUE); for(i=0;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); m_zhuanye=m_list.GetItemText(i,4); UpdateData(FALSE); temp=TRUE; break; } } if(temp==FALSE) MessageBox("没有该学生的记录! "); UpdateData(FALSE); } 编辑按钮: (按名字一样修改) voidCStudent: : OnGai() { //TODO: Addyourcontrolnotificationhandlercodehere Cgaiga; ga.DoModal(); inti; BOOLtemp=FALSE; UpdateData(TRUE); for(i=0;i { //if(temp=true) if(ga.m_xingming==m_list.GetItemText(i,0)) {//m_xingming=ga.m_xingming; intcount=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,ga.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("修改失效! "); } 在成绩和选课情况的对话框上,录入、查询、编辑、删除的代码只需改变给的成员变量名,具体实现是一样的。 成绩: 成员变量: 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,IDC_EDIT6,m_pingjun); DDX_Text(pDX,IDC_EDIT7,m_cha); DDX_Text(pDX,IDC_EDIT2,m_shuxue); DDX_Text(pDX,IDC_EDIT1,m_yingyu); 列表控件与编辑框的同步,(录入)及平均数、方差的计算,并将计算结果同时在编辑框列表控件中显示。 voidCGrade: : OnButton1() { //TODO: Addyourcontrolnotificationhandlercodehere UpdateData(TRUE);//将界面的数据更新到对应的变量中 intcount=m_list1.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); inta,b,c,d,e; charch1[10],ch2[10],ch3[10],ch4[10],ch5[10],ch6[10],ch7[10]; GetDlgItemText(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); intm,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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- mfc 上机 实习 报告