VC++报告有截图.docx
《VC++报告有截图.docx》由会员分享,可在线阅读,更多相关《VC++报告有截图.docx(26页珍藏版)》请在冰豆网上搜索。
VC++报告有截图
课程设计报告
(VC++)
软件设计
学院:
XXX
学号:
XXX
姓名:
XXX
指导老师:
XXX
实验内容
前言:
本课程设计分成自测题和综合题两部分。
两部分都列入验收。
共11道。
内容覆盖主要基本技术:
基本的开发环境(调试技术),文件操作,动态链接库,图形图像编程,多线程编程,控件开发等。
每个学生选择5个完成,要求如下:
必做:
1;
2,3选择其一;
4,5选择其一;
6-11选择其二;
一、练习题:
1、基本环境调试
将例程1用VC++打开,修改错误使程序能够运行。
理解编译错误,运行错误等。
2、数据库操作
通过ODBC数据源访问数据库(ACCESS),数据库中保存以下内容:
学生姓名,性别,年龄,家庭住址,电话,电子邮件,爱好等。
再以上基础上进行该记录的读出并可编辑浏览显示。
3、图形编程
提供一个图形工具界面,让用户能够画出直线,椭圆,多边形等几何元素,结果可以保存并可读出。
4、字符串操作
能够从磁盘上选择打开文本文档,读入所有内容并显示,统计所有的字符数目,单词数目,中文字符串的数目。
5、动态链接库
目的:
了解MFC支持的三种动态链接库:
Win32DLL,MFC常规DLL,MFC扩展库。
掌握封装DLL的基本方法。
二、综合题:
6.卡拉OK点歌管理系统
在本地硬盘库里存放歌曲文件(暂定WAV文件格式)。
按照歌手,歌名(字数),类别进行检索播放。
对歌曲库可以进行管理,如添加,删除等。
计时计费功能。
基本步骤:
实验环境
VC++6.0
Access
实验步骤
基础题
设计一:
改错
程序说明:
本题是一道改错题,根据已经给出的例程1进行改错及完善的操作。
关键问题在于需要素数的存储,该题所给是数组,属于静态分配,最好改为动态的。
本题的主要目的是熟悉VC的编译环境,为下面的题目做铺垫。
程序修改如下:
调试结果如下:
设计二:
数据库连接
程序说明:
本题是使用ACCESS数据库存储学生信息,利用ODBC将MFC界面与ACCESS数据库连接起来,从而可以在可视化界面上显示数据内容并完成查询、添加、编辑和删除的功能。
查询功能是通过将用户输入的文本信息取出,并在数据库中检索对应字段的信息,若检索成功,则在界面上显示相对应的学生信息,否则提示无此学生信息。
添加和编辑都需要使用新的对话框,通过将新对话框中文本框的内容存入数据库学生表中,以实现添加或对现有数据的编辑功能。
删除功能和显示功能大致相同,由于数据是绑定的,无需全表字段检索,很容易实现对指定记录的删除操作。
设计流程图:
调试结果:
程序(查询,添加,删除):
voidCMy2ODBCView:
:
OnBUTTONquery()//查找
{
UpdateData();//把控件的内容赋给当前记录字段变量
m_strQuery.TrimLeft();//从左取数
if(m_strQuery.IsEmpty())
{
MessageBox("Thenumbercannotbeempty!
");//
return;
}
if(m_pSet->IsOpen())//如果记录集打开,则先关闭
m_pSet->Close();
m_pSet->m_strFilter.Format("studentno=%s",m_strQuery);//指定查询条件
m_pSet->m_strSort="ssex";//按性别小到大排序
m_pSet->Open();
if(!
m_pSet->IsEOF())//如果打开记录集,有记录(指针不指向队尾)
UpdateData(FALSE);//自动更新表中控件显示的内容
else
MessageBox("Norecords!
");//TODO:
Addyourcontrolnotificationhandlercodehere
}
voidCMy2ODBCView:
:
OnButton1()//增加记录
{
ADDdlg;//弹出ADD类窗口
if(dlg.DoModal()==IDOK)//如果弹出并选中“OK”
{
m_pSet->AddNew();//队尾增加新记录
m_pSet->m_studentno=dlg.m_sno;m_pSet->m_ssex=dlg.m_sex;
m_pSet->m_sage=dlg.m_age;m_pSet->m_saddress=dlg.m_ad;
m_pSet->m_stel=dlg.m_tel;m_pSet->m_smail=dlg.m_mail;
m_pSet->m_shobby=dlg.m_hobby;m_pSet->m_sname=dlg.m_name;
m_pSet->Update();//更新数据
m_pSet->Requery();//对快照模式有效
}
//TODO:
Addyourcontrolnotificationhandlercodehere
}
voidCMy2ODBCView:
:
OnButton3()//修改
{
ADDdlg;//已下展现旧数据
dlg.m_sno=m_pSet->m_studentno;dlg.m_sex=m_pSet->m_ssex;
dlg.m_age=m_pSet->m_sage;dlg.m_ad=m_pSet->m_saddress;
dlg.m_tel=m_pSet->m_stel;dlg.m_mail=m_pSet->m_smail;
dlg.m_hobby=m_pSet->m_shobby;dlg.m_name=m_pSet->m_sname;
if(dlg.DoModal()==IDOK)//更新
{
m_pSet->Edit();
m_pSet->m_studentno=dlg.m_sno;m_pSet->m_ssex=dlg.m_sex;
m_pSet->m_sage=dlg.m_age;m_pSet->m_saddress=dlg.m_ad;
m_pSet->m_stel=dlg.m_tel;m_pSet->m_smail=dlg.m_mail;
m_pSet->m_shobby=dlg.m_hobby;m_pSet->m_sname=dlg.m_name;
m_pSet->Update();
UpdateData(FALSE);
}
//TODO:
Addyourcontrolnotificationhandlercodehere
}
voidCMy2ODBCView:
:
OnButton2()//删除
{
CRecordsetStatusstatus;//结构体状态,记录号、记录总数
m_pSet->GetStatus(status);//获得当前记录结构体状态信息
m_pSet->Delete();
if(status.m_lCurrentRecord==0)
m_pSet->MoveNext();
else
m_pSet->MoveFirst();
UpdateData(FALSE);
//TODO:
Addyourcontrolnotificationhandlercodehere
}
设计三:
图形编辑
程序说明:
本题是使用MFC实现在界面上绘图的功能,提供一个图形工具界面,让用户能够画出直线,椭圆,多边形等几何元素,结果可以保存并可读出。
关键问题是确定用户选择的图形类型,从而可以调用相应的类库,并将类实例化之后使用其中各种绘图函数。
同时需要记录用户鼠标点击的操作,获取鼠标指针当前的屏幕坐标,确定图形的起始位置和结束位置。
流程
编译结果:
程序:
voidCMy4drawView:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
CView:
:
OnLButtonDown(nFlags,point);//鼠标动作
m_ptOrigin=point;//设置起始坐标
on=1;//按键按下判定字
}
voidCMy4drawView:
:
OnLButtonUp(UINTnFlags,CPointpoint)
{
CClientDCpDC(this);//客户区绘图函数
if(getshape()==2)//矩形
{
pDC.SelectStockObject(HOLLOW_BRUSH);
CPenPen(PS_SOLID,1,getcolour());//创建画笔
pDC.SelectObject(&Pen);
pDC.Rectangle(m_ptOrigin.x,m_ptOrigin.y,point.x,point.y);
Pen.DeleteObject();
}
elseif(getshape()==4)
{
pDC.SelectStockObject(HOLLOW_BRUSH);
CPenPen(PS_SOLID,1,getcolour());
pDC.SelectObject(&Pen);
pDC.Ellipse(m_ptOrigin.x,m_ptOrigin.y,point.x,point.y);
Pen.DeleteObject();
}
elseif(getshape()==3)
{
pDC.SelectStockObject(HOLLOW_BRUSH);
doubler=pow((point.x-m_ptOrigin.x)*(point.x-m_ptOrigin.x)+(point.y-m_ptOrigin.y)*(point.y-m_ptOrigin.y),0.5);
CPointm=point+m_ptOrigin;
m.x/=2;
m.y/=2;
CPenPen(PS_SOLID,1,getcolour());
pDC.SelectObject(&Pen);
pDC.Ellipse(m.x-r,m.y-r,m.x+r,m.y+r);
Pen.DeleteObject();
}
elseif(getshape()==1)
{
CPenPen(PS_SOLID,1,getcolour());
pDC.SelectObject(&Pen);
pDC.MoveTo(m_ptOrigin);
pDC.LineTo(point.x,point.y);
Pen.DeleteObject();
}
on=0;
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
CView:
:
OnLButtonUp(nFlags,point);
}
//定义形参,跨类传递数值colour,width,kind,shape
intCMy4drawView:
:
getcolour(){CMainFramea;returna.colour;}
doubleCMy4drawView:
:
getwidth(){CMainFramea;returna.width;}
intCMy4drawView:
:
getkind(){CMainFramea;returna.kind;}
intCMy4drawView:
:
getshape(){CMainFramea;returna.shape;}
voidCMy4drawView:
:
OnMouseMove(UINTnFlags,CPointpoint)
{
CClientDCpDC(this);
CMy4drawDoc*p=GetDocument();
if(getkind()==1)
{
HCURSORhCursor=SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_pencil));//设定不同功能对应的光标
}
elseif(getkind()==2)
{
HCURSORhCursor=SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_rubber));
}
elseif(getkind()==0)
{
HCURSORhCursor=SetCursor(LoadCursor(NULL,IDC_CROSS));
}
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
if(getkind()==1&&on==1)
{
CPennewPen(PS_SOLID,getwidth(),getcolour());
CPen*old=pDC.SelectObject(&newPen);
pDC.MoveTo(m_ptOrigin);
pDC.LineTo(point.x,point.y);
m_ptOrigin=point;
}
elseif(getkind()==2&&on==1)
{
intclr=RGB(255,255,255);
CPennewpen(PS_SOLID,getwidth()+5,clr);
CPen*oldpen=pDC.SelectObject(&newpen);
pDC.MoveTo(m_ptOrigin);
pDC.LineTo(point.x,point.y);
m_ptOrigin=point;
}
elseif(getshape()==2&&on==1)
{
pDC.SetROP2(R2_NOT);
pDC.SelectStockObject(HOLLOW_BRUSH);
pDC.Rectangle(m_ptOrigin.x,m_ptOrigin.y,point.x,point.y);
CPenPen(PS_SOLID,1,getcolour());//width=1only!
pDC.SelectObject(&Pen);
pDC.Rectangle(m_ptOrigin.x,m_ptOrigin.y,point.x,point.y);
Pen.DeleteObject();
}
elseif(getshape()==4&&on==1)
{
pDC.SetROP2(R2_NOT);
pDC.SelectStockObject(HOLLOW_BRUSH);
pDC.Ellipse(m_ptOrigin.x,m_ptOrigin.y,point.x,point.y);
CPenPen(PS_SOLID,1,getcolour());
pDC.SelectObject(&Pen);
pDC.Ellipse(m_ptOrigin.x,m_ptOrigin.y,point.x,point.y);
Pen.DeleteObject();
}
elseif(getshape()==3&&on==1)//圆
{
pDC.SetROP2(R2_NOT);
pDC.SelectStockObject(HOLLOW_BRUSH);
inta=(m_ptOrigin.x)<(m_ptOrigin.y)?
m_ptOrigin.y:
m_ptOrigin.x;
intb=(point.x)>(point.y)?
point.y:
point.x;
intc=(point.x)>(point.y)?
point.y:
point.x;
doubler0=pow((m_ptOrigin.x-point.x)*(m_ptOrigin.x-point.x)+(m_ptOrigin.y-point.y)*(m_ptOrigin.y-point.y),0.5);
doubler=pow((point.x-m_ptOrigin.x)*(point.x-m_ptOrigin.x)+(point.y-m_ptOrigin.y)*(point.y-m_ptOrigin.y),0.5);//#include!
!
CPointm=point+m_ptOrigin;
CPointm0=m_ptOrigin+point;
m.x/=2;
m.y/=2;
m0.x/=2;
m0.y/=2;
pDC.Ellipse(m0.x-r0,m0.y-r0,m0.x+r0,m0.y+r0);
CPenPen(PS_SOLID,1,getcolour());
pDC.SelectObject(&Pen);
pDC.Ellipse(m.x-r,m.y-r,m.x+r,m.y+r);
Pen.DeleteObject();
}
elseif(getshape()==1&&on==1)
{
pDC.SetROP2(R2_NOT);
pDC.MoveTo(m_ptOrigin);
pDC.LineTo(point);
CPenPen(PS_SOLID,1,getcolour());
pDC.SelectObject(&Pen);
pDC.MoveTo(m_ptOrigin);
pDC.LineTo(point.x,point.y);
Pen.DeleteObject();
}
CView:
:
OnMouseMove(nFlags,point);
}
设计四:
字符串的操作
程序说明:
能够从磁盘上选择打开文本文档,读入所有内容并显示,统计所有的字符数目,单词数目,中文字符串的数目。
程序:
voidresult:
:
OnOK()
{
//打开文档//
CFileDialogfiledlg(true);
filedlg.m_ofn.lpstrTitle="OpenText";
filedlg.m_ofn.lpstrFilter="TextFile(*.txt)\0*.txt\0AllFiles(*.*)\0*.*\0\0";
if(filedlg.DoModal()==IDOK)
{
CFilefile(filedlg.GetFileName(),CFile:
:
modeRead);
staticchar*str;
DWORDdword;
dword=file.GetLength();
str=newchar[dword+1];
str[dword]=0;
file.Read(str,dword);//读取内容//
file.Close();
lenght=dword;
buf=str;
/////////////////////////////////////////////////////////////////////////////
开始计数
total=0;cwords=0;ewords=0;
boolisWord=true;
for(inti=0;i{
if(buf[i]==0x20)
{
isWord=true;
}
elseif(buf[i]>'A'&&buf[i]<'z')
{
total++;
if(isWord)
{
isWord=false;
ewords++;
}
}
elseif(buf[i]>='0'&&buf[i]<='9')
{
total++;
}
elseif(buf[i]<0)
{
cwords++;
isWord=true;
}
}
//更新对话框结果//
m_t=total+cwords/2;
m_c=cwords/2;
m_e=ewords;
UpdateData(FALSE);
}
MessageBox(buf,"Result");//显示文本
}
测试结果:
设计五:
动态链接
Win32,MFC,MFC扩展
程序说明:
目的:
了解MFC支持的三种动态链接库:
Win32DLL,MFC常规DLL,MFC扩展库。
掌握封装DLL的基本方法。
步骤:
新建三个不同的DLL工程;
分别封装一些类和函数;
新建一个测试工程对上述库里的函数或类进行调用;
封装一个对话框类到DLL,并新建一个工程调用之。
程序:
#include".\extendll\dlgext.h"//主程序
extern"C"_declspec(dllexport)intDisplay(inti);
extern"C"_declspec(dllexport)intSum(inti);
voidCTestdllDlg:
:
OnButton1()//ExtensionDLL
{
CDlgExtdlg;
dlg.DoModal();
}
voidCTestdllDlg:
:
OnButton2()//NormalDLL
{
UpdateData();
m_out.Format("%d",Display(m_i));
UpdateData(FALSE);
}
voidCTestdllDlg:
:
OnButton3()//Win32DLL
{
UpdateData(TRUE);
m_so=Sum(m_si);
UpdateData(FALSE);
}
Win32代码:
STDAPIDllUnregisterServer(void)
{
return_Module.UnregisterServer(TRUE);
}
extern"C"_declspec(dllexport)intSum(inti)
{
intm=0;
for(intj=0;j<=i;j++)
m+=j;
returnm;
}
//NormalDLL
CRegularDllApptheApp;
extern"C"_declspec(dllexport)intDisplay(inti)
{
intm=1;
for(intj=2;