下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 基于VC++MFC程序设计简易画图板

基于VC++MFC程序设计简易画图板.doc

基于VC++MFC程序设计简易画图板

天天
2012-02-27 0人阅读 举报 0 0 暂无简介

简介:本文档为《基于VC++MFC程序设计简易画图板doc》,可适用于高等教育领域

包头师范学院本科学年论文论文题目:基于VCMFC程序设计简易画图板院系:信息科学与技术学院专业:计算机科学与技术学号:姓名:指导教师:撰写学年:至学年二零一零年十二月摘要本软件是利用VC这个强大的可视化编程工具开发的软件主要功能包括图形的绘制、线型的设置、颜色的设置图形文件的重绘和保存等功能。本文介绍了如何完成上述功能同时详细阐述了画图系统的实现过程以及对画图系统所做的功能扩充。在画图软件设计上其主要任务是:实现“绘制图形”、“图形的保存”两项功能。本软件具有实用性、稳定性、易用性和可维护性的特点应该说它应是一个开放性的软件用户可以根据需要对其功能进行扩充、完善与修改使其符合自己的要求。总之本软件是一个逐步完善的软件。关键词:VCMFC绘图AbstractThissoftwareisusingvcthispowerfulvisualprogrammingtooldevelopment,softwaremainfunctionsincludinggraphicsrendering,linetypeSettings,colorsetting,graphicsfileredrawofpreservingandfunctionThepaperintroducedhowtoaccomplishthesefunctions,andexplainsindetaildrawingsystemrealizationprocessandtodrawingsystemdofunctionexpansionIndrawingsoftwaredesign,itsmaintaskistoachieve"drawings","graphicsave"twofunctionsThissoftwarehaspracticability,stability,easeofuse,andmaintainabilitycharacteristic,shouldsayitshouldbeanopensoftware,theusercanaccordingtotheneedsofitsfunctionswereexpansion,perfectandmodification,makethemcomplywiththeirrequirementsAnyhow,thissoftwareisaperfectgraduallysoftwareKeywords:VcMFCdrawing目录引言第章vc和MFC简介vc简介MFC简介第章基础知识工程的新建单文档简介添加消息响应函数资源设备环境第章简易画图板的制作设计目的总体设计详细设计点、直线、矩形、椭圆的绘制连续线和扇形的绘制画刷设置对话框颜色打开与保存第章结果及结论运行结果结论参考文献附录:简易画图板主要程序代码致谢引言计算机技术的发展使人类社会进入了信息化和自动化计算机智能识别也随着计算机的发展得到了迅速的发展。特别是图形图像的计算机处理技术更是有了前所未有的进步和应用。计算机识别也逐渐的从图形图像处理的大环境下分离出来作为一门新的高科技研究领域出现。画图涉及到的学科很多包括数字信号处理、工程数学、信息论、运筹学等它与计算机、自动化、生物学、视觉心理和生理学、人工智能、智能信息处理等众多领域交叉、综合集成有广泛的应用。该软件功能与Windows下附件中的画图软件有相似功能。本程序是在VC平台上用MFC所编。绘制方面的功能主要包括绘制各种图元包括直线、矩形、椭圆、扇形、连续线用笔或画刷自由绘图。绘图时可以选择各种颜色各种线型和线宽。软件支持保存和读取wmf格式的图形。该软件设计的设计思想是面向对象程序设计的思想。 面向对象技术是一个非常实用而强有力的软件开发方法。它具有许多特色。一是方法的唯一性即方法是对软件开发过程所有阶段进行综合考虑而得到的。二是从生存期的一个阶段到下一个阶段的高度连续性即在一个阶段所用到的部分与在下一个阶段所使用的部分是衔接的所使用的技术经过生存期每一阶段后不改变。三是把面向对象分析(OOA)、面向对象设计(OOD)和面向对象程序设计(OOP)集成到生存期的相应阶段。该软件是Windows下附件中的画图软件的辅助工具。他可以帮我们完成绘制wmf格式的图形填充了画图程序不能完成wmf格式图形的空缺。由于笔者所学知识有限在绘图功能上有许多方面不能满足用户需求。希望读者提出宝贵的意见和建议。第章vc和MFC简介vc简介VC是Microsoft公司推出的一个基于Windows系统平台、可视化的集成开发环境它的源程序按C语言的要求编写并加入了微软提供的功能强大的MFC(MicrosoftFoundationClass)类库。MFC中封装了大部分WindowsAPI函数和Windows控件它包含的功能涉及到整个Windows操作系统。MFC不仅给用户提供了Windows图形环境下应用程序的框架而且还提供了创建应用程序的组件这样开发人员不必从头设计创建和管理一个标准Windows应用程序所需的程序而是从一个比较高的起点编程故节省了大量的时间。另外它提供了大量的代码指导用户编程时实现某些技术和功能。因此使用VC提供的高度可视化的应用程序开发工具和MFC类库可使应用程序开发变得简单。MFC简介MFC(MicrosoftFoundationClasses)是一个微软公司提供的类库(classlibraries)以C类的形式封装了Windows的API它包含了窗口等许多类的定义。各种类的集合构成了一个应运程序的框架结构以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。MFC版本封装了大约个类其中的一些可以被用户直接使用。例如CWnd类封装了窗口的功能包括打印文本、绘制图形及跟踪鼠标指针的移动等CsplitterWnd类是从CWnd类派生出来的继承了基类或称父类CWnd类的所有特性但增加了自己的功能实现拆分窗口使窗口至少可被拆分成两个窗口用户可以移动两个窗口之间的边框来改变窗口的大小CtoolBar类可以定义工具栏等。MFC命名的惯例是类的名字通常是由“C”打头成员变量使用前缀“m”接着使用一个字母来指明数据类型然后是变量的名称所有的单词用大写字母开头。第章基础知识工程的新建打开MicrosoftVisualC>点击File>New在Projects中选择MFCAppWizard(exe)在Projectname中输入工程的名字Graphic在Location中选择工程存放的路径。填完后点击OK按钮。(如图)填完后点击OK按钮弹出对话框(如图)。在弹出来的对话框中我们可以选择生成三种不同类型的应用程序:单文档、多文档、对话框。单文档程序如记事本在一个应用程序中只能对一个文档进行操作降低了编程的复杂度并减少了运行程序时所需的资源。对某些小型应用(比如文本编辑器或小型图像编辑器)可以采用这种类型的窗口应用程序。多文档程序如PhotoShop在一个应用程序中可以同时对多个文档进行操作对话框程序如QQ应用程序的界面是对话框形式的。现对话框版本的程序更小一些。除了节省资源外对话框版本的应用程序的加载速度也更快些。基于对话框的应用程序比完成相同功能的基于窗口的应用程序更简单有效。这里我们选第一个:单文档。选择完后点击Next设置默认最后点击Finish完成工程的创建。图图单文档简介生成单文档程序后进行编译在运行我们可以看到以下的结果。如图图在ClassView中我们可以看到系统自动为我们生成了五个类:CApp,CDoc,CView,CAboutDlg,CMainFrame。如图图CApp相当于C语言中的main()函数。是程序的起始。CDoc是用于处理程序中文档的类。CView主要是处理客户区的可视化的操作的类。CAboutDlg是处理关于对话框的类。CMainFrame是非客户区的一些资源的类。我们主要是对CView类进行操作。添加消息响应函数系统为我们生成了一个程序的框架但是这个框架完成不了什么具体的功能。为了使程序程序完成我们想要做的事我们要向这个框架中加入一些代码。VC程序的运行并不像C语言是按照顺序运行下来的。每当我们完成一个事件系统就会发出特定的消息程序就会跳到相应的消息响应函数中执行里面的代码。单击菜单中的View>ClassWizard(或按快捷键CtrlW)将会弹出MFCClassWizard对话框。在ClassName中选择CView在Messages中选择WMLBUTTONDBLCLK点击右边的AddFunction按键。这样我们就为程序添加了鼠标左键双击的消息响应函数函数名为OnLButtonDblClk(UINTnFlags,CPointpoint)。我们点击EditCode按键就可以进入消息响应函数中。我们在消息响应函数中添加如下代码:AfxMessageBox(“HelloWord!”)运行程序!当我们在客户区中双击鼠标左键时我们可以看到效果(如图)。我们在完成双击鼠标左键这个事件后Windows便会发出WMLBUTTONDBLCLK这条消息。我们的程序收到这个消息后就会跳转到鼠标左键双击的消息响应函数内执行里面的代码。同样的我们可以添加其他的消息响应函数如鼠标左键按下抬起鼠标移动等(WMLBUTTONUP、WMLBUTTONDOWN、WMMOUSEMOVE等)。我们程序就是在这样的消息响应机制下运行的。图资源在ResoureView里我们可以编辑对话框、菜单、工具条、快捷键等资源。点开Menu可以看到一个ID为IDRMAINFRAME的菜单。ID是一个标识实际上是一个无符号整型常量每一个资源在程序中都有一个唯一的ID号。双击IDRMAINFRAME在右边的视图中双击帮助右边的虚线框弹出菜单属性在Caption中输入“画图”并将其关闭。双击画图菜单下面出现虚线框在caption中输入“画线”后将其关闭。双击画线在弹出的菜单属性中ID栏的IDMENUITEM改成IDMENUITEMLINE。同样方法在建一个“画圆”菜单项。注意:每个资源对应一个ID号ID号的命名全部用大写字母且要符合匈牙利命名法。我们为新的菜单项起名如果我们选择了Popup生成的菜单就还有下级子菜单如果没有选择菜单就没有下级菜单。我们同样可以在ClassWizard中为我们生成的菜单添加响应。在ClassWizard中的ObjectIDs中选中菜单的ID号Messages中选择COMMOND然后点击AddFunction。这样我们就为新建的菜单添加了点击的响应我们同样可以点击EditCode编辑消息响应函数。设备环境CDC是设备环境类的基类直接由CObject派生。是GDI的关键元素它代表了物理设备。每一个C设备环境对象都有相对应Windows设备环境并通过一个位类型的HDC句柄来标识。CDC类的虚拟性使我们可以很容易的做到编写同时适用于多种设备的代码。使用CDC类可以使我们的作图不用关心设备的问题。CClientDC和CWindowDC是显示设备环境类都是由CDC派生而来区别在于CClientDC是窗口的客户区不包括边框、标题栏和菜单栏()指客户区域的左上角。CWindowDC的()指整个屏幕的左上角这意味着我们可以在显示器的任意地方绘图包括窗口边框、标题栏和菜单栏等等。CWindowDC一般应用在框架窗口而不是视图窗口。CDC对象被创建后一定要在合适的时候将它删除掉如果忘记了删除设备环境对象则会造成内存丢失。在每次绘图前我们要获取设备环境我们可以使用CDC*GetDC()函数来获取设备环境。在绘图完成后使用voidReleaseDC(CDC*pDC)函数释放设备环境。第章简易画图板的制作设计目的设计一个单文档类型的MFCAppWizard(exe)工程工程取名为:Graphic。此程序将实现简单的绘图功能包括点、直线、矩形、椭圆、扇形和连续线的绘制。并且能实现绘图的控制包括线宽、线型和颜色的设置图形的保存和打开以及笔刷的使用。总体设计设计图如图图详细设计首先新建一个单文档类型的MFCAppWizard(exe)工程工程取名为:Graphic。为此程序添加一个子菜单菜单名称为“绘图”并为其添加六个菜单项分别用来控制不同图形的绘制。当用户选择其中的一个菜单项后程序将按照当前的选择进行相应图形的绘制。添加的六个菜单项的ID及名称如表所示。然后分别为这六个菜单项添加命令响应本程序让视类(CGraphicView)对这些菜单命令进行响应这六个响应函数的名称分别如表所示。表添加的菜单项菜单项ID菜单项名称菜单项命令响应函数IDMDOT点OnDotIDMLINE直线OnLineIDMRECTANGLE矩形OnRectangleIDMELLIPSE椭圆OnEllipseIDMSHANXING扇形OnShanxingIDMLIANXUXIAN连续线OnLianxuxian在程序运行以后当用户单击某个菜单项时应该把用户的选择保存起来以便随后的绘图操作使用。因此在CGraphicView类中添加一个私有变量mnDrawType用来保存用户的选择该变量的定义如下所述:private:UINTmnDrawType接着在视类的构造函数中将此变量初始化为程序代码如下:CGraphicView::CGraphicView(){TODO:addconstructioncodeheremnDrawType=}利用switchcase语句来分别完成相应图形的绘制。当用户选择【绘图】菜单下的不同子菜单项时将变量mnDrawType设置为不同的值。程序代码如下:voidCGraphicView::OnDot(){TODO:AddyourcommandhandlercodeheremnDrawType=}voidCGraphicView::OnLine(){TODO:AddyourcommandhandlercodeheremnDrawType=}voidCGraphicView::OnRectangle(){TODO:AddyourcommandhandlercodeheremnDrawType=}voidCGraphicView::OnEllipse(){TODO:AddyourcommandhandlercodeheremnDrawType=}voidCGraphicView::OnShanxing(){TODO:AddyourcommandhandlercodeheremnDrawType=}voidCGraphicView::OnLianxuxian(){TODO:AddyourcommandhandlercodeheremnDrawType=}点、直线、矩形、椭圆的绘制对于直线、矩形和椭圆在绘制时都可有两点来确定其图形。当鼠标左击时得到一个点当鼠标左键松开时得到另外一个点。为视类CGraphicView分别捕获鼠标左键按下和弹起这两个消息。另外当鼠标左键按下时需要将鼠标当前按下点保存因此我们为CGraphicView再增加一个CPoint类型的私有成员变量:mptOrigin在视类的构造函数中将此变量初始化为。在鼠标按下消息响应函数中保存该点代码如下:voidCGraphicView::OnLButtonDown(UINTnFlags,CPointpoint){TODO:AddyourmessagehandlercodehereandorcalldefaultmptOrigin=point保存鼠标按下得到点也是绘制一个点CView::OnLButtonDown(nFlags,point)}在鼠标左键弹起消息响应函数中实现绘图代码如下:voidCGraphicView::OnLButtonUp(UINTnFlags,CPointpoint){TODO:Addyourmessagehandlercodehereandorcalldefault创建并获得设备描述CClientDCdc(this)switch(mnDrawType){case:dcSetPixel(point,RGB(,,))*绘制点*breakcase:*绘制直线*dcMoveTo(mptOrigin)*调用MoveTo函数移动到原点*dcLineTo(point)*调用LineTo函数绘制到终点。*breakcase:*绘制矩形*dcRectangle(CRect(mptOrigin,point))breakcase:*绘制椭圆*dcEllipse(CRect(mptOrigin,point))breakCView::OnLButtonUp(nFlags,point)}在上述程序中设置一个点用到的函数是SetPixel这也是CDC类的一个成员方法该函数的生命形式如下:COLORREFSetPixel(POINTpointCOLORREFcrColor)该函数是在指定的点设置一个像素。其中第一个参数(point)是指定的点第二个参数(crColor)是指定的颜色。在程序中设定的颜色在系统颜色表中可能不存在但系统会选择一种和这个颜色最接近的颜色。RGB是一个宏它有三个参数分别代表红、绿、蓝三种颜色的值。这三个参数BYTE类型取值范围为~。RGB(,,)是黑色RGB(,,)是白色将这三个分量设置成为~之间的任意值从而得到各种不同的颜色。这里的RGB(,,)是红色。绘制直线时首先调用MoveTo函数移动到原点然后调用LineTo函数绘制到终点。绘制矩形时使用Rectangle函数该函数声明形式为:BOOLRectangle(LPCRECTlpRect)该函数有一个指向Crect对象的参数后者可以利用两个点来构造。需要注意的是该函数需要的是指向Crect对象的指针而上述代码中传递的却是Crect对象但运行编译时也能成功通过运行时也不会报错这是为什么呢?我们知道C系列的语言都是强类型语言如果类型不匹配的话需要进行强制类型转换。但这里为什么没有进行这样的强制类型转换程序也可以通过呢?实际上Crect类提供了这样一个成员函数:重载LPCRECT操作符其作用是将Crect转换为LPCRECT类型。因此当在程序中给Rectangle函数的参数赋值时如果它发现该参数是一个Crect对象它就会隐式地调用LPCRECT操作符将Crect类型的对象转换为LPRECT类型。因此在给函数传递参数时如果我们看到的传递的数值类型和所需要的类型不匹配但编译和运行都正确的情况时就要想想这其中的缘由了。当然有的情况下可能是这些类型之间本来就可以互相转换例如short类型和int类型。但是参数是对象类的话就要考虑了它选择的对象的构造方法进行的隐式转换还是有其他重载的操作符。当用户选择椭圆菜单项时调用Ellipes函数绘制一个椭圆。连续线和扇形的绘制Windows系统为我们提供了一个画图程序在该程序中利用画笔可以绘制连续的线条下面我们设计绘制连续线和扇形。为了绘制连续的线条首先要得到线条的起点这在前面已经实现。然后需要捕获鼠标移动过程中的每一个点这可以通过捕获鼠标移动消息(WMMOUSEMOVE)来实现。在此消息响应函数中在依次捕获的各个点之间绘制一条条非常短的线段从而就可以绘制出一条连续的线条。遵照这一思路我们开始增加程序的功能。首先为视类增加鼠标移动消息(WMMOUSEMOVE)的响应函数(OnMouseMove)。这样只要鼠标在应用程序窗口中移动时都会进入到这个消息响应函数中。但这并不是我们所期望的我们希望在鼠标左键按下后开始绘图。因此我们需要有一个变量来表示鼠标左键是否按下这一状态然后在鼠标移动消息响应函数中对这一变量进行判断。当此变量为真即鼠标左键已经按下去我们开始绘图。于是为视类添加一个BOOL型的私有变量mbDraw当鼠标左键按下去时此变量为真当鼠标左键弹起时此变量为假这时我们就不再绘制线条了。该变量在视类头文件中的定义代码如下:Private:BOOLmbDraw接下来在视类的构造函数中将此变量初始化为FALSE。mbdraw=FALSE当鼠标左键按下去时在视类的OnLButtonDown函数中将此变量初始化为TRUE。mbdraw=TRUE当鼠标左键弹起时在视类的OnLButton函数中将此变量初始化为假。mbdraw=FALSE然后在OnMouseMove函数中首先对mbdraw变量进行判断如果其值为真说明鼠标左键已经按下去了这时就可开始进行画线操作。还有一点需要注意因为每绘制一条线段后下次应该从这条线段的终点开始继续绘制。因此绘制完当前线段后应该修改线段的起点将当前线段的终点作为下一条线段的起点程序代码如下:voidCGraphicView::OnMouseMove(UINTnFlags,CPointpoint){TODO:Addyourmessagehandlercodehereandorcalldefault{创建并获得设备描述CClientDCdc(this)创建宽度为的实线红色画笔CPenpen(PSSOLID,,RGB(,,))把创建的画笔选入设备描述CPen*pOldpen=dcSelectObject(pen)if(mbDraw==true){dcMoveTo(mptOrigin)dcLineTo(point)修改线段的起点mptOrigin=point}恢复设备描述dcSelectObject(pOldpen)CView::OnMouseMove(nFlags,point)}如果在上面绘制连续线条的程序中保持每段小直线的起点不变即以鼠标左键按下时的起点为起点不变分别绘制到鼠标移动点的直线这时就会出现扇形的效果。也就是去掉上述代码OnMouseMove函数中修改线段起点的代码。程序代码如下:voidCGraphicView::OnMouseMove(UINTnFlags,CPointpoint){TODO:Addyourmessagehandlercodehereandorcalldefault{创建并获得设备描述CClientDCdc(this)创建宽度为的实线红色画笔CPenpen(PSSOLID,,RGB(,,))把创建的画笔选入设备描述CPen*pOldpen=dcSelectObject(pen)if(mbDraw==true){dcMoveTo(mptOrigin)dcLineTo(point)}恢复设备描述dcSelectObject(pOldpen)CView::OnMouseMove(nFlags,point)}画刷再为此程序添加一个子菜单菜单名称为“画刷”并为其添加三个菜单项分别用来控制不同的画刷。MFC提供了一个CBrush类可以用来创建画刷对象。画刷通常用来填充一块区域。简单画刷、位图画刷、透明画刷程序代码如下:voidCDrawView::OnLButtonUp(UINTnFlags,CPointpoint){创建一个红色画刷CBrushbrush(RGB(,,))创建并获得设备描述表CClientDCdc(this)利用红色画刷填充鼠标拖曳过程中形成的矩形区域dcFillRect(CRect(mptOrigin,point),brush)创建位图对象CBitmapbitmap加载位图资源bitmapLoadBitmap(IDBBITMAP)创建位图画刷CBrushbrush(bitmap)创建并获得设备描述表CClientDCdc(this)利用红色画刷填充鼠标拖曳过程中形成的矩形区域dcFillRect(CRect(mptOrigin,point),brush)创建并获得设备描述表CClientDCdc(this)创建一个空画刷CBrush*pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(BRUSH))将空画刷选入设备描述表CBrush*pOldBrush=dcSelectObject(pBrush)绘制一个矩形dcRectangle(CRect(mptOrigin,point))恢复先前的画刷dcSelectObject(pOldBrush)mbDraw=FALSECView::OnLButtonUp(nFlags,point)}在简单画刷程序中首先创建一个红色画刷接着创建设备描述表对象然后调用设备描述表对象的成员函数FillRect利用指定的画刷填充一块指定的矩形区域而鼠标拖动过程中的起点和终点就决定了需要填充的矩形区域因此代码中通过CRect类利用鼠标拖动的起点和终点构造了这快矩形区域。CRect类提供了多个构造函数这里使用的是下面这种构造函数即通过指定矩形区域的左上角和右下角这两个点来构造一块矩形区域。CRect(POINTtopLeftPOINTbottomRight)代码中的CDC类的成员函数FillRect该函数的功能是用指定的画刷填充一个矩形。该函数将填充全部的矩形包括上左边界但不填充右底边界。FillRect函数的声明如下:voidFillRect(LPCRECTlpRectCBrush*pBrush)该函数有两个参数lpRect是指向一个RECT结构体或CRect对象的指针该结构体或对象中包含了要填充的矩形的逻辑坐标。pBrush是指向用于填充矩形的画刷对象的指针。在位图画刷程序中CBrush类有下面这样一种构造函数。CBrush(CBitmap*pBitmap)该构造函数要求一个CBitmap类型的指针CBitmap类是位图类于是我们就会这样想:利用这个构造函数是否就可以创建一个位图画刷呢?事实确实如此。创建CBitmap对象时仅调用其构造函数并不能得到一个有用的位图对象还需要调用一个初始化函数来初始化这个位图对象。CBitmap类提供了多个初始化函数例如LoadBitmap、CreateBitmap、BitmapIndirect等。这里用LoadBitmap函数来加载一副位图该函数的声明如下:BOOLLoadBitmap(LPCTSTRlpszResourceName)BOOLLoadBitmap(UINTnIDResource)其中第二种声明需要一个资源ID作为参数。首先给程序增加一个位图资源。为一个工程创建资源有多种实现方法其中一种方法可以利用【Insert】菜单下的【Resource…】命令在弹出的对话框中选择Bitmap资源类型单击【New】按钮即可创建一个默认名称为IDBBITMAP的位图资源并在VC集成开发环境右边的代码编辑区中打开位图编辑器。可以利用编辑器右边的调色板和绘图工具来编辑位图资源还可以通过拉伸位图编辑器中网格周围的蓝色方点来调整位图的大小。在透明画刷程序中我们利用GetStockObject这个函数来获取一个黑色或白色的画刷句柄。这个函数是否能够获得一个透明画刷句柄呢?从MSND提供的帮助信息中可以看到该函数的参数取值之一可以是BRUSH以获取一个空画刷。那么这个空画刷是否就是我们所需要的透明画刷呢?结论是正确的。但这时存在一个问题我们获取的是句柄而在进行绘制操作时需要的是一个画刷对象。如何从画刷句柄转换为画刷对象呢?CBrush类提供了一个FromHandle函数来实现这样的功能。该函数的声明如下:StaticCDC*PASCALFromHandle(HDChDC)设置对话框为程序添加一个设置对话框允许用户指定画笔的类型、线宽并让随后的绘图操作就使用用户指定的新设置值来进行绘制。为了实现这一功能首先需要为程序添加一个对话框资源并按下表修改属性。属性值IDIDDDLGSETTINGCaptionSettingFont宋体设置线型、线宽对话框的代码如下:voidCGraphicView::OnSetting(){TODO:AddyourcommandhandlercodehereCSettingDlgdlgdlgmnLineWidth=mnLineWidthdlgmnLineStyle=mnLineStyleif(IDOK==dlgDoModal()){mnLineWidth=dlgmnLineWidthmnLineStyle=dlgmnLineStyle}}颜色颜色对话框看起来比较复杂。实际上MFC为我们提供了一个类:CColorDialog可以很方便的创建这样的一个颜色对话框。voidCGraphicView::OnColor(){TODO:AddyourcommandhandlercodehereCColorDialogdlgdlgmccFlags|=CCRGBINIT|CCFULLOPENdlgmccrgbResult=mclrif(IDOK==dlgDoModal()){mclr=dlgmccrgbResult}}打开与保存voidCGraphicView::OnFileOpen(){TODO:AddyourcommandhandlercodehereHMETAFILEhmetaFilehmetaFile=GetMetaFile("metawmf")mdcMetaFilePlayMetaFile(hmetaFile)DeleteMetaFile(hmetaFile)Invalidate()}voidCGraphicView::OnFileSave(){TODO:AddyourcommandhandlercodehereHMETAFILEhmetaFilehmetaFile=mdcMetaFileClose()CopyMetaFile(hmetaFile,"metawmf")mdcMetaFileCreate()DeleteMetaFile(hmetaFile)}第章结果及结论运行结果运行结果如图、、图图图结论其实学任何一种语言都是一样的。需要勤奋毅力运气=成功这是我认为的一个公式。这里毅力和勤奋是个人因素而运气这是先天的。如果以前没有接触过编程语言的话在接触VC前我建议你先学习一些基础语言比如C等都是一些比较好学的基础语言我当初就是从C语言过度学VC的。学基础语言的目的是学习语法结构和如何编写概念只有你理解和掌握了这些编程用的工具才能学习高级语言。这些基础语言中我建议大家学C语言其实VC就是C也就是C语言的"儿子""父亲"学习起来比较容易上手但遇到类似WINDOWS的程序的时候比较固执不容易沟通在这种条件下才有了"儿子""儿子"比较开朗应变能力强但是就因为他这些优点才使初学者难以掌握。VC是C语言是一种面向对象的编程语言。他于基础语言不同点在于基础语言是一条路走到底的(中断技术除外)而面向对象是等待你的指令才往下走是被动的编程语言。这点是学习VC前必须扭转的概念。通过这次学年设计我了解vc是Windows平台上的C编程环境学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL、COM等的知识难度比较大。Windows下编程需要了解Windows的消息机制以及回调(callback)函数的原理MFC是WinAPI的包装类需要理解文档视图类的结构窗口类的结构消息流向等等COM是代码共享的二进制标准需要掌握其基本原理等等。基于我们这次用VC编写了一个简单的画图板功能不是很多但是从中的到不少收获。主要有:.对项目和文档的了解我们在编写程序时要对不同的文件进行编写。其中项目就是文件的集合包括头文件、源代码文件、资源文件。文档窗口也称编辑窗口是用户进行输入或编辑头文件、源文件、资源的区域。在编辑文件时为了增加程序的可读性系统用绿色显示注释语句用蓝色显示关键字。.菜单:我们绘制画图板时就要建立一个“绘图”菜单。对于“绘图”菜单下还有几个子菜单项通过建立菜单同时让它实现菜单上的命令这就要我们对每个菜单项进行设置诸如ID、标题、快捷键、热键等。还有一些属性设置设置不好容易出错所以每次建立菜单都需谨慎设置记住每个菜单对应的参数。文件打开与保存对于我们绘制出一幅图片那么我们就要把它保存下来。如果我们无法保存我们做了也就没没什么意义了。对于图形的保存于打开我们还存在很多问题自定义保存不同文件夹下尚未解决所以还需要我们进一步的学习和了解争取实现我们心里多希望的。在编程时遇到了图像在变换大小时原来的图形会消失后来通过老师的讲解及查看相关资料这里涉及的一个重绘问题。经过多次修改添加代码才得以解决。所以我觉得学习VC就要拿出那种坚持不懈的精神做什么也是只有你不放弃对它了解才会实现我们自己想要的这就要我们要不断的学习VC从中学习更多我们没了解到的知识。.对于CView视图经过查询主要是负责内存数据与用户的交互。包括数据的显示、用户操作的响应(如菜单的选取、鼠标的响应)。最重要的是OnDraw(重画窗口)通常用CWnd::Invalidate()来启动它。另外它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。最后通过学习VC从中受益匪浅更多的知识还有待于我们去挖掘实现更多有趣的东西同样它也是一个很强大的软件。参考文献【】《VC深入详解》孙鑫余安萍编著电子工业出版社出版【】《VC程序设计基础教程》谭浩强主编宋金珂高丽华张迎新编著清华大学出版社出版附录:简易画图板主要程序代码GraphicViewcpp:implementationoftheCGraphicViewclass#include"stdafxh"#include"Graphich"#include"GraphicDoch"#include"GraphicViewh"#include"SettingDlgh"#ifdefDEBUG#definenewDEBUGNEW#undefTHISFILEstaticcharTHISFILE=FILE#endifCGraphicViewIMPLEMENTDYNCREATE(CGraphicView,CView)BEGINMESSAGEMAP(CGraphicView,CView){{AFXMSGMAP(CGraphicView)ONCOMMAND(IDMDOT,OnDot)ONCOMMAND(IDMLINE,OnLine)ONCOMMAND(IDMRECTANGLE,OnRectangle)ONCOMMAND(IDMELLIPSE,OnEllipse)ONCOMMAND(IDMSHANXING,OnShanxing)ONCOMMAND(IDMLIANXUXIAN,OnLianxuxian)ONWMLBUTTONDOWN()ONWMLBUTTONUP()ONWMMOUSEMOVE()ONCOMMAND(IDMSETTING,OnSetting)ONCOMMAND(IDMCOLOR,OnColor)ONCOMMAND(IDMJDHS,OnJdhs)ONCOMMAND(IDMWTHS,OnWths)ONCOMMAND(IDMTMHS,OnTmhs)ONCOMMAND(IDFILEOPEN,OnFileOpen)ONCOMMAND(IDFILESAVE,OnFileSave)}}AFXMSGMAPStandardprintingcommandsONCOMMAND(IDFILEPRINT,CView::OnFilePrint)ONCOMMAND(IDFILEPRINTDIRECT,CView::OnFilePrint)ONCOMMAND(IDFILEPRINTPREVIEW,CView::OnFilePrintPreview)ENDMESSAGEMAP()CGraphicViewconstructiondestructionCGraphicView::CGraphicView(){TODO:addconstructioncodeheremnDrawType=mptOrigin=mbDraw=falsemnLineWidth=mnLineStyle=mclr=(,,)mdcMetaFileCreate()}CGraphicView::~CGraphicView(){}BOOLCGraphicView::PreCreateWindow(CREATESTRUCTcs){TODO:ModifytheWindowclassorstylesherebymodifyingtheCREATESTRUCTcsreturnCView::PreCreateWindow(cs)}CGraphicViewdrawingvoidCGraphicView::OnDraw(CDC*pDC){CGraphicDoc*pDoc=GetDocument()ASSERTVALID(pDoc)TODO:adddrawcodefornativedatahereHMETAFILEhmetaFilehmetaFile=mdcMetaFileClose()pDC>PlayMetaFile(hmetaFile)mdcMetaFileCreate()mdcMetaFilePlayMetaFile(hmetaFile)DeleteMetaFile(hmetaFile)}CGraphicViewprintingBOOLCGraphicView::OnPreparePrinting(CPrintInfo*pInfo){defaultpreparationreturnDoPreparePrinting(pInfo)}voidCGraphicView::OnBeginPrinting(CDC**pDC*,CPrintInfo**pInfo*){TODO:addextrainitializationbeforeprinting}voidCGraphicView::OnEndPrinting(CDC**pDC*,CPrintInfo**pInfo*){TODO:addcleanupafterprinting}CGraphicViewdiagnostics#ifdefDEBUGvoidCGraphicView::AssertValid()const{CView::AssertValid()}voidCGraphicView::Dump(CDumpContextdc)const{CView::Dump(dc)}CGraphicDoc*CGraphicView::GetDocument()nondebugversionisinline{ASSERT(mpDocument>IsKindOf(RUNTIMECLASS(CGraphicDoc)))return(CGraphicDoc*)mpDocument}#endifDEBUGCGraphicViewmessagehandlersvoidCGraphicView::OnDot(){TODO:AddyourcommandhandlercodeheremnDrawType=}voidCGraphicView::OnLine(){TODO:AddyourcommandhandlercodeheremnDrawType=}voidCGraphicView::OnRectangle(){TODO:AddyourcommandhandlercodeheremnDrawType=}voidCGraphicView::OnEllipse(){TODO:AddyourcommandhandlercodeheremnDrawType=}voidCGraphicView::OnShanxing

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/35

基于VC++MFC程序设计简易画图板

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利