MFC制作绘图板C++课程设计.doc_第1页
MFC制作绘图板C++课程设计.doc_第2页
MFC制作绘图板C++课程设计.doc_第3页
MFC制作绘图板C++课程设计.doc_第4页
MFC制作绘图板C++课程设计.doc_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

*级通信工程VC+课程设计报告设计题目:基于MFC的绘画板姓名学号:*学 院:工程技术学院专 业:通信工程班 级:*指导教师:*2014年*月*日题目:基于MFC的绘画板一、设计题目及要求1、设计题目基于MFC的多媒体播放器2、设计要求(1)基本要求线宽图形(2)发挥部分填充色颜色指导教师签名: 2013年 月 日二、指导教师评语 指导教师签名: 2013 年 月 日三、成绩 理论(60%): 分,作品(40%): 分,总分: 分。 验收盖章 2013年 月 日目录第1章 VC+和MFC的基本介绍. 1.1VC+6.0介绍.31.2 MFC介绍.4第2章 基本功能2.1创建单文档.52.2添加成员变量.62.3新建工具栏.62.4编辑菜单.92.5建立相应类向导.102.6添加消息函数.15第3章 简易画图板的制作 3.1设计目的 .253.2详细设计.283.3点、直线、矩形、椭圆的绘制.283.4改变线色 .283.5改变线宽.293.6设置填充色对话框 .293.7绘制图形.29第4章 结果及结论4.1测试结果.304.2参考文献.314.3心得体会. 314.4关键源代码.32第1章1.1VC+6.0介绍:Visual C+ 6.0,简称VC或者VC6.0,是微软推出的一款C+编译器,将“高级语言”翻译为“机器语言(低级语言)”的程序。Visual C+是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C+1.0后,随着其新版本的不断问世,Visual C+已成为专业程序员进行软件开发的首选工具。虽然微软公司推出了 Visual C+.NET(Visual C+7.0),但它的应用的很大的局限性,只适用于Windows 2000、Windows XP和Windows NT4.0。所以实际中,更多的是以Visual C+6.0为平台。VC+6.0Visual C+6.0不仅是一个C+ 编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment,IDE)。Visual C+6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。 这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。1.2 MFC介绍: MFC实际上是微软提供的,用于在C+环境下编写应用程序的一个框架和引擎。VC+是Windows下开发人员使用的专业C+ SDK(SDK,Standard SoftWare Develop Kit,专业软件开发平台),MFC就是挂在它之上的一个辅助软件开发包。MFC作为与VC+血肉相连的部分(注意C+和VC+的区别:C+是一种程序设计语言,是一种大家都承认的软件编制的通用规范;而VC+只是一个编译器,或者说是一种编译器+源程序编辑器的IDE(IDE的英文全称为“Integrated Development Environment”,即“集成开发环境”),WSPlatForm,这跟Pascal和Delphi的关系一个道理。Pascal是Delphi的语言基础,Delphi使用Pascal规范来进行Win下应用程序的开发和编译,却不同于Basic语言和VB的关系。Basic语言在VB开发出来被应用的年代已经成了Basic语言的新规范,VB新加的Basic语言要素,如面向对象程序设计的要素,是一种性质上的飞跃,使VB既是一个IDE,又成长成一个新的程序设计语言)。MFC同VC+集成的VCL一样是一个非外挂式的软件包类库,只不过MFC类是微软为VC+专配的。MFC是WinAPI与C+的结合。API,即微软提供的Windows下应用程序的编程语言接口,是一种软件编程的规范,但不是一种程序开发语言本身,可以允许用户使用各种各样的第三方(如我是一方,微软是一方,Borland就是第三方)的编程语言来进行对Windows下应用程序的开发,使这些被开发出来的应用程序能在Windows下运行,比如VB、VC+、Java、Delhpi。编程语言函数本质上全部源于API,因此用它们开发出来的应用程序都能工作在Windows的消息机制和绘图里,遵守Windows作为一个操作系统的内部实现,这其实也是一种必要。微软如果不提供API,这个世上对Windows编程的工作就不会存在,微软的产品就会迅速从时尚变成垃圾。上面说到MFC是微软对API函数的专用C+封装,这种结合一方面让用户使用微软的专业C+ SDK来进行Windows下应用程序的开发变得容易,因为MFC是对API的封装,微软做了大量的工作,隐藏了好多程序开发人员在Windows下用C+ & MFC编制软件时的大量内节,如应用程序实现消息的处理、设备环境绘图,这种结合是以方便为目的的,必定要付出一定代价(这是微软的一向作风),因此就造成了MFC对类封装中的一定程度的的冗余和迂回,但这是可以接受的。最后要明白MFC不只是一个功能单纯的界面开发系统,它提供的类绝大部分用来进行界面开发,关联一个窗口的动作,但它提供的类中有好多类不与一个窗口关联,即类的作用不是一个界面类,不实现对一个窗口对象的控制(如创建、销毁),而是一些在Windows(用MFC编写的程序绝大部分都在Windows中运行)中实现内部处理的类,如数据库的管理类等。学习中最应花费时间的是消息和设备环境,对C+和MFC。MFC是微软封装了的API。什么意思呢?Windows作为一个提供功能强大的应用程序接口编程的操作系统,的确方便了许多程序员,传统的win32开发(直接使用Windows的接口函数API)对于程序员来说非常的困难,因为,API函数实在太多了,而且名称很乱,从零构架一个窗口动辄就是上百行的代码。MFC是面向对象程序设计与Application framework的完美结合,它将传统的API进行了分类封装,并且为你创建了程序的一般框架。MFC是对WindowsAPI的封装,大大简化了我们的工作;学VC主要就是要学MFC,大约有100多个类,但常用的也就二三十个。应该象背4级单词一样将这些常用类搞懂;当然不要死记,要通过看帮助、看例子、动手练习来学会它们;而且,并非每个类的内部的所有函数都要学会,要日积月累。如果真的想成为高手,做个笔记本把自己认为重要的类、函数记下来,随时学习,也是很好的突击方法。第2章2.1 创建单文档创建一个MFCAppWizardexe工程,命名为“yinshuyan”,如图1所示,并创建单文档,如图1所示。创建成功后,系统自动生成相应的类,如图2所示。 图1创建工程 图二 选择单文档2.2添加成员变量:控件名称控件类型属性相关变量绘图下拉式菜单无无直线菜单项工具栏按钮ID_LINEint shape矩形菜单项工具栏按钮ID_RECTInt shape椭圆菜单项工具栏按钮ID_ELLPSEint shape线宽弹出式菜单无int w颜色菜单项工具栏按钮ID_COLORCOLORREF m_nColor填充色菜单项工具栏按钮ID_FULLCOLORCOLORREF m_fColor表1控件属性表 图3 添加成员变量2.3新建工具栏: 图4 新建工具栏 2.4编辑菜单: 添加需要的菜单项,如图3所示;并在菜单的属性中设定好所对应的ID,如图4所示,各项菜单对应的ID如表1所示(其中线宽菜单为弹出菜单,只需在菜单项目属性中的弹出选项前打勾即可,分隔线亦只需在菜单项目属性中选中分隔符选项即可)菜单名 1ID 线宽1 ID_W1直线ID_LINE 线宽2 ID_W2矩形 ID_RECT 线宽3 ID_W3椭圆 ID_ELLIPSE 线宽4 ID_W4颜色 ID_COLOR 线宽5 ID_W5 填充色ID_FILLCOLOR线宽6 ID_W6 表2菜单项对应ID图5生成菜单栏 图6 设置菜单ID 2.5建立类向导: 在视图类CyinshuyanView中,对各菜单项添加对应的COMMAND消息处理函数,部分菜单项还添加对应的UPDATE_COMMAND_UI消息函数 图7 建立类向导W1,W2,W3,W4,W5分别添加代码如下:W1,W2,W3,W4,W5分别添加代码如下:相应的代码分别如下:相应代码分别如下:相应的代码分别如下:2.6添加消息函数:4在相应消息函数处添加代码,实现其功能建立类向导,在视图类CyinshuyanView中,添加WM_PAINT消息,以及WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE消息,并在其中添加相应的代码。 图8 添加WN_PAINT消息添加代码如下: 图10 添加WN_BUTTONDOWN消息 图11 添加WN_MOSEMOVE消息 相应代码如下:第3章 简易绘画板制作:3.1设计目的和思路:在单文档菜单中,在菜单行中可插入一个菜单项,命名为绘图,在下拉菜单中可分别设置绘制的图形形状,如直线、矩形及椭圆,线宽选项,有1-5可供选择,还可以设置线色以及填充色,通过弹出的颜色对话框选择需要的颜色,如果不选择线宽、线色以及填充色,则按默认的画笔,画刷来绘制选择的图形。 选择好图形后,通过鼠标可以绘制出相应的直线,矩形或椭圆,鼠标的按下确定图形的起点,鼠标的拖动则确定了图形的终点,即通过鼠标的拖动来决定图形的大小,当鼠标弹起,此图形则绘制完毕。增添工具栏,设置绘制的图形形状,线色以及填充色,可更方便地选择相应的功能。对需要用到的变量进行初始化。选择相应的图形之后就响应相应的消息处理函数,给shape赋对应的值。选择不同的线宽,线色与填充色,即可改变画笔或画刷的属性。鼠标的按下响应函数OnLButtonDown(),捕捉鼠标当前位置得到起点的坐标,鼠标的拖动响函数OnMouseMove()改变终点的坐标,鼠标的弹起响应OnLButtonUp(),确定终点坐标,刷新,得到绘制图形。选择图形或其它属性,可进行下一次绘制。3.2选择要绘制的图形 在直线、矩形以及椭圆的消息处理函数里为shape分别赋值为1,2,3,在OnPaint()函数里添加3个if语句的代码来这实现这三个图形的绘制:当选择画直线时,shape=1,则执行绘制直线代码,当选择画矩形时,shape=2,则执行绘制矩形的代码,当性选择画椭圆时,shape=3,则执行绘制椭圆的代码。3.3改变线宽 在OnPaint()创建的画笔中,pen.CreatePen(PS_SOLID,w,m_nColor),线宽处用w表示,则改变w的值即改变了画笔的粗细。选择菜单绘图线宽选择划线宽度值,此时所选的线宽值就赋给线宽变量w。若不选择线宽值,则w=1(即默认线宽值为1)。3.4改变线色 在OnPaint()创建的画笔中,pen.CreatePen(PS_SOLID,w,m_nColor),线的颜色处用m_nColor表示,则改变m_nColor即改变了画笔的颜色。选择菜单绘图颜色,会弹出通过WM_COLORREF从系统中引入的颜色选择对话框,选择颜色后,点击确定则相应颜色值就赋给变量m_nColor,此时画笔的颜色就会发上变化。若不选择颜色,则默认(线)颜色为黑色。3.5改变填充色 在OnPaint()创建的画刷中,brush.CreateSolidBrush(m_fColor),颜色就是用m_fColor表示的,改变m_fColor即改变了画刷的颜色。选择菜单绘图填充色,会弹出通过WM_COLORREF从系统中引入的颜色选择对话框,选择颜色后,点击确定则相应颜色值就赋给变量m_fColor,此时画刷的颜色就会发上变化。若不选择颜色,则默认填充色为黑色。3.6绘制图形 鼠标左键按下,则捕获鼠标此时的位置坐标为画图的起点,此时在OnLButtonDown()函数里,将捕获的坐标值赋给定义作为起点的变量opoint;按下鼠标左键拖动鼠标时,捕捉鼠标当前位置坐标值为终点坐标值,此时在OnMouseMove()函数里,把捕获的坐标值赋给定义作为终点的变量cpoint,OnPaint()中绘图的代码中的坐标都得到了,进行绘图;鼠标左键弹起时,此时绘图结束,鼠标弹起时所在位置就是画图的最终终点位置,画图结束后,刷新窗口,以便重新画图,此时执行的是OnLButtonUp()函数。第4章 结果及结论 4.1测试结果 1)点击链接,编译,运行后的窗口如图10所示。 2)改变绘制图形形状,颜色,线宽,填充色之后绘制的图形如图11所示。 图10运行结果 4.2参考文献: 1揣锦华.面向对象程序设计与VC+实践.西安电子科技大学出版社.2005.2魏亮,李春葆编著.VisualC+程序设计例学与实践.清华大学出版社.2006.3严华峰等.VISUALC+课程设计案例精编(第二版).中国水利水电出版社2004. 1)一开始我并没有添加刷新函数Invalidate(),这就使程序运行之后,无论鼠标左键按下时如何移动无法绘图,这是因为当一个窗口内键入内容其实就是将窗口刷新了,相当于更新了窗口,故必须有刷新函数,这和生活中的白纸写字不一样。 2)当添加Invalidate()后,我把Invalidate()放在OnMouseMove()里,但是这样只能在窗口内画一个图形,即每画完一个图形就刷新一次。之后我通过与同学讨论,并查找资料将Invalidate()改为了Invalidate(0),这时是可绘制多个图形,但鼠标每移动一个位置都进行一次刷新,绘图结束后,绘图过程中的所有痕迹都在,产生了很多拖动的影子。,经过几次试验,我将Invalidate(0)放在了OnLButtonUp()中,那么每次重绘,上次的图形会作为背景被保留下来,而不会被刷新掉。4.3 心得体会: 这次课程设计我成功的完成了。通过本次课程设计,我完成了用移动鼠标对直线,矩形,椭圆的简单绘制工具的的制作,其中完成了绘图形状的选择,画图线宽、线色以及图形填充色的设置。 基于平时课外上机实验的练习,对菜单的创建,COMMAND消息处理函数和UPDATE_COMMAND_UI消息函数的添加过程比较熟练,这部分还算简单。难的是代码的添加,对绘制图形的程序有大概的思路,但具体编写时变量的运用以及函数的调用设置。这次实验中关键就是确定画图起点及终点坐标,因为是用鼠标绘制图形,所以需用函数来捕获鼠标当前所在位置的坐标,因此我设置了OnLButtonDown()函数来捕获起点坐标,OnMouseMove()函数来捕获鼠标移动是的当前位置坐标,OnLButtonUp()函数来捕获终点坐标。而绘制图形使用的函数是OnPaint(),将图形的起点和终点坐标和鼠标的位置坐标相联系后就能用鼠标来绘制图形了,所以在它们之间用opoint和cpoint两变量实现链接。另外我觉得将绘图语句集中在OnPaint()函数中,然后其他函数来调用OnPaint()函数,这样不容易引起混乱,同时程序更简单,更有条理,便于修改。 这次课程设计虽只是做了一个极其简单的绘图工具的制作,但也让我从设计者的角度看到了设计程序以及电脑软件工具的实质及难度,看似一个很简单的工具,其制作的背后工作是很大的,不光是图标,按钮的设置,程序的编写,代码的实现都是很精密且不容许一点错误的工作。平时我们使用的很顺手的一个小小工具,其开发的各项小号都不可小觑,由此,我们需要学的东西还太多太多。4.4关键源代码1) 在“MainFrm.h”中,在classCMainFrame:publicCFrameWnd里的protected下定义:CToolBarm_drawToolBar; /工具栏2) 在“MainFrm.cpp”中,在CMainFrame:OnCreate(LPCREATESTRUCTlpCreateStruct)里添加以下代码:if(!m_drawToolBar.Create(this)|!m_drawToolBar.LoadToolBar(IDR_DRAW) TRACE0(Failedtocreatestatusbarn);return-1;3) 在“YinshuyanView.h”中,在classCYinshuyanView:publicCView里的public下定义相关变量:COLORREFm_nColor;COLORREFm_fColor;CPointcpoint;CPointopoint;BOOLm_Down;intw;intshape;4)在“YinshuyanView.cpp”中,添加如下函数及代码:CYinshuyanView:CYinshuyanView()w=1;/初始线宽默认为1 shape=0;voidCYinshuyanView:OnW1()w=1;/令线宽为1voidCYinshuyanView:OnW2()w=2;/令线宽为2voidCYinshuyan:OnW3()w=3;/令线宽为3voidCYinshuyanView:OnW4()w=4;/令线宽为4voidCYinshuyanView:OnW5()w=5;/令线宽为5voidCYinshuyanView:OnUpdateW1(CCmdUI*pCmdUI)pCmdUI-SetRadio(w=1);/当线宽为1时,此选项前标有圆点voidCYinshuyanView:OnUpdateW2(CCmdUI*pCmdUI) pCmdUI-SetRadio(w=2);/当线宽为2时,此选项前标有圆点voidCYinshuyanView:OnUpdateW3(CCmdUI*pCmdUI) pCmdUI-SetRadio(w=3);/当线宽为3时,此选项前标有圆点voidCYinshuyanView:OnUpdateW4(CCmdUI*pCmdUI) pCmdUI-SetRadio(w=4);voidCYinshuyanView:OnUpdateW5(CCmdUI*pCmdUI)pCmdUI-SetRadio(w=5);voidCYinshuyanView:OnLine()shape=1;/选择直线,则令shape为1voidCYinshuyanView:OnRect() shape=2;/选择矩形,则令shape为2voidCYinshuyanView:OnEllipse()shape=3;/选择椭圆,则令shape为3voidCYinshuyanView:OnUpdateLine(CCmdUI*pCmdUI) pCmdUI-SetCheck(shape=1);/shape为1时,直线选项前打上勾voidCYinshuyanView:OnUpdateRect(CCmdUI*pCmdUI)pCmdUI-SetCheck(shape=2);/shape为2时,矩形选项前打上勾voidCYinshuyanView:OnUpdateEllipse(CCmdUI*pCmdUI)pCmdUI-SetCheck(shape=3);/shape为3时,椭圆选项前打上勾voidCYinshuyanView:OnColor()CColorDialogColor;/创建颜色对话框if(Color.DoModal()=IDOK)/如果用户点击OK按钮m_nColor=Color.GetColor();/更改颜色,把颜色赋到m_nColorvoidCYinshuyanView:OnFullColor()CColorDialogFullColor;/创建颜色对话框 if(FullColor.DoModal()=IDOK)/如果用户点击OK按钮 m_fColor=FullColor.GetColor();/更改颜色,把颜色赋到m_fColorvoidCYinshuyanView:OnPaint()CPaintDCdc(th

温馨提示

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

评论

0/150

提交评论