VC++程序设计实验报告
一、实验目的
掌握MFC编程
二、实验内容
用MFC向导创建单文档应用程序,一个简单的画图程序。
n 使用C++语言实现
n 使用VC++6.0集成开发环境开发
n 使用MFC应用程序开发框架
三、实验步骤
n 基本功能描述
1. 打开exe文件,在绘图下拉菜单中可分别设置绘制的图形形状,如直线、曲线、矩形及椭圆,线宽选项,有1-6可供选择,线型选项有实线、虚线、点线和点段线供设置,还可以设置线色以及填充色,通过弹出的颜色对话框选择需要的颜色,如果不选择线宽、线色以及填充色,则按默认的画笔,画刷来绘制选择的图形。
2. 选择好图形后,通过鼠标可以绘制出相应的直线,矩形或椭圆,鼠标的按下确定图形的起点,鼠标的拖动则确定了图形的终点,即通过鼠标的拖动来决定图形的大小,当鼠标弹起,此图形则绘制完毕。
n 设计思路
1. 对需要用到的变量进行初始化。
2. 选择相应的图形之后就响应相应的消息处理函数,给shape赋对应的值。选择不同的线宽,线色与填充色,即可改变画笔或画刷的属性。
3. 鼠标的按下响应函数OnLButtonDown(),捕捉鼠标当前位置得到起点的坐标,鼠标的拖动响函数OnMouseMove()改变终点的坐标,鼠标的弹起响应OnLButtonUp(),确定终点坐标,刷新,得到绘制图形。
4. 选择图形或其它属性,可进行下一次绘制。
n 软件设计
A 设计步骤
1.创建单文档
创建一个MFC AppWizard[exe]工程,命名为“Draw”,如图1所示,并创建单文档,如图2所示。创建成功后,系统自动生成相应的类,如图3所示。
图1 创建工程
图2 创建单文档
图3 生成类
2.编辑菜单
添加需要的菜单项,如图4所示;并在菜单的属性中设定好所对应的ID,如图5所示,各项菜单对应的ID如表1所示(其中线宽菜单为弹出菜单,只需在菜单项目属性中的弹出选项前打勾即可,分隔线亦只需在菜单项目属性中选中分隔符选项即可)。
图4 添加菜单项
图5 设置菜单ID
表1 菜单项对应ID
建立类向导,在视图类CDrawView中,对各菜单项添加对应的COMMAND消息处理函数,部分菜单项还添加对应的UPDATE_COMMAND_UI消息函数,如图6所示。
图6 建立类向导
3.在相应消息函数处添加代码,实现其功能
建立类向导,在视图类CDrawView中,添加WM_PAINT消息,以及WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE消息,并在其中添加相应的代码。
B 关键功能实现
1.选择要绘制的图形
在直线、矩形以及椭圆的消息处理函数里为shape分别赋值为1,2,3,在OnPaint()函数里添加3个if语句的代码来这实现这三个图形的绘制:当选择画直线时,shape=1,则执行绘制直线代码,当选择画矩形时,shape =2,则执行绘制矩形的代码,当性选择画椭圆时,shape=3,则执行绘制椭圆的代码。
2.改变线宽
在OnPaint()创建的画笔中,pen.CreatePen(penstyle,w, m_nColor),线宽处用w表示,则改变w的值即改变了画笔的粗细。选择菜单绘图→线宽选择划线宽度值,此时所选的线宽值就赋给线宽变量w。若不选择线宽值,则w=1(即默认线宽值为1)。
3.改变线型
在OnPaint()创建的画笔中,pen.CreatePen(penstyle,w, m_nColor),线型处用penstyle表示,则改变penstyle的值即改变了画笔的类型。选择菜单绘图→线型选择线型,此时所选的线型就赋给线型变量penstyle。若不选择线型值,则penstyle=ID_SOLID(即默认线型为实线)。
4.改变线色
在OnPaint()创建的画笔中,pen.CreatePen(penstyle,w, m_nColor),线的颜色处用m_nColor表示,则改变m_nColor即改变了画笔的颜色。选择菜单绘图→颜色,会弹出通过WM_COLORREF从系统中引入的颜色选择对话框,选择颜色后,点击确定则相应颜色值就赋给变量m_nColor,此时画笔的颜色就会发上变化。若不选择颜色,则默认(线)颜色为黑色。
4.改变填充色
在OnPaint()创建的画刷中,brush.CreateSolidBrush(m_fColor),颜色就是用m_fColor表示的,改变m_fColor即改变了画刷的颜色。选择菜单绘图→填充色,会弹出通过WM_COLORREF从系统中引入的颜色选择对话框,选择颜色后,点击确定则相应颜色值就赋给变量m_fColor,此时画刷的颜色就会发上变化。若不选择颜色,则默认填充色为黑色。
5.绘制图形
鼠标左键按下,则捕获鼠标此时的位置坐标为画图的起点,此时在OnLButtonDown()函数里,将捕获的坐标值赋给定义作为起点的变量opoint;按下鼠标左键拖动鼠标时,捕捉鼠标当前位置坐标值为终点坐标值,此时在OnMouseMove()函数里,把捕获的坐标值赋给定义作为终点的变量cpoint,OnPaint()中绘图的代码中的坐标都得到了,进行绘图;鼠标左键弹起时,此时绘图结束,鼠标弹起时所在位置就是画图的最终终点位置,画图结束后,刷新窗口,以便重新画图,此时执行的是OnLButtonUp()函数。
四、 结果及源代码
4.1 运行结果
1.点击链接,编译,运行后的窗口如图7所示。
图7 运行结果
4.2 程序代码
1.在视图类构造函数中对各定义变量初始化
CDrawView::CDrawView()
{
w=1;//初始状态时线宽
shape=1;//初始状态时形状
m_nColor=RGB(0,0,0);//初始状态时线色
m_fColor=RGB(0,0,0);//初始状态时填充色
penstyle=PS_SOLID;//初始化线型为实线
}
2.形状函数
void CDrawView::OnLine()
{
shape=1;
}
void CDrawView::OnRect()
{
shape=2;
}
void CDrawView::OnEllipse()
{
shape=3;
}
3.线宽改变函数
void CDrawView::OnW1()
{
w=1;
}
void CDrawView::OnW2()
{
w=2;
}
void CDrawView::OnW3()
{
w=3;
}
void CDrawView::OnW4()
{
w=4;
}
void CDrawView::OnW5()
{
w=5;
}
void CDrawView::OnW6()
{
w=6;
}
4.线型选择函数
void CDrawView::OnSolid()
{
penstyle=PS_SOLID;
}
void CDrawView::OnDash()
{
penstyle=PS_DASH;
}
void CDrawView::OnDot()
{
penstyle=PS_DOT;
}
void CDrawView::OnDashdot()
{
penstyle=PS_DASHDOT;
}
5.颜色选择函数
void CDrawView::OnColor()
{
CColorDialog Color;//创建颜色对话框
if(Color.DoModal()==IDOK)//如果用户点击OK按钮
{
m_nColor=Color.GetColor();//更改颜色,把颜色赋到m_nColor
}
}
6.填充色选择函数
void CDrawView::OnFullcolor()
{
CColorDialog FullColor;//创建颜色对话框
if(FullColor.DoModal()==IDOK)//如果用户点击OK按钮
{
m_fColor=FullColor.GetColor();//更改颜色,把颜色赋到m_nColor
}
}
7.单击、移动、绘画函数
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
m_Down=TRUE; //鼠标按下
SetCapture(); //获取坐标
opoint=point; //把鼠标所在坐标赋给起点坐标opoint
ReleaseCapture(); //释放坐标
CView::OnLButtonDown(nFlags, point);
}
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
m_Down=FALSE; //鼠标不按下,即弹起
Invalidate(0); //刷新
CView::OnLButtonUp(nFlags, point);
}
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
if(m_Down) //如果鼠标按下
{
cpoint=point; //把鼠标所在点坐标赋给终点坐标cpoint
CClientDC dc(this);
if(4==shape)//画曲线
{
CPen pen(PS_SOLID,10,RGB(255,0,0));
CPen *oldpen=dc.SelectObject(&pen);
dc.MoveTo(opoint);
dc.LineTo(cpoint);
dc.SelectObject(oldpen);
opoint=cpoint;
}
}
CView::OnMouseMove(nFlags, point);
}
void CDrawView::OnPaint()
{
CPaintDC dc(this); // device context for painting
CPen pen; //定义画笔
CBrush brush; //定义画刷
pen.CreatePen(penstyle,w, m_nColor); //创建画笔
brush.CreateSolidBrush(m_fColor); //创建画刷
dc.SelectObject(&pen); //获取画笔
dc.SelectObject(&brush); //获取画刷
if(1==shape)//画直线
{
dc.MoveTo(opoint.x,opoint.y);
dc.LineTo(cpoint.x,cpoint.y); //绘制直线,从opoint到cpoint连线
}
if(2==shape)///画矩形
{
dc.Rectangle(opoint.x,opoint.y,cpoint.x,cpoint.y); //绘制矩形
}
if(3==shape)//画椭圆
{
dc.Ellipse(opoint.x,opoint.y,cpoint.x,cpoint.y);//绘制椭圆
}
}
8.菜单勾选函数
void CDrawView::OnUpdateLine(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(shape==1); //shape为1时,直线选项前打上勾
}
void CDrawView::OnUpdateRect(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(shape==2); //shape为2时,直线选项前打上勾
}
void CDrawView::OnUpdateEllipse(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(shape==3); //shape为3时,直线选项前打上勾
}
void CDrawView::OnUpdateW1(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(w==1); //当线宽为1时,此选项前标有圆点
}
void CDrawView::OnUpdateW2(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(w==2); //当线宽为2时,此选项前标有圆点
}
void CDrawView::OnUpdateW3(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(w==3); //当线宽为3时,此选项前标有圆点
}
void CDrawView::OnUpdateW4(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(w==4); //当线宽为4时,此选项前标有圆点
}
void CDrawView::OnUpdateW5(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(w==5); //当线宽为5时,此选项前标有圆点
}
void CDrawView::OnUpdateW6(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(w==6); //当线宽为6时,此选项前标有圆点
}
void CDrawView::OnUpdateSolid(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(penstyle==PS_SOLID); //当线型为实线时,此选项前标有圆 点
}
void CDrawView::OnUpdateDash(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(penstyle==PS_DASH); //当线型为虚线时,此选项前标有圆点
}
void CDrawView::OnUpdateDot(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(penstyle==PS_DOT); //当线型为点线时,此选项前标有圆点
}
void CDrawView::OnUpdateDashdot(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(penstyle==PS_DASHDOT); //当线型为点段线时,此选项前标有圆点
}
第二篇:画图程序设计报告(MFC)
Windows程序设计
课程设计报告
课题名称:画图小程序
班 级:计本08-1班
姓 名:X X
学 号:XXXXXXXXX
指导老师:
20##-11-29
目录
1 引 言................................................................................................................................ 3
1.1 课题背景............................................................................................................... 3
1.2 课程设计目的..................................................................................................... 3
2 功能说明........................................................................................................................... 3
3 系统的实现...................................................................................................................... 4
3.1 视图设计........................................................................................ 4
3.2 编辑资源........................................................................................ 4
3.3 编程思路及各个函数的实现....................................................................... 5
4程序功能的测试...................................................................................... 7
4.1测试的研究与选择......................................................................... 7
4.2 测试环境........................................................................................ 7
5.3 实例测试结果..................................................................................................... 7
5学习的总结............................................................................................... 9
6参考文献........................................................................................................................... 10
摘 要 : 本课程设计实现的是画椭圆、矩形、直线和随手画功能等。这个画图小程序实现了简单的画图功能,具有简洁大方的图文外观。它的设计按软件工程的方法进行,系统具有良好的界面、必要的交互信息和简易的菜单进行操作。即时准确地获得需要的画图的工具,适合休闲娱乐和简单的画画,对人们的生活有一定的帮助。在课程设计中,系统开发平台为WindowsXP,程序设计设计语言采用Visual C++,在程序设计中,采用了结构化与面向对象两种解决问题的方法。
关键词 : 程序设计;画图;MFC;画图函数Ellipse()Restangle()
1 引 言
1.1 课题背景
本课程设计主要在生活中的娱乐,可以在本程序上进行简单的绘图娱乐。
画图是日常生活中有效的工具,能实现简单的画图。本程序是在VC6.0中使用AppWizard创建基于对话框的应用程序。
1.2 课程设计目的
画图的实现,通过C++语句实现。在视图中实现画线功能,更好的了解MFC、C++等面向对象语言的设计和实现,运用自己所学的一些知识来实现其运用到现实的实践中,从而做到学而有用。
2 功能说明
本程序可以实现的功能如下:
1.运行程序后单击“编辑”菜单,选择“画矩形”后,用鼠标就可以在视图中画出一个矩形。
2.选择“画椭圆”,用鼠标就可以在视图中画出一个椭圆。
3.选择“画直线”,用鼠标就可以在视图中画出一条直线。
4.选择“随手画”,用鼠标就可以在试图中随手画画。
5.选择“TOP”就可以让画图窗口一直保持在其他窗口前面。
6.窗口右下角显示系统的当前时间。
7.将项目的默认图标换成自己设计的图标。
3 系统的实现
3.1 视图设计
利用MFC AppWinzard生成画图应用程序框架具体步骤如下:
(1)执行VC程序,选择File|New命令,弹出New对话框.单击Projects标签,转到Projects选项卡,选择MFC AppWizard(exe)选项,然后在Project name文本框中输入Draw文本框是指项目的本地路径。
(2)由于本程序是实现画线,要在视图中完成,所以首先创建一个基于单文档的应用程序。
3.2 编辑资源
(1)编辑对话框及控件资源
图3.1编辑对话框
利用Visual C++提供的资源编辑器对窗口进行编辑。添加若干菜单。
该画图小程序的流程图如下3.2:
3.3 编程思路及各个函数的实现
实现画矩形、画椭圆和直线,是通过绘图命令的简单的平面几何体,而实现随手画则是画直线集成的结果,所以画矩形调用CDC对象Rectangle()函数,画椭圆调用CDC对象Ellipse()函数等。处理随手画功能,主要在OnMouseMove()函数中进行,用小段直线来记录鼠标的移动过程,时刻以鼠标的新位置作为画线的其实位置进行实现。
1.在视图类CdrawView中添加成员变量及函数声明,添加的代码如下:
public:
CDrawDoc* GetDocument();
void ResetAllFlags(); //重新设置所有的标志
bool m_bSketch; //是否随手画
bool m_bEllipse; //是否画椭圆
bool m_bRectangle; //是否画矩形
bool m_bLine; //是否画直线
CPoint m_startPoint; //起始点坐标
CPoint m_LastEndPoint; //结束点坐标
2.实现构造函数和各菜单的响应函数,其代码如下:
void CDrawView::OnDrawRectangle()
{
ResetAllFlags();
m_bRectangle=true;//设置画矩形
}
void CDrawView::OnDrawSketch()
{
ResetAllFlags();
m_bSketch=true; //设置随手画
}
void CDrawView::OnDrawEllipse()
{
ResetAllFlags();
m_bEllipse=true; //设置画椭圆
}
void CDrawView::OnDrawLine()
{
ResetAllFlags();
m_bLine=true; //设置画直线
}
下面是为各菜单添加核对标记:
void CDrawView::OnUpdateDrawEllipse(CCmdUI* pCmdUI)
{ pCmdUI->SetCheck(m_bEllipse);//椭圆}
void CDrawView::OnUpdateDrawRectangle(CCmdUI* pCmdUI)
{ pCmdUI->SetCheck(m_bRectangle);//矩形}
void CDrawView::OnUpdateDrawSketch(CCmdUI* pCmdUI)
{pCmdUI->SetCheck(m_bSketch);//随手画}
设置默认标志变量:
void CDrawView::ResetAllFlags()
{
m_bRectangle=false;//矩形
m_bSketch=false;//随手画
m_bEllipse=false;//椭圆
m_bLine=false;//直线
}
在状态栏里添加显示系统时间的问题,由于是在状态栏里显示,所以要通过构建一个CstatusBar对象,调用CstatusBar::Create创建状态栏窗口,然后用系统调用函数GetCurrentTime()获得当前时间,再调用格式化字符串的函数Format(“%H:%M:%S”),返回一个按时:分:秒格式的字符串。最后,通过状态栏的文本函数在状态栏中显示当前的时间并更新。还有就是窗口的前置的设置。就是调用如下代码从而实现的::SetWindowPos(AfxGetMainWnd()->m_hWnd,HWND_TOPMOST,-1,-1,-1,-1,SWP_NOMOVE|SWP_NOSIZE);本程序还有很多不完善的地方,由于是调用的是CDC函数,画出来的图形质量还不是很高级,其中我们还可以添加上Color换色函数,达到多种颜色之间的转换。
4 程序功能的测试
4.1测试的研究与选择
测试过程中要判断测试是否成功,要分析程序界面的变化和画图的结果是否正确以及各功能能否正常使用。
4.2 测试环境
测试环境如下:
测试系统: Windows XP
测试工具: Visual Studio C++ 6.0
4.3 实例测试结果
1.画椭圆的实现:在编辑菜单里选择画椭圆
操作结果如下所示:
2.画矩形的实现:在编辑栏菜单里选择画矩形
操作结果如下图:
3.画直线的实现:在编辑栏菜单里选择画直线
操作结果如下图所示:
4.状态栏里时间的实现:运行程序后查看右下角
操作结果如下图所示:
5.窗口前置的实现:选择TOP后窗口就可以一直保持在其他窗口的前面。
6.项目的默认图标换成自己设计的图标。
5学习的总结
在课程设计的实践中,学到很多的知识,积累了不少的经验。课程设计主要是为了实现一个画图程序里的一些功能。其中为了实现画图程序的各个功能,我首先考虑的是这个程序的外观,在编辑选项里把初始化的菜单选项给删除添加上我们画图需要用的几个选项,后又考虑到时间的显示,就在状态栏里加入了系统时间的显示。和窗口的前置问题等。其中画笔的实现和一些细节方面的就在程序里,下面列出一点基本的知识点:
1) Windows程序设计中窗口过程的作用是什么?是由谁调用的?
答:Windows系统中的每个窗口都有一个相应的窗口过程,用于处理发送或投递到该窗口的所有消息的函数,窗口外观和特性的所有方面取决于窗口过程对这些消息的响应。每个窗口都是某个窗口类的成员,窗口类决定了窗口用来处理它的消息窗口过程。窗口过程函数DefWindowProc。
2) 什么是MFC,用MFC编程有什么体验?
答:MFC微软基础类(Microsoft Foundation Classes),是一种Application Framework,随微软Visual C++ 开发工具发布。该类库提供一组通用的可重用的类库供开发人员使用。MFC是面向对象程序设计与Application framework的完美结合,他将传统的API进行了分类封装,并且为你创建了程序的一般框架。MFC是对WindowsAPI的封装,大大简化了我们的工作。
3) MFC中模态对话框和非模态对话框分别从用户角度和编程角度讲,有什么区别?
答:从用户角度模式对话框:在关闭模式对话框之前,程序不能进行其他工作。非模式对话框:模式对话框打开后,程序仍然能够进行其他工作。
从编程角度非模态通过调用CDialog::Create函数来启动对话框,在对话框关闭后,用delete操作符删除对话框对象。而模态是调用CDialog::DoModal函数。
4) 如何判断MFC中的窗框类对象是否和一个具体窗口相关联?
答:Dlg.m_hWnd == 想测试的窗口句柄。
5) 在SDI应用程序中,怎样在视图类中获取应用程序的主框架窗框类?
答:用函数GetActiveView()
在本程序中还有待扩展的地方,由于基本的函数的实现都是自己在看书和总结的情况下些出来的,其中还有很多的不完善。需要在今后的学习中继续研究并改进。本系统适合运行于Windows20##、Windows XP和Win7等系统平台下
6参考文献
1.《深入浅出MFC简体第二版》
2.严华峰. Visual C++课程设计案例精编. 北京:中国水利水电出版社,2002
3.《VisualC++6.0MFC时尚编程百例》 网冠科技编著 机械工业出版社2002
4.《MFC程序设计》 唐克编著 北京希望电子出版社 2002