吹泡泡课程设计_第1页
已阅读1页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 c+面向对象课程设计报告院(系): 计算机工程学院 专业: 网络工程专业 学生姓名: abc 班级:123学号: 000 题目: 吹泡泡课程设计 一需求分析: 1.要求与功能:世界经济的快速发展和计算机技术的日益成熟,计算机被应用到人类生活的各个领域,各种应用软件相继问世,严峻的形势在提醒我们要跟上时代的步伐,不断的去创新和完善。所以,我们必须学习更多的知识和编程工具来提高自身的能力。要求用鼠标左键随机在客户区任何地方单击,可产生一个圆形的泡泡(泡泡的大小随机产生);可通过颜色对话框选择不同的颜色,绘出不同颜色的泡泡;可以保存文档,并能打开文档。程序属于一个简单的小游戏,需要用到画图,文档等

2、的操作,更考验了对mfc对程序的封装性及内联函数的掌握与应用。当代社会,目前windows已成为微机上的主流操作系统,几乎成为大家离不开的必要需求,在windows平台上进行软件开发也已成为程序设计的主流,所以熟悉并掌握初级的可视化编程方法对我们未来的发展有直观重要的作用,也帮助我们把握了现代化使用工具的流行趋势。程序使用的mfc应用程序必须有且只能有一个从winapp类派生的全局应用程序对象,此对象在运行时刻控制应用程序中所有其他对象的活动。通过此项设计,了解c+编程的基本工作原理和思想,培养分析,解决问题的能力。2. 程序功能分析:能够在客户区任意地方点击即产生一个圆形的泡泡;利用基于框架

3、窗口的应用程序使编程更加简单清晰。能够对产生的文档进行保存,打印,打印预览等一些的功能;并可以在窗口区新建文档或者关闭,打开新文档。程序运行过程中须保证不因操作频繁而产生系统错误,系统安全,可靠,功能齐全,操作方便,界面友好,容易对程序的不足之处进行修改,在程序已有的功能上利用修改,或添加一些数据成员或函数来增加更多的功能,保证程序有良好的移植性和可扩充性。例如可以改善文档的打印预览效果,进一步可以添加函数使得在泡泡窗口可以画出矩形或其他图形并录入字符,且对字符可是进行各种增删,修改操作。程序应用了对话框,程序利用它可以和用户进行交互式操作,对话框是应用程序,用于显示或提示并等待用户输入一个或

4、多个控件,利用这些控件,用户可以输入文本,选择选项,并完成某一些特定命令。二.设计内容1.程序模块图 文档保存新建打开打印预览打印视图初始化消息响应打印参数画图框架窗口cmainframe应用程序建立文档登记模板据初始化 吹泡泡程序设计程序流程图 开始 设置数组,数据成员及函数建立文档,画出泡泡,修改视图关闭?打开?保存?新建? 是 否 更新视图数据,登记模板结束3.程序代码/ 文档类 /class cmydoc : public cdocumentdeclare_dyncreate(cmydoc)carray m_rectbubble;public:cmydoc();intgetlistsi

5、ze()return m_rectbubble.getsize();crectgetbubble(int index)return m_rectbubbleindex;voidaddbubble(crect rect)m_rectbubble.add(rect);virtual bool onnewdocument();virtual void deletecontents();virtual void serialize(carchive& ar);implement_dyncreate(cmydoc, cdocument)/ 构造函数:调用sdi,做初始化工作.sdi为单文档界面程序cmy

6、doc:cmydoc()m_rectbubble.setsize(256, 256);/ 设置数组参数/ 打开新文档时调用,做初始化工作bool cmydoc:onnewdocument()if (!cdocument:onnewdocument() return false;srand(unsigned)time(null); / 初始化随机数发生器return true;/ 关闭文档、建立新文档前调用void cmydoc:deletecontents() m_rectbubble.removeall(); / 泡泡数组清零cdocument:deletecontents();/读写文档时

7、自动调用void cmydoc:serialize(carchive &ar) m_rectbubble.serialize(ar);/ 视图类 / class cmyview : public cviewdeclare_dyncreate(cmyview)public:cmydoc* getdocument()return (cmydoc*)m_pdocument;virtual void oninitialupdate();virtual bool onprepareprinting(cprintinfo* pinfo);virtual void ondraw(cdc* pdc);afx_

8、msg void onlbuttondown(uint nflags, cpoint point); /afx_msg标记的消息处理成员函数declare_message_map();implement_dyncreate(cmyview, cview)begin_message_map(cmyview, cview)on_wm_lbuttondown()on_command(id_file_print, cview:onfileprint)on_command(id_file_print_direct, cview:onfileprint)on_command(id_file_print_p

9、review, cview:onfileprintpreview)end_message_map()/ 建立新文档,打开文档时调用void cmyview:oninitialupdate()cview:oninitialupdate();invalidate(); void cmyview:ondraw(cdc* pdc)cmydoc* pdoc = getdocument();assert_valid(pdoc);pdc-selectstockobject(ltgray_brush); for(int i=0; igetlistsize(); i+) pdc-ellipse(pdoc-get

10、bubble(i);/ 消息响应函数void cmyview:onlbuttondown(uint nflags, cpoint point) cmydoc* pdoc = getdocument();/ 取文档指针 assert_valid(pdoc); int r = rand()%50+5; crect rectbubble(point.x-r, point.y-r, point.x+r, point.y+r); pdoc-addbubble(rectbubble);/ 修改文档数据 pdoc-setmodifiedflag(); invalidaterect(rectbubble, f

11、alse);/文档数据产生变更后,要更新试图数据/ 设置打印参数bool cmyview:onprepareprinting(cprintinfo* pinfo)pinfo-setmaxpage(1); return doprepareprinting(pinfo);/ 框架窗口类 / class cmainframe : public cframewnddeclare_dyncreate(cmainframe);implement_dyncreate(cmainframe, cframewnd)/ 应用程序类 / #define idr_mainframe128class cmyapp :

12、public cwinapppublic:virtual bool initinstance();declare_message_map();begin_message_map(cmyapp, cwinapp)on_command(id_file_new, cwinapp:onfilenew)on_command(id_file_open, cwinapp:onfileopen)on_command(id_file_print_setup, cwinapp:onfileprintsetup)end_message_map()/ 建立,登记文档bool cmyapp:initinstance()

13、csingledoctemplate* pdoctemplate;pdoctemplate = new csingledoctemplate( / 登记文档模板 idr_mainframe, runtime_class(cmydoc), runtime_class(cmainframe), runtime_class(cmyview);adddoctemplate(pdoctemplate);ccommandlineinfo cmdinfo; / 创建及处理命令行信息 sdiparsecommandline(cmdinfo);if (!processshellcommand(cmdinfo)

14、return false;m_pmainwnd-showwindow(sw_show);m_pmainwnd-updatewindow();return true;/ 全局应用程序对象cmyapp theapp;资源脚本文件:#include afxres.h#define idr_mainframe128idr_mainframe menu preload discardable beginpopup 网络082 张天国吹泡泡程序设计beginmenuitem 新建(&n)tctrl+n, id_file_newmenuitem 打开(&o).tctrl+o, id_file_openmen

15、uitem 保存(&s)tctrl+s, id_file_savemenuitem 另存为(&a)., id_file_save_asmenuitem separatormenuitem 打印(&p).tctrl+p, id_file_printmenuitem 打印预览(&v), id_file_print_previewmenuitem 打印设置(&r)., id_file_print_setupmenuitem separatormenuitem 退出(&x), id_app_exitendendstringtable preload discardable beginidr_mainf

16、rame 吹泡泡nnbubnbub 文件 (*.egg)n.eggend#include l.chsafxres.rc#include l.chsafxprint.rc三.调试分析 1.程序完成的功能及支持的数据类型:程序完成了在客户区打开一窗口程序,并在其中任意位置点击即可产生一随机的圆形泡泡。在菜单栏可对文档进行保存,打印,预览,设置,新建,打开等的功能。程序支持的数据类型:程序支持int型,bool型,(非true即false) 数组型。2,程序的性能分析:程序中一共用到4个类,即cmyapp、cmywnd、cmyview和cmydoc,它们分别是应用程序类cwinapp、框架窗口类cf

17、ramewnd、视图类cview和文档类cdocument的派生类。 文档派生类cmydoc用于管理吹泡泡程序的数据,由于泡泡的数量是不定的,而大小和位置是通过int r = rand()%50+5;crect rectbubble(point.x-r, point.y-r, point.x+r, point.y+r);实现的,所以声明了一个数组m_rectbubble来存放所有泡泡的数据。m_rectbubble是cmydoc类的私有数据成员,在类外不可见;所以要定义一组成员函数作为该数据成员与外界的接口函数。函数getlistsize()用来统计数组中泡泡的个数;函数getbubble()

18、用于从数组中取一个泡泡数据;函数addbubble()用于将一个泡泡的数据加入数组。 视图派生类的onlbuttondown()函数用于响应操作的鼠标消息,ondraw()函数是试图标准输出函数,在框架窗口的客户区输出,应用程序类设置了三个消息响应宏,用于进行文档设置的菜单栏的选项。标准化的输出函数,不需要对这些消息响应函数进行重载。在应用程序类的initinstance()函数中建立了一个文档模板。 3.上机过程出现的问题及解决方案:最开始编制的程序只是单纯的画出泡泡,本应显示的菜单栏没有出现,也不能完成相应的操作,查找关于mfc的相关资料和请教他人发现,问题出在没有将所建文档与响应的操作对

19、应联系起来,后来设置了文档指针cmydoc* pdoc = getdocument();各个操作都必须将文档初始化后利用指针进行关联,用pdoc-addbubble(rectbubble);修改文档数据,在每次对文档的打开,关闭,创建新文档前需进行对视图的更新操作。由于画出的泡泡一开始没有设置大小和位置范围,在对程序进行了多次运行后出现了错误,有时候会在文档边角出现半个或者不完整的泡泡,仔细分析发现是没有对泡泡的半径进行限制,后来加入设置位置和大小的函数,int r = rand()%50+5;crect rectbubble(point.x-r, point.y-r, point.x+r,

20、point.y+r);重新运行后解决了问题。4.程序中可以改进的地方及说明:1. 在对文档进行打印预览的时候,文档中的泡泡出现在过于偏上的位置,用户对文档的内容不能有很清楚的了解,修改一部分函数,可以达到打印输出与屏幕显示的比例想接近。实现这个功能必须在cgraphicview类中重载虚函数onpreparedc()。首先,在cgraphicview类的声明中加上:virtual void onpreparedc(cdc *pdc,cprintinfo *pinfo=null);然后采用跟鼠标响应消息函数一样的方法,设置映射模式。void cgraphicview:onpreparedc(cd

21、c *pdc,cprintinfo *pinfo)pdc-setmapmode(mm_lometric);cview:onpreparedc(pdc,pinfo);在修改消息映射函数onlbuttondown(),void cgraphicview:onlbuttondown(uint nflags,cpoint point)cmydoc* pdoc = getdocument(); assert_valid(pdoc);cclientdc dc(this); onpreparedc(&dc);int r = rand()%50+5; crect rect(point.x-r,point.y-

22、r,point.x+r,point.y+r);invalidaterect(rect,false); dc.dptolp(rect); pdoc-addbubble(rect); pdoc-setmodifiedflag(); 这样打印预览效果比较好,文档基本显示在打印纸中部。输入输出:用鼠标左键在窗口客户区吹泡泡。使用文件菜单中的打印选项可打印窗口图象,图象位于打印纸上部,比例恰当.分 析:由于ondraw()函数输出使用逻辑坐标,所以存储数据(泡泡的包含矩形)也使用逻辑坐标。在onlbuttondown()函数中鼠标位置参数point为物理坐标,首先据此生成泡泡的包含矩形(物理坐标),更新

23、窗口客户区的相关区域(物理坐标),然后将物理坐标的泡泡包含矩形转换为逻辑坐标并存入文档。cview类的虚函数onpreparedc()用于设置设备环境,其原型为:virtual void onpreparedc( cdc* pdc,cprintinfo* pinfo = null );其中参数pdc为指向设备环境的指针,pinfo为指向cprintinfo类对象的指针。cprintinfo类用来存放与打印有关的信息,其数据成员m_ncurpage为当前打印页的号码;m_rectpage存放着当前打印纸上的可打印区域。常用成员函数有:设置从第几页开始打印。其原型为:void setminpage

24、( uint nminpage );其中参数nminpage为开始打印的页号。如果从文档的第1页开始打印,则nminpage的值应为1。2. 绘制五颜六色的泡泡1在程序首部添加文件包含命令:#include 2在框架窗口类声明中添加一个colorref类型的数组,存放各泡泡的颜色:colorref m_colorbubble max_bubble;3修改鼠标左键消息映射函数,添加使用颜色选择公用对话框的代码:void cmywnd:onlbuttondown ( uint nflags,cpoint point )if(m_nbubblecount max_bubble)m_colorbubb

25、lem_nbubblecount = rgb(200,200,200);ccolordialog dlg(m_colorbubblem_nbubblecount);if(dlg.domodal() = idok)m_colorbubblem_nbubblecount = dlg.getcolor();int r = rand()%50+10;crect rect(point.x-r,point.y-r,point.x+r,point.y+r);m_rectbubblem_nbubblecount = rect;m_nbubblecount+;invalidaterect(rect,false)

26、;4修改onpaint()成员函数,添加根据泡泡颜色使用画刷的代码:void cmywnd:onpaint()cpaintdc dc(this);cbrush brushnew,*pbrushold;for(int i=0; im_nbubblecount; i+)brushnew.createsolidbrush(m_colorbubblei);pbrushold = dc.selectobject(&brushnew);dc.ellipse(m_rectbubblei);dc.selectobject(pbrushold);brushnew.deleteobject();输入输出:在窗口客

27、户区点击鼠标左键会弹出一颜色选择公用对话框,用户选择泡泡颜色后可在窗口相应位置显示一彩色泡泡。分 析:在鼠标左键消息响应函数中,在添加泡泡前先将泡泡的颜色初始化为浅灰色。这样,即使用户按cancel按钮退出颜色选择对话框,泡泡的颜色也已设置好。在显示泡泡时,由于各个泡泡的颜色均可能不同,因此将建立画刷的工作放在循环中进行。这时要注意在显示完泡泡后要及时销毁原来的画刷(使用cbrush:deleteobject()画刷)。否则,再次创建画刷时会出现错误。5.程序中可以扩充的功能及设计实现构想:修改程序部分功能,希望实现在文档区中央显示一个矩形的框,并在其中可以显示某个你提前设置的字符。在原程序中

28、向派生类cmywnd中添加onpaint()函数。函数中设置画笔以及绘制矩形的长,宽的参数。还要设置控制矩形位置的参数,可以将上,下,左,右的坐标赋值,以此限定矩形在文档中出现的位置。再添加字符串处理函数,对要键入的字符进行录入。更进一步的,可以在文档中对显示的字符进行删除,修改等的操作。这需要设置数组指针,存放字符数组,便于对其进行操作。由于程序中的鼠标消息响应函数,所以,需设法将数组指针与消息宏映射联系起来。四.用户手册1.运行环境:操作系统:windowxp开发软件:visual c+ 6.02.操作过程及演示1.)用户首先打开vc+6.0运行环境,在新建选项卡工程中选择“win32 a

29、pplication”,键入工程名,在新建文件中选择选c+ source file键入文件名。2.)输入源程序。3.)在新建选项卡中选择资源脚本,键入名称。将刚建立的资源文件关闭,然后使用菜单选项“file/open”调出打开文件对话框,在其中选择资源文件xx.rc,并在对话框底部的open as组合框中选择text(以文本方式打开),按下“打开(o)”按钮以文本方式重新打开资源文件。将原来的所有内容删除,替换为文本02.txt的内容。(02.txt内容见附录)。在菜单栏工程栏选择设置,在常规选项卡下选择“使用mfc作为共享的dll”。如图4.)运行程序,出现画出泡泡的界面。鼠标左键点击随即画

30、出圆形泡泡,大小随机。使用颜色设置对话框选择改变泡泡颜色。完成后可以对文档进行新建,打开,保存,另存等的操作。至此,程序运行结束。3.运行结果程序截图如下:画泡泡:保存:打印预览(可以改进)关闭,新建:五.设计总结此次课程设计的内容为在客户区实现吹泡泡的功能,程序的完成需要用到数组,类,派生,重载,以及封装,内联函数,以及对消息响应函数的了解和简单操作。mfc中用包含矩形表示。需要设置一数组,每当用户按下鼠标左键时,就产生一个泡泡的数据存入数组中。首先程序中需设置一个存放所有泡泡的包含矩形的数组m_rectbubble。m_rectbubble设置为类cmydoc的私有数据成员。函数函数get

31、bubble()用于从数组中取一个泡泡的包含矩形;函数addbubble()用于将一个泡泡的包含矩形加入数组。以上为对泡泡数据的存放与处理过程。由于是首次接触mfc编程,mfc的封装性能使程序的书写变得很简单,但同时增加了理解难度,找了很多关于mfc的资料和视频学习基本的类和派生,更重要的是它的消息响应函数的实现功能;可视化的编程界面友好,清晰而美观。通过吹泡泡的课程设计,总结了一点经验,一开始的程序只能实现单纯的吹泡泡,因为有了的强大的扩展功能,在一个简单的程序中修改添加响应函数,进一步实现了保存等的菜单功能,在此基础上,程序可以实现更多的功能,为此提供了很好的平台。在两周的学习中,时间紧迫,有点手忙脚乱,程序做的也不尽人意,还有很多要改进和完善的地方。最大的收获是学习了新的编程知识,扩展了视野。自己学习的过程,对产生的错误需要多方查证才能进行改善,这样比平时更加深了对知识的理解与掌握力。对学习是很好的巩固和提高。 由于对mfc来说我还是个初学者,一开始照着资料慢慢的测试运行,很多东西只看懂形势而不懂意义。在调试与实现的过程中逐步开始对程序有了深入的认识,逐渐熟练并掌握了它的编程方法。对各种控制结构及语句、数组的基本与高级应用、指针数组、字符数组、动态数组、函数的定义、调用方式;函数在编程中的具体应用;以及变量

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论