简单画图程序课程设计Word格式.docx
《简单画图程序课程设计Word格式.docx》由会员分享,可在线阅读,更多相关《简单画图程序课程设计Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
7.3关键源代码1
简单画图程序
1.基本功能描述
1)在菜单处的有相应的菜单项,可以选择绘制的图形形状,如直线、矩形及椭圆,可以选择线宽,有1-5可供选择,还可以选择线色以及填充色,通过弹出的颜色对话框选择需要的颜色,如果不选择线宽、线色以及填充色,则按默认的画笔以及画刷来绘制选择的图形。
2)选择好图形后,通过鼠标可以绘制出相应的直线,矩形或椭圆,鼠标的按下确定图形的起点,鼠标的拖动则确定了图形的终点,即通过鼠标的拖动来决定图形的大小,鼠标弹起,此图形则绘制完毕。
3)增添了工具栏,有相应的选择项,可以更方便地实现相应的功能。
2.设计思路
1)对需要用到的变量进行初始化。
2)选择相应的图形之后就响应相应的消息处理函数,给shape赋对应的值。
选择不同的线宽,线色与填充色,则改变画笔和画刷的属性。
3)鼠标的按下响应LButtonDown(),定义起点的坐标,鼠标的拖动响应MouseMove()改变终点的坐标,鼠标的弹起响应LButtonUp(),刷新,得到绘制图形。
4)选择图形或其它属性,可进行下一次绘制。
Y
N
Y
图1程序流程图
3.软件设计
3.1设计步骤
1)创建一个给予单文档的应用程序框架。
命名为“yuyangyi”。
图2创建工程
2)编辑菜单。
添加需要的菜单项,如图3;
设定好ID值,如图4;
建立类向导,在视图类中,对菜单项添加对应的COMMAND消息出理函数,部分菜单项还添加对应的UPDATE_COMMAND_UI消息函数,如图5。
图3添加菜单项
图4设定菜单项ID
图5建立类向导
3)创建工具栏。
在插入处选择资源,新建工具栏,如图6;
在工具栏上添加相应的按钮,在属性处更改其ID,如图7。
图6新建工具栏
图7编辑工具栏
4)在相应消息函数处添加代码,实现其功能。
建立类向导,添加WM_PAINT消息,以及LBUTTONDOWN、LBUTTONUP、MOUSEMOVE消息,并在其中添加相应的代码,如图8。
图8添加WM_PAINT消息
3.2界面设计
表1界面控件表
控件名称
控件类型
ID属性
相关变量
绘图
下拉式菜单
直线
菜单项
工具栏按钮
ID_LINE
intshape
矩形
菜单项
ID_RECT
椭圆
ID_ELLIPSE
线宽
弹出式菜单
intw
颜色(线色)
ID_COLOR
COLORREFm_nColor
填充色
ID_FILLCOLOR
COLORREFm_fColor
3.3关键功能的实现
1)绘制选择的图形。
在直线、矩形以及椭圆的消息处理函数里为shape赋值,选择直线,则shape=1,选择矩形,则shape=2,选择椭圆,则shape=3,在OnPaint()里添加绘图的代码,其中运用3个if语句来绘制不同的图形。
当shape=1时执行绘制直线的代码,同理绘制出矩形与椭圆。
2)通过鼠标绘制图形。
在视图类里添加WM_LBUTTONDOWN、WM_LBUTTONUP以及WM_MOUSEMOVE消息,在OnLButtonDown()函数里,获取鼠标坐标,将其赋给之前定义作为起点的变量opoint;
在OnMouseMove()函数里,把鼠标坐标赋给之前定义作为终点的变量epoint,OnPaint()中绘图的代码中的坐标都得到了,进行绘图;
在OnLButtonUp()函数里,进行刷新,显示绘制出的图。
3)改变线宽。
定义了默认线宽w=1,在菜单处选择了线宽的值后,对应的值赋给了w,在OnPaint()创建的画笔中,pen.CreatePen(PS_SOLID,w,m_nColor),线宽处用w表示,则改变w的值即改变了画笔的粗细。
4)改变线色。
在选择线色时,会弹出系统带的颜色对话框,把选中的颜色给m_nColor,在OnPaint()创建的画笔中,pen.CreatePen(PS_SOLID,w,m_nColor),线色处用m_nColor表示,则当m_nColor改变时,画笔的颜色就会跟着发生变化。
5)改变填充色。
选择填充色时,通过颜色对话框选择颜色,选中的颜色赋给m_fColor,在OnPaint()创建的画刷中,brush.CreateSolidBrush(m_fColor),颜色就是用m_fColor表示的,所以m_fColor是什么颜色,画刷就是什么颜色。
4.结论与心得体会
这次C++程序设计(简单画图程序的实现)的课程设计至此已基本完成,利用这个程序可以在用户区绘制出直线、矩形与椭圆图形,可以自定义线条的颜色以及选择线的宽度,还可以改变图形的填充色。
最终设计的程序基本能够达到课设任务书指定的基本功能。
这次课程设计让我收获颇多,感觉很是充实,看到最后程序正常运行时候心里还略有一点小小成就感。
在选课题的时候,看到有画图程序这个题目时候,觉得应该有趣一点,不是很枯燥那种,加上平时C++理论课上这种类似的画图程序接触过,老师也讲过类似例子,于是就选择了它。
原本以为这个程序制作起来很简单,但是到了开始着手程序设计时候,发现第一步,也就是画出程序流程图,我就不知什么样子的流程图才是任务要求的,在查阅课本以及相关书籍上类似程序流程图实例后,借鉴了例子中的基本框架,然后才画出符合要求的流程图。
当开始用VC进行程序编制时候,创建完工程、编辑好相应菜单选项以及对菜单项添加对应的COMMAND消息出理函数和对应的UPDATE_COMMAND_UI消息函数后,突然思维卡住了,不知道下一步该从何处下手。
请教了一下同学才发现自己的问题很低级,在添加完函数后得做的就是在相应消息函数处添加代码来实现其功能。
真正的困难从这时候开始出现了,代码是程序核心部分,自然也是也困难的地方了,在参阅了课本和平时上课的课件之后,自己尝试着编写相应功能的代码,可是编写完某个功能后用VC编译时候,程序便报出许多的错误,其中较大的一些问题在和同学讨论及请教之后得到解决,多数的错误还是属于那种低级的小错误,开始体会到平时一些看起来简单自己编懒得亲自敲打代码实践的小程序在真正做起来也是需要认真细心对待的。
在建立完类向导,添加完WM_PAINT消息,以及LBUTTONDOWN、LBUTTONUP、MOUSEMOVE消息,对其进行代码添加时候,最难得部分出现了,自己参照资料所写的代码总是不能运行正确,而且代码不是很精简,冗余度很大,最终参照着从网上找到的一段代码改写自己代码,最后才得到正常精简的程序代码。
在编程中,遇到过很多问题,有时候好不容易解决掉一个问题,还没来得及高兴就发现这个问题的额解决却衍生出了另外的问题,甚至是一连引发好几个小问题,例如在实现动态画图时,发现每次接着画下一个图形时候,上次以及之前画的图案就全部清空了,修改了相应刷新函数之后,图案是能够保存了,可是动态画图的每一个中间过程也都被一起保留下来了,这一点到最后也没有被解决,这是这次课程设计中最遗憾的一个地方,虽然程序能基本满足要求,但是没能完全满足相应要求。
通过这次课程设计,我学习到了很多,让我感受到之前在理论课程安排的上机试验中,所掌握的实际程序操作都是在表层的,没有深入的程序设计的核心以及整体把握,上机时候我们大部分都是参照着课本以及课件来操作的,所以遇到的问题不多也不大。
但这次课程设计是的靠自己来独立操作,需要自己去查阅以及筛选相应的资料来帮助自己完成设计,锻炼我们的独立工作及动手实践能力。
让我对VC中的MFC有了更多的了解及认知。
5.参考文献
[1]揣锦华.面向对象程序设计与VC++实践.西安电子科技大学出版社.2005.
[2]WalterSavitch.完美C++教程.清华大学出版社.2005.
[3](美)JudyScholl.C++编程:
从问题分析到程序设计实验指导书.电子工业出版社.2003.
[4]夏崇镨,任海军,余健.VisualC++课程设计案例精编.清华大学出版社.2008
6.思考题
1)说明直线、椭圆、矩形绘制使用的函数,及其参数含义?
答:
直线、椭圆、矩形绘制使用的函数是OnPaint()。
函数里面定义和创建了画笔和画刷,3种图形本身对应的消息处理函数里分别赋给shape不同的值,在OnPaint()里有3个if语句,如果shape=1时,绘制直线,如果shape=2时,绘制矩形,如果shape=3时,绘制椭圆。
2)如何控制菜单项的状态,使用的消息类型?
答:
添加UPDATE_COMMAND_UI消息函数,在生成的函数里添加相关代码,如选择直线时,使shape=1,则OnUpdateLine里添加pCmdUI->
SetCheck(shape==1),那么当shape的值为1时,即代表选择了直线项,此时菜单中的直线选项前就打勾了,代表选中。
3)如何设置菜单和工具栏按钮的快捷键操作?
在资源视图下选择Accelerator,双击IDR_MAINFRAME,打开编辑窗口,双击空白处,在ID下拉列表框中选择需要快捷键的菜单项或工具栏按钮的ID,在键一栏中输入快捷键,选择Ctrl复选框和虚拟键单选按钮即可。
7.附录
7.1调试报告
1)在程序第一次运行时候,工具栏线型选定直线,然后发现鼠标在用户区怎么也画不出直线,换作矩形和椭圆也一样,但在菜单绘图里选定线宽之后方能画出图形,后来发现,原理我没有设置默认线宽,于是在“yuyangyiView.cpp”中,添加如下函数及代码:
CyuyangyiView:
:
CyuyangyiView()
{w=1;
shape=0;
}
于是在程序运行时候即便开始不选择线宽,也能画出图形来。
2)要让鼠标来决定图形的起始点,所以定义了起始点opoint和终止点cpoint,把OnPaint中绘制图形代码的坐标都改成了这2个变量。
然后在添加的OnLButtonDown()、OnMouseMove()和OnLButtonUp()中,给这两个变量赋值。
接着我编译运行,确出现了这样的错误,我只要把鼠标左键一按,即使已经马上松开,鼠标拖动还是会进行绘制,与需要实现的功能不符。
于是我添加了一布尔类型的变量m_Down,代表鼠标的按下与否,当按下时让它为TRUE,在OnMouseMove()里添加当按下时才执行之前代码的语句。
这样画图时,只有鼠标左键按着拖动时,才会进行绘制。
3)在实现动态画图时候,发现鼠标每次移动时候,所在点都会与原起始点间产生图形显示出来,效果如图9,后来发现我在在“yuyangyiView.cpp”中的代码段:
voidCyuyangyiView:
OnMouseMove(UINTnFlags,CPointpoint)
{f(m_Down)cpoint=point;
Invalidate(0);
CView:
OnMouseMove(nFlags,point);
}
中多了“Invalidate(0)”一条刷新句,去掉后