版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、武汉理工大学专业课程设计2(面向对象程序设计)课程设计说明书目 录1 基本功能描述12 设计思路13 软件设计33.1 设计步骤33.2 界面设计73.3 关键功能实现84 结论与心得体会95. 参考文献106. 思考题107. 附录117.1 调试报告117.2 测试结果117.3 关键源代码13简单画图程序1 基本功能描述1) 在单文档菜单中,在菜单行中可插入一个菜单项,命名为绘图,在下拉菜单中可分别设置绘制的图形形状,如直线、矩形及椭圆,线宽选项,有1-5可供选择,还可以设置线色以及填充色,通过弹出的颜色对话框选择需要的颜色,如果不选择线宽、线色以及填充色,则按默认的画笔,画刷来绘制选择
2、的图形。 2) 选择好图形后,通过鼠标可以绘制出相应的直线,矩形或椭圆,鼠标的按下确定图形的起点,鼠标的拖动则确定了图形的终点,即通过鼠标的拖动来决定图形的大小,当鼠标弹起,此图形则绘制完毕。3) 增添工具栏,设置绘制的图形形状,线色以及填充色,可更方便地选择相应的功能。2 设计思路 1) 对需要用到的变量进行初始化。2) 选择相应的图形之后就响应相应的消息处理函数,给shape赋对应的值。选择不同的线宽,线色与填充色,即可改变画笔或画刷的属性。3) 鼠标的按下响应函数onlbuttondown(),捕捉鼠标当前位置得到起点的坐标,鼠标的拖动响函数onmousemove()改变终点的坐标,鼠标
3、的弹起响应onlbuttonup(),确定终点坐标,刷新,得到绘制图形。4) 选择图形或其它属性,可进行下一次绘制。开始 定义并初始化变shape 线色m_ncolor 填充色 m_fcolor 画笔pen画刷brush绘图起点opoint绘图终点cpoint选择线宽默认值(w=1)改变画笔属性选择线色默认值(黑色)改变画笔属性选择填充色默认值(黑色)改变画刷属性椭圆矩形直线响应函数onellipse()shape=3响应函数online()shape=1响应函数onrect()shape=2鼠标左键按下 响应函数onlbuttondown()opoint=point鼠标移动 响应函数onmo
4、usemove()epoint=point响应onpaint(),绘制图形鼠标左键弹起响应函数onlbuttonup()刷新,得到图形结束图1 程序流程图3 软件设计3.1 设计步骤1)创建单文档创建一个mfc appwizardexe工程,命名为“yinshuyan”,如图1所示,并创建单文档,如图2所示。创建成功后,系统自动生成相应的类,如图3所示。图2 创建工程图3 创建单文档图4 生成类2) 编辑菜单添加需要的菜单项,如图4所示;并在菜单的属性中设定好所对应的id,如图5所示,各项菜单对应的id如表1所示(其中线宽菜单为弹出菜单,只需在菜单项目属性中的弹出选项前打勾即可,分隔线亦只需在
5、菜单项目属性中选中分隔符选项即可)。图5 添加菜单项图6 设置菜单id表1 菜单项对应id菜单名id菜单名id直线id_line线宽1id_w1矩形id_rect线宽2id_w2椭圆id_ellipse线宽3id_w3颜色id_color线宽4id_w4填充色id_fillcolor线宽5id_w5建立类向导,在视图类cyinshuyanview中,对各菜单项添加对应的command消息处理函数,部分菜单项还添加对应的update_command_ui消息函数,如图6所示。图7 建立类向导3)创建工具栏在插入处选择资源,新建工具栏,如图7所示;图8 新建工具栏在工具栏上添加相应的按钮,在属性处
6、更改其id,如图8所示。图9 编辑工具栏4)在相应消息函数处添加代码,实现其功能建立类向导,在视图类cyinshuyanview中,添加wm_paint消息,以及wm_lbuttondown、wm_lbuttonup、wm_mousemove消息,并在其中添加相应的代码,如图9所示。图10 添加wm_paint消息3.2 界面设计各控件名称,类型,属性及相关变量如表2所示。 表2 界面控件表控件名称控件类型属性相关变量绘图下拉式菜单 无 无 直线菜单项工具栏按钮id_lineint shape矩形菜单项工具栏按钮id_rectint shape 续表2 界面控件表控件名称控件类型属性相关变量椭
7、圆菜单项 工具栏按钮id_ellipseint shape线宽弹出式菜单 无int w颜色(线色)菜单项工具栏按钮id_colorcolorref m_ncolor填充色菜单项工具栏按钮id_fillcolorcolorref m_fcolor3.3 关键功能实现1)选择要绘制的图形在直线、矩形以及椭圆的消息处理函数里为shape分别赋值为1,2,3,在onpaint()函数里添加3个if语句的代码来这实现这三个图形的绘制:当选择画直线时,shape=1,则执行绘制直线代码,当选择画矩形时,shape =2,则执行绘制矩形的代码,当性选择画椭圆时,shape=3,则执行绘制椭圆的代码。2)改变
8、线宽 在onpaint()创建的画笔中,pen.createpen(ps_solid,w, m_ncolor),线宽处用w表示,则改变w的值即改变了画笔的粗细。选择菜单绘图线宽选择划线宽度值,此时所选的线宽值就赋给线宽变量w。若不选择线宽值,则w=1(即默认线宽值为1)。3)改变线色 在onpaint()创建的画笔中,pen.createpen(ps_solid,w, m_ncolor),线的颜色处用m_ncolor表示,则改变m_ncolor即改变了画笔的颜色。选择菜单绘图颜色,会弹出通过wm_colorref从系统中引入的颜色选择对话框,选择颜色后,点击确定则相应颜色值就赋给变量m_nco
9、lor,此时画笔的颜色就会发上变化。若不选择颜色,则默认(线)颜色为黑色。4)改变填充色 在onpaint()创建的画刷中,brush.createsolidbrush(m_fcolor),颜色就是用m_fcolor表示的,改变m_fcolor即改变了画刷的颜色。选择菜单绘图填充色,会弹出通过wm_colorref从系统中引入的颜色选择对话框,选择颜色后,点击确定则相应颜色值就赋给变量m_fcolor,此时画刷的颜色就会发上变化。若不选择颜色,则默认填充色为黑色。5)绘制图形 鼠标左键按下,则捕获鼠标此时的位置坐标为画图的起点,此时在onlbuttondown()函数里,将捕获的坐标值赋给定义
10、作为起点的变量opoint;按下鼠标左键拖动鼠标时,捕捉鼠标当前位置坐标值为终点坐标值,此时在onmousemove()函数里,把捕获的坐标值赋给定义作为终点的变量cpoint,onpaint()中绘图的代码中的坐标都得到了,进行绘图;鼠标左键弹起时,此时绘图结束,鼠标弹起时所在位置就是画图的最终终点位置,画图结束后,刷新窗口,以便重新画图,此时执行的是onlbuttonup()函数。4 结论与心得体会 这次课程设计我成功的完成了。通过本次课程设计,我完成了用移动鼠标对直线,矩形,椭圆的简单绘制工具的的制作,其中完成了绘图形状的选择,画图线宽、线色以及图形填充色的设置。 基于平时课外上机实验的
11、练习,对菜单的创建,command消息处理函数和 update_command_ui消息函数的添加过程比较熟练,这部分还算简单。难的是代码的添加,对绘制图形的程序有大概的思路,但具体编写时变量的运用以及函数的调用设置。这次实验中关键就是确定画图起点及终点坐标,因为是用鼠标绘制图形,所以需用函数来捕获鼠标当前所在位置的坐标,因此我设置了onlbuttondown()函数来捕获起点坐标,onmousemove()函数来捕获鼠标移动是的当前位置坐标,onlbuttonup()函数来捕获终点坐标。而绘制图形使用的函数是onpaint(),将图形的起点和终点坐标和鼠标的位置坐标相联系后就能用鼠标来绘制图
12、形了,所以在它们之间用opoint和cpoint两变量实现链接。另外我觉得将绘图语句集中在onpaint()函数中,然后其他函数来调用onpaint()函数,这样不容易引起混乱,同时程序更简单,更有条理,便于修改。这次课程设计虽只是做了一个极其简单的绘图工具的制作,但也让我从设计者的角度看到了设计程序以及电脑软件工具的实质及难度,看似一个很简单的工具,其制作的背后工作是很大的,不光是图标,按钮的设置,程序的编写,代码的实现都是很精密且不容许一点错误的工作。平时我们使用的很顺手的一个小小工具,其开发的各项小号都不可小觑,由此,我们需要学的东西还太多太多。5. 参考文献1揣锦华.面向对象程序设计与
13、vc+实践.西安电子科技大学出版社.2005. 2魏亮, 李春葆编著.visual c+程序设计例学与实践.清华大学出版社.2006.3严华峰等.visual c+课程设计案例精编(第二版) .中国水利水电出版社 2004.6. 思考题1)说明直线、椭圆、矩形绘制使用的函数,及其参数含义? 答:直线、椭圆、矩形绘制使用的函数是onpaint()。函数里面定义和创建了绘图的画笔pen和填充图形的画刷brush,3种图形本身对应的消息处理函数里分别赋给shape3个不同的值:1,2,3,在onpaint()里有3个if语句,用来这实现这三个图形的绘制:当选择画直线时,shape=1,则执行绘制直线
14、代码,当选择画矩形时,shape =2,则执行绘制矩形的代码,当性选择画椭圆时,shape=3,则执行绘制椭圆的代码。2)如何控制菜单项的状态,使用的消息类型?答:通过添加update_command_ui消息函数,在生成的函数里添加相关代码来控制菜单项的状态及使用的消息类型。如选择直线时,使shape=1,则onupdateline里添加pcmdui-setcheck(shape=1),那么当shape的值为1时,即代表选择了直线项,此时菜单中的直线选项前就打勾了,代表选中。矩形和椭圆类似。3)如何设置菜单和工具栏按钮的快捷键操作? 答:在资源视图下选择accelerator,双击idr_m
15、ainframe,打开编辑窗口,双击空白处,在id下拉列表框中选择需要快捷键的菜单项或工具栏按钮的id,在键一栏中输入快捷键,选择ctrl复选框和虚拟键单选按钮即可,如图10所示。图11 快捷键的创建7. 附录7.1 调试报告1)一开始我并没有添加刷新函数invalidate(),这就使程序运行之后,无论鼠标左键按下时如何移动无法绘图,这是因为当一个窗口内键入内容其实就是将窗口刷新了,相当于更新了窗口,故必须有刷新函数,这和生活中的白纸写字不一样。2)当添加invalidate()后,我把invalidate()放在onmousemove()里,但是这样只能在窗口内画一个图形,即每画完一个图形
16、就刷新一次。之后我通过与同学讨论,并查找资料将invalidate()改为了invalidate(0),这时是可绘制多个图形,但鼠标每移动一个位置都进行一次刷新,绘图结束后,绘图过程中的所有痕迹都在,产生了很多拖动的影子。,经过几次试验,我将invalidate(0) 放在了onlbuttonup()中,那么每次重绘,上次的图形会作为背景被保留下来,而不会被刷新掉。7.2 测试结果1)点击链接,编译,运行后的窗口如图11所示。图11 运行结果2)改变绘制图形形状,颜色,线宽,填充色之后绘制的图形如图12所示。图12 改便各项属性厚后的图形 7.3 关键源代码1) 在“mainfrm.h”中,在
17、class cmainframe : public cframewnd里的protected下定义: ctoolbar m_drawtoolbar; /工具栏2)在“mainfrm.cpp”中,在cmainframe:oncreate(lpcreatestruct lpcreatestruct)里添加以下代码:if (!m_drawtoolbar.create(this) |!m_drawtoolbar.loadtoolbar(idr_draw)trace0(failed to create status barn);return -1; 3)在“yinshuyanview.h”中,在clas
18、s cyinshuyanview : public cview里的public下定义相关变量: colorref m_ncolor; colorref m_fcolor; cpoint cpoint; cpoint opoint; bool m_down; int w; int shape; 4)在“yinshuyanview.cpp”中,添加如下函数及代码: cyinshuyanview: cyinshuyanview() w=1; /初始线宽默认为1 shape=0; void cyinshuyanview:onw1() w=1; /令线宽为1void cyinshuyanview:onw
19、2() w=2; /令线宽为2void cyinshuyan:onw3() w=3; /令线宽为3void cyinshuyanview:onw4() w=4; /令线宽为4void cyinshuyanview:onw5() w=5; /令线宽为5void cyinshuyanview:onupdatew1(ccmdui* pcmdui) pcmdui-setradio(w=1); /当线宽为1时,此选项前标有圆点void cyinshuyanview:onupdatew2(ccmdui* pcmdui) pcmdui-setradio(w=2); /当线宽为2时,此选项前标有圆点void
20、cyinshuyanview:onupdatew3(ccmdui* pcmdui) pcmdui-setradio(w=3); /当线宽为3时,此选项前标有圆点void cyinshuyanview:onupdatew4(ccmdui* pcmdui) pcmdui-setradio(w=4); void cyinshuyanview:onupdatew5(ccmdui* pcmdui) pcmdui-setradio(w=5);void cyinshuyanview:online() shape=1; /选择直线,则令shape为1void cyinshuyanview:onrect() s
21、hape=2; /选择矩形,则令shape为2void cyinshuyanview:onellipse() shape=3; /选择椭圆,则令shape为3void cyinshuyanview:onupdateline(ccmdui* pcmdui) pcmdui-setcheck(shape=1); /shape为1时,直线选项前打上勾void cyinshuyanview:onupdaterect(ccmdui* pcmdui) pcmdui-setcheck(shape=2); /shape为2时,矩形选项前打上勾void cyinshuyanview:onupdateellipse
22、(ccmdui* pcmdui) pcmdui-setcheck(shape=3); /shape为3时,椭圆选项前打上勾void cyinshuyanview:oncolor() ccolordialog color; / 创建颜色对话框 if(color.domodal() = idok) / 如果用户点击ok按钮 m_ncolor=color.getcolor(); / 更改颜色,把颜色赋到m_ncolorvoid cyinshuyanview:onfullcolor() ccolordialog fullcolor; / 创建颜色对话框 if(fullcolor.domodal() =
23、 idok) / 如果用户点击ok按钮 m_fcolor=fullcolor.getcolor(); / 更改颜色,把颜色赋到m_fcolorvoid cyinshuyanview:onpaint() cpaintdc dc(this); / device context for painting cpen pen; /定义画笔 cbrush brush; /定义画刷 pen.createpen(ps_solid,w, m_ncolor); /创建画笔 brush.createsolidbrush(m_fcolor); /创建画刷 dc.selectobject(&pen); /获取画笔 dc.selectobject(&brush); /获取
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年企业员工派遣服务协议
- 2024南京住宅二手交易协议范本
- 2024年第三方商铺租赁协议
- 商铺租赁协议书2024年
- 2024年协议管理流程及岗位职责
- 2024年担保公司贷款协议格式
- 2024水利设施堤坝施工合作协议
- 2024年酒店管理承包协议格式
- 2024年二手物资买卖协议模板
- 2024年度软件定制开发服务协议模板
- 廉洁风险点及控制措施
- 2024年广西来宾产业投资集团有限公司招聘笔试参考题库含答案解析
- 项目管理甘特图课件
- 2024年甘肃省普通高中信息技术会考试题(含24套)
- 我国的武装力量课件
- 液化石油气瓶安全使用告知书范文
- 供应室护理责任组长竞聘
- 高中数学教师的专业发展路径
- LTC与铁三角从线索到回款
- 《旅游市场营销》课程教学设计
- 工程流体力学课后习题答案-(杜广生)
评论
0/150
提交评论