基于VC++MFC程序设计简易画图板_第1页
基于VC++MFC程序设计简易画图板_第2页
基于VC++MFC程序设计简易画图板_第3页
基于VC++MFC程序设计简易画图板_第4页
基于VC++MFC程序设计简易画图板_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

1、包头师范学院本 科 学 年 论 文论文题目:基于VC+MFC程序设计简易画图板 院 系:信息科学与技术学院 专 业:计算机科学与技术 学 号: 姓 名: 指导教师: 撰写学年: 2010至2011学年 二零一零年十二月摘 要本软件是利用VC+这个强大的可视化编程工具开发的,软件主要功能包括图形的绘制、线型的设置、颜色的设置,图形文件的重绘和保存等功能。 本文介绍了如何完成上述功能,同时详细阐述了画图系统的实现过程以及对画图系统所做的功能扩充。在画图软件设计上,其主要任务是:实现“绘制图形”、“图形的保存”两项功能。 本软件具有实用性、稳定性、易用性,和可维护性的特点,应该说它应是一个开放性的软

2、件,用户可以根据需要对其功能进行扩充、完善与修改,使其符合自己的要求。总之,本软件是一个逐步完善的软件。关键词:VC+;MFC;绘图 AbstractThis software is using vc + + this powerful visual programming tool development, software main functions including graphics rendering, linetype Settings, color setting, graphics file redraw of preserving and function. The pap

3、er introduced how to accomplish these functions, and explains in detail drawing system realization process and to drawing system do function expansion. In drawing software design, its main task is to achieve "drawings", "graphic save" two functions. This software has practicabili

4、ty, stability, ease-of-use, and maintainability characteristic, should say it should be an open software, the user can according to the needs of its functions were expansion, perfect and modification, make them comply with their requirements. Anyhow, this software is a perfect gradually software. Ke

5、y words:Vc + +; MFC; drawing目录引 言1第1章vc+6.0和MFC简介21.1vc+6.0简介21.2MFC简介2第2章 基础知识22.1工程的新建32.2单文档简介42.3添加消息响应函数52.4资源52.5设备环境6第3章 简易画图板的制作63.1设计目的63.2 总体设计73.3详细设计73.3.1点、直线、矩形、椭圆的绘制93.3.2连续线和扇形的绘制113.3.3画刷133.3.4设置对话框153.3.5颜色163.3.6打开与保存17第4章 结果及结论174.1运行结果174.2结论18参考文献20附录:简易画图板主要程序代码21致谢31引 言计算机技术

6、的发展,使人类社会进入了信息化和自动化,计算机智能识别也随着计算机的发展得到了迅速的发展。特别是图形图像的计算机处理技术更是有了前所未有的进步和应用。计算机识别也逐渐的从图形图像处理的大环境下分离出来作为一门新的高科技研究领域出现。画图涉及到的学科很多,包括数字信号处理、工程数学、信息论、运筹学等,它与计算机、自动化、生物学、视觉心理和生理学、人工智能、智能信息处理等众多领域交叉、综合集成,有广泛的应用。该软件功能与Windows下附件中的画图软件有相似功能。本程序是在VC6.0平台上用MFC所编。绘制方面的功能主要包括绘制各种图元,包括直线、矩形、椭圆、扇形、连续线,用笔或画刷自由绘图。绘图

7、时可以选择各种颜色,各种线型和线宽。软件支持保存和读取wmf格式的图形。该软件设计的设计思想是面向对象程序设计的思想。 面向对象技术是一个非常实用而强有力的软件开发方法。它具有许多特色。一是方法的唯一性,即方法是对软件开发过程所有阶段进行综合考虑而得到的。二是从生存期的一个阶段到下一个阶段的高度连续性,即在一个阶段所用到的部分与在下一个阶段所使用的部分是衔接的,所使用的技术经过生存期每一阶段后不改变。三是把面向对象分析(OOA)、面向对象设计(OOD)和面向对象程序设计(OOP)集成到生存期的相应阶段。该软件是Windows下附件中的画图软件的辅助工具。他可以帮我们完成绘制wmf格式

8、的图形,填充了画图程序不能完成wmf格式图形的空缺。由于笔者所学知识有限,在绘图功能上有许多方面不能满足用户需求。希望读者提出宝贵的意见和建议。第1章vc+6.0和MFC简介1.1 vc+6.0简介VC+6.0是Microsoft公司推出的一个基于Windows系统平台、可视化的集成开发环境,它的源程序按C+语言的要求编写,并加入了微软提供的功能强大的MFC(Microsoft Foundation Class)类库。MFC中封装了大部分Windows API函数和Windows控件,它包含的功能涉及到整个Windows操作系统。MFC不仅给用户提供了Windows图形环境下应用程序的框架,而

9、且还提供了创建应用程序的组件,这样,开发人员不必从头设计创建和管理一个标准Windows应用程序所需的程序,而是从一个比较高的起点编程,故节省了大量的时间。另外,它提供了大量的代码,指导用户编程时实现某些技术和功能。因此,使用VC+提供的高度可视化的应用程序开发工具和MFC类库,可使应用程序开发变得简单。1.2 MFC简介MFC(Microsoft Foundation Classes),是一个微软公司提供的类库(class libraries),以C+类的形式封装了Windows的API,它包含了窗口等许多类的定义。各种类的集合构成了一个应运程序的框架结构,以减少应用程序开发人员的工作量。其

10、中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。MFC 6.0版本封装了大约200个类,其中的一些可以被用户直接使用。例如CWnd类封装了窗口的功能,包括打印文本、绘制图形及跟踪鼠标指针的移动等;CsplitterWnd类是从CWnd类派生出来的,继承了基类或称父类CWnd类的所有特性,但增加了自己的功能,实现拆分窗口,使窗口至少可被拆分成两个窗口,用户可以移动两个窗口之间的边框来改变窗口的大小;CtoolBar类可以定义工具栏等。MFC命名的惯例是类的名字通常是由“C”打头;成员变量使用前缀“m_”,接着使用一个字母来指明数据类型,然后是变量的名称;所

11、有的单词用大写字母开头。第2章 基础知识2.1工程的新建打开Microsoft Visual C+ 6.0 > 点击File > New 在Projects中选择 MFC AppWizard (exe) ; 在 Project name中输入工程的名字Graphic,在 Location中选择工程存放的路径。填完后点击OK按钮。(如图1)填完后点击OK按钮,弹出对话框(如图2)。在弹出来的对话框中我们可以选择生成三种不同类型的应用程序:单文档、多文档、对话框。 单文档程序如记事本,在一个应用程序中只能对一个文档进行操作,降低了编程的复杂度并减少了运行程序时所需的资源。对某些小型应用

12、(比如文本编辑器或小型图像编辑器)可以采用这种类型的窗口应用程序。 多文档程序如PhotoShop,在一个应用程序中可以同时对多个文档进行操作; 对话框程序如QQ,应用程序的界面是对话框形式的。现对话框版本的程序更小一些。除了节省资源外,对话框版本的应用程序的加载速度也更快些。基于对话框的应用程序比完成相同功能的基于窗口的应用程序更简单有效。 这里我们选第一个:单文档。 选择完后点击Next,设置默认,最后点击Finish完成工程的创建。图1图22.2单文档简介 生成单文档程序后,进行编译,在运行,我们可以看到以下的结果。如图3 图3在ClassView中,我们可以看到系统自动为我们生成了五个

13、类:CApp , CDoc , CView , CAboutDlg , CMainFrame。 如图4图4CApp相当于C语言中的main()函数。是程序的起始。 CDoc是用于处理程序中文档的类。 CView主要是处理客户区的可视化的操作的类。 CAboutDlg是处理关于对话框的类。 CMainFrame是非客户区的一些资源的类。 我们主要是对CView 类进行操作。2.3添加消息响应函数 系统为我们生成了一个程序的框架,但是这个框架完成不了什么具体的功能。为了使程序程序完成我们想要做的事,我们要向这个框架中加入一些代码。 VC+程序的运行并不像C语言是按照顺序运行下来的。每当我们完成一个

14、事件,系统就会发出特定的消息,程序就会跳到相应的消息响应函数中执行里面的代码。单击菜单中的View->Class Wizard(或按快捷键Ctrl+W),将会弹出MFC Class Wizard对话框。在Class Name中选择CView,在Messages中选择WM_LBUTTONDBLCLK,点击右边的Add Function按键。这样我们就为程序添加了鼠标左键双击的消息响应函数,函数名为OnLButtonDblClk(UINT nFlags, CPoint point)。我们点击Edit Code按键就可以进入消息响应函数中。 我们在消息响应函数中添加如下代码: AfxMessa

15、geBox(“Hello Word!”); 运行程序!当我们在客户区中双击鼠标左键时,我们可以看到效果(如图5)。 我们在完成双击鼠标左键这个事件后,Windows便会发出WM_LBUTTONDBLCLK这条消息。我们的程序收到这个消息后,就会跳转到鼠标左键双击的消息响应函数内,执行里面的代码。 同样的,我们可以添加其他的消息响应函数,如鼠标左键按下,抬起,鼠标移动等(WM_LBUTTONUP、WM_LBUTTONDOWN、WM_MOUSEMOVE等)。我们程序就是在这样的消息响应机制下运行的。 图52.4资源 在ResoureView 里,我们可以编辑对话框、菜单、工具条、快捷键等资源。 点

16、开Menu,可以看到一个ID为IDR_MAINFRAME的菜单。ID是一个标识,实际上是一个无符号整型常量,每一个资源在程序中都有一个唯一的ID号。双击IDR_MAINFRAME,在右边的视图中双击帮助右边的虚线框,弹出菜单属性,在Caption中输入“画图”,并将其关闭。双击画图菜单下面出现虚线框,在caption中输入“画线”后将其关闭。双击画线,在弹出的菜单属性中ID栏的ID_MENUITEM32775改成ID_MENUITEM_LINE。同样方法在建一个“画圆”菜单项。注意:每个资源对应一个ID号,ID号的命名全部用大写字母,且要符合匈牙利命名法。我们为新的菜单项起名,如果我们选择了P

17、op-up,生成的菜单就还有下级子菜单;如果没有选择,菜单就没有下级菜单。我们同样可以在Class Wizard 中为我们生成的菜单添加响应。 在Class Wizard 中的Object IDs中选中菜单的ID号,Messages中选择COMMOND,然后点击Add Function。这样,我们就为新建的菜单添加了点击的响应,我们同样可以点击Edit Code 编辑消息响应函数。 2.5设备环境 CDC是设备环境类的基类直接由CObject派生。是GDI的关键元素,它代表了物理设备。每一个C+设备环境对象都有相对应Windows设备环境,并通过一个32位类型的HDC句柄来标识。CDC类的虚拟

18、性使我们可以很容易的做到编写同时适用于多种设备的代码。使用CDC类可以使我们的作图不用关心设备的问题。 CClientDC和CWindowDC是显示设备环境类,都是由CDC派生而来,区别在于CClientDC是窗口的客户区不包括边框、标题栏和菜单栏,(0,0)指客户区域的左上角。CWindowDC的(0,0)指整个屏幕的左上角,这意味着我们可以在显示器的任意地方绘图,包括窗口边框、标题栏和菜单栏等等。CWindowDC一般应用在框架窗口,而不是视图窗口。 CDC对象被创建后一定要在合适的时候将它删除掉,如果忘记了删除设备环境对象则会造成内存丢失。在每次绘图前,我们要获取设备环境,我们可以使用C

19、DC* GetDC ( ) 函数来获取设备环境。在绘图完成后,使用void ReleaseDC(CDC* pDC ) 函数释放设备环境。第3章 简易画图板的制作3.1设计目的设计一个单文档类型的MFC AppWizard (exe)工程,工程取名为:Graphic。此程序将实现简单的绘图功能,包括点、直线、矩形、椭圆、扇形和连续线的绘制。并且能实现绘图的控制,包括线宽、线型和颜色的设置,图形的保存和打开以及笔刷的使用。3.2 总体设计设计图如图6简易画图板文件绘图笔刷打开保存点直线矩形椭圆扇形连续线设置颜色简单笔刷位图笔刷透明笔刷线宽线型图63.3详细设计首先,新建一个单文档类型的MFC Ap

20、pWizard (exe)工程,工程取名为:Graphic。为此程序添加一个子菜单,菜单名称为“绘图”,并为其添加六个菜单项,分别用来控制不同图形的绘制。当用户选择其中的一个菜单项后,程序将按照当前的选择进行相应图形的绘制。添加的六个菜单项的ID及名称如表1所示。然后分别为这六个菜单项添加命令响应,本程序让视类(CGraphicView)对这些菜单命令进行响应,这六个响应函数的名称分别如表1所示。表1添加的菜单项菜单项ID菜单项名称菜单项命令响应函数IDM_DOT点OnDotIDM_LINE直线OnLineIDM-RECTANGLE矩形OnRectangleIDM_ELLIPSE椭圆OnEll

21、ipseIDM_SHANXING扇形OnShanxingIDM_LIANXUXIAN连续线OnLianxuxian在程序运行以后,当用户单击某个菜单项时,应该把用户的选择保存起来,以便随后的绘图操作使用。因此在CGraphicView类中添加一个私有变量m_nDrawType;用来保存用户的选择,该变量的定义如下所述:private: UINT m_nDrawType;接着,在视类的构造函数中将此变量初始化为0,程序代码如下:CGraphicView:CGraphicView()/ TODO: add construction code here m_nDrawType=0;利用switch/

22、case语句,来分别完成相应图形的绘制。当用户选择【绘图】菜单下的不同子菜单项时,将变量m_nDrawType设置为不同的值。程序代码如下:void CGraphicView:OnDot() / TODO: Add your command handler code herem_nDrawType=1;void CGraphicView:OnLine() / TODO: Add your command handler code herem_nDrawType=2;void CGraphicView:OnRectangle() / TODO: Add your command handler

23、code herem_nDrawType=3;void CGraphicView:OnEllipse() / TODO: Add your command handler code herem_nDrawType=4;void CGraphicView:OnShanxing() / TODO: Add your command handler code herem_nDrawType=5;void CGraphicView:OnLianxuxian() / TODO: Add your command handler code herem_nDrawType=6;3.3.1点、直线、矩形、椭圆

24、的绘制对于直线、矩形和椭圆,在绘制时都可有两点来确定其图形。当鼠标左击时得到一个点,当鼠标左键松开时得到另外一个点。为视类CGraphicView分别捕获鼠标左键按下和弹起这两个消息。另外当鼠标左键按下时,需要将鼠标当前按下点保存,因此我们为CGraphicView再增加一个CPoint类型的私有成员变量:m_ptOrigin,在视类的构造函数中将此变量初始化为0。在鼠标按下消息响应函数中,保存该点,代码如下:void CGraphicView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler c

25、ode here and/or call defaultm_ptOrigin=point; /保存鼠标按下得到点,也是绘制一个点CView:OnLButtonDown(nFlags, point);在鼠标左键弹起消息响应函数中实现绘图,代码如下:void CGraphicView:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default/创建并获得设备描述CClientDC dc(this); switch (m_nDrawType)case 1:d

26、c.SetPixel(point,RGB(255,0,0)); /*绘制点*/break;case 2: /*绘制直线*/dc.MoveTo(m_ptOrigin);/*调用MoveTo函数移动到原点*/dc.LineTo(point);/*调用LineTo函数绘制到终点。*/break;case 3: /*绘制矩形*/ dc.Rectangle(CRect(m_ptOrigin,point);break;case 4: /*绘制椭圆*/dc.Ellipse(CRect(m_ptOrigin,point);break;CView:OnLButtonUp(nFlags, point);在上述程序

27、中,设置一个点,用到的函数是SetPixel,这也是CDC类的一个成员方法,该函数的生命形式如下:COLORREF SetPixel (POINT point,COLORREF crColor);该函数是在指定的点设置一个像素。其中第一个参数(point)是指定的点,第二个参数(crColor)是指定的颜色。在程序中设定的颜色在系统颜色表中可能不存在,但系统会选择一种和这个颜色最接近的颜色。RGB是一个宏,它有三个参数,分别代表红、绿、蓝三种颜色的值。这三个参数BYTE类型,取值范围为0255。RGB(0,0,0)是黑色,RGB(255,255,255)是白色,将这三个分量设置成为0255之间

28、的任意值,从而得到各种不同的颜色。这里的RGB(255,0,0)是红色。绘制直线时,首先调用MoveTo函数移动到原点,然后调用LineTo函数绘制到终点。绘制矩形时使用Rectangle函数,该函数声明形式为:BOOL Rectangle (LPCRECT lpRect);该函数有一个指向Crect对象的参数,后者可以利用两个点来构造。需要注意的是该函数需要的是指向Crect对象的指针,而上述代码中传递的却是Crect对象,但运行编译时也能成功通过,运行时也不会报错,这是为什么呢?我们知道C系列的语言都是强类型语言,如果类型不匹配的话,需要进行强制类型转换。但这里为什么没有进行这样的强制类型

29、转换程序也可以通过呢?实际上,Crect类提供了这样一个成员函数:重载LPCRECT操作符,其作用是将Crect转换为LPCRECT类型。因此,当在程序中给Rectangle函数的参数赋值时,如果它发现该参数是一个Crect对象,它就会隐式地调用LPCRECT操作符,将Crect类型的对象转换为LPRECT类型。因此,在给函数传递参数时,如果我们看到的传递的数值类型和所需要的类型不匹配,但编译和运行都正确的情况时,就要想想这其中的缘由了。当然,有的情况下可能是这些类型之间本来就可以互相转换,例如short类型和int类型。但是参数是对象类的话,就要考虑了,它选择的对象的构造方法进行的隐式转换,

30、还是有其他重载的操作符。当用户选择椭圆菜单项时,调用Ellipes函数绘制一个椭圆。3.3.2连续线和扇形的绘制Windows系统为我们提供了一个画图程序,在该程序中,利用画笔可以绘制连续的线条,下面我们设计绘制连续线和扇形。为了绘制连续的线条,首先要得到线条的起点,这在前面已经实现。然后需要捕获鼠标移动过程中的每一个点,这可以通过捕获鼠标移动消息(WM_MOUSEMOVE)来实现。在此消息响应函数中,在依次捕获的各个点之间绘制一条条非常短的线段,从而就可以绘制出一条连续的线条。遵照这一思路,我们开始增加程序的功能。首先为视类增加鼠标移动消息(WM_MOUSEMOVE)的响应函数(OnMous

31、eMove)。这样,只要鼠标在应用程序窗口中移动时都会进入到这个消息响应函数中。但这并不是我们所期望的,我们希望在鼠标左键按下后开始绘图。因此,我们需要有一个变量来表示鼠标左键是否按下这一状态,然后在鼠标移动消息响应函数中对这一变量进行判断。当此变量为真,即鼠标左键已经按下去,我们开始绘图。于是,为视类添加一个BOOL型的私有变量m_bDraw,当鼠标左键按下去时,此变量为真;当鼠标左键弹起时,此变量为假,这时,我们就不再绘制线条了。该变量在视类头文件中的定义代码如下:Private: BOOL m_bDraw;接下来在视类的构造函数中,将此变量初始化为FALSE。m_bdraw=FALSE;

32、当鼠标左键按下去时,在视类的OnLButtonDown函数中将此变量初始化为TRUE。m_bdraw=TRUE;当鼠标左键弹起时,在视类的OnLButton函数中将此变量初始化为假。m_bdraw=FALSE;然后在OnMouseMove函数中首先对m_bdraw变量进行判断,如果其值为真,说明鼠标左键已经按下去了,这时就可开始进行画线操作。还有一点需要注意,因为每绘制一条线段后,下次应该从这条线段的终点开始继续绘制。因此,绘制完当前线段后,应该修改线段的起点,将当前线段的终点作为下一条线段的起点,程序代码如下:void CGraphicView:OnMouseMove(UINT nFlags

33、, CPoint point) /TODO: Add your message handler code here and/or call default/创建并获得设备描述 CClientDC dc(this);/创建宽度为1的实线红色画笔CPen pen (PS_SOLID, 1, RGB(255,0,0));/把创建的画笔选入设备描述 CPen *pOldpen=dc.SelectObject(&pen);if(m_bDraw=true)dc.MoveTo(m_ptOrigin); dc.LineTo(point);/修改线段的起点 m_ptOrigin=point;/恢复设备描

34、述dc.SelectObject(pOldpen); CView:OnMouseMove(nFlags, point);如果在上面绘制连续线条的程序中,保持每段小直线的起点不变,即以鼠标左键按下时的起点为起点不变,分别绘制到鼠标移动点的直线,这时就会出现扇形的效果。也就是去掉上述代码OnMouseMove函数中修改线段起点的代码。程序代码如下:void CGraphicView:OnMouseMove(UINT nFlags, CPoint point) /TODO: Add your message handler code here and/or call default/创建并获得设备描

35、述 CClientDC dc(this);/创建宽度为1的实线红色画笔CPen pen (PS_SOLID, 1, RGB(255,0,0));/把创建的画笔选入设备描述 CPen *pOldpen=dc.SelectObject(&pen);if(m_bDraw=true)dc.MoveTo(m_ptOrigin); dc.LineTo(point);/恢复设备描述dc.SelectObject(pOldpen); CView:OnMouseMove(nFlags, point);3.3.3画刷再为此程序添加一个子菜单,菜单名称为“画刷”,并为其添加三个菜单项,分别用来控制不同的画刷

36、。MFC提供了一个CBrush类,可以用来创建画刷对象。画刷通常用来填充一块区域。简单画刷、位图画刷、透明画刷,程序代码如下:void CDrawView:OnLButtonUp(UINT nFlags, CPoint point) /创建一个红色画刷CBrush brush(RGB(255,0,0);/创建并获得设备描述表CClientDC dc(this);/利用红色画刷填充鼠标拖曳过程中形成的矩形区域dc.FillRect(CRect(m_ptOrigin,point),&brush);/创建位图对象CBitmap bitmap;/加载位图资源bitmap.LoadBitmap(

37、IDB_BITMAP1);/创建位图画刷CBrush brush(&bitmap);/创建并获得设备描述表CClientDC dc(this);/利用红色画刷填充鼠标拖曳过程中形成的矩形区域dc.FillRect(CRect(m_ptOrigin,point),&brush);/创建并获得设备描述表CClientDC dc(this);/创建一个空画刷CBrush *pBrush = CBrush:FromHandle(HBRUSH)GetStockObject(NULL_BRUSH);/将空画刷选入设备描述表CBrush *pOldBrush = dc.SelectObjec

38、t(pBrush);/绘制一个矩形dc.Rectangle(CRect(m_ptOrigin,point);/恢复先前的画刷dc.SelectObject(pOldBrush);m_bDraw = FALSE;CView:OnLButtonUp(nFlags, point);在简单画刷程序中,首先创建一个红色画刷;接着创建设备描述表对象;然后调用设备描述表对象的成员函数FillRect,利用指定的画刷填充一块指定的矩形区域,而鼠标拖动过程中的起点和终点就决定了需要填充的矩形区域,因此,代码中通过CRect类利用鼠标拖动的起点和终点构造了这快矩形区域。CRect类提供了多个构造函数,这里使用的是

39、下面这种构造函数,即通过指定矩形区域的左上角和右下角这两个点来构造一块矩形区域。CRect(POINT topLeft,POINT bottomRight);代码中的CDC类的成员函数FillRect,该函数的功能是用指定的画刷填充一个矩形。该函数将填充全部的矩形,包括上左边界,但不填充右底边界。FillRect函数的声明如下:void FillRect (LPCRECT lpRect,CBrush* pBrush);该函数有两个参数,lpRect是指向一个RECT结构体或CRect对象的指针,该结构体或对象中包含了要填充的矩形的逻辑坐标。pBrush是指向用于填充矩形的画刷对象的指针。在位图

40、画刷程序中,CBrush类有下面这样一种构造函数。CBrush (CBitmap* pBitmap);该构造函数要求一个CBitmap类型的指针,CBitmap类是位图类,于是我们就会这样想:利用这个构造函数是否就可以创建一个位图画刷呢?事实确实如此。创建CBitmap对象时,仅调用其构造函数并不能得到一个有用的位图对象,还需要调用一个初始化函数来初始化这个位图对象。CBitmap类提供了多个初始化函数,例如,LoadBitmap、CreateBitmap、BitmapIndirect等。这里用LoadBitmap函数来加载一副位图,该函数的声明如下:BOOL LoadBitmap (LPCT

41、STR lpszResourceName);BOOL LoadBitmap (UINT nIDResource);其中第二种声明需要一个资源ID作为参数。首先给程序增加一个位图资源。为一个工程创建资源有多种实现方法,其中一种方法可以利用【Insert】菜单下的【Resource】命令,在弹出的对话框中选择Bitmap资源类型,单击【New】按钮,即可创建一个默认名称为IDB_BITMAP1的位图资源,并在VC+集成开发环境右边的代码编辑区中打开位图编辑器。可以利用编辑器右边的调色板和绘图工具来编辑位图资源,还可以通过拉伸位图编辑器中网格周围的蓝色方点来调整位图的大小。在透明画刷程序中,我们利用

42、GetStockObject这个函数来获取一个黑色或白色的画刷句柄。这个函数是否能够获得一个透明画刷句柄呢?从MSND提供的帮助信息中,可以看到该函数的参数取值之一可以是NULL_BRUSH,以获取一个空画刷。那么,这个空画刷是否就是我们所需要的透明画刷呢?结论是正确的。但这时存在一个问题,我们获取的是句柄,而在进行绘制操作时需要的是一个画刷对象。如何从画刷句柄转换为画刷对象呢?CBrush类提供了一个FromHandle函数来实现这样的功能。该函数的声明如下:Static CDC* PASCAL FromHandle(HDC hDC);3.3.4设置对话框为程序添加一个设置对话框,允许用户指

43、定画笔的类型、线宽,并让随后的绘图操作就使用用户指定的新设置值来进行绘制。为了实现这一功能,首先需要为程序添加一个对话框资源,并按下表修改属性。属性值IDIDD_DLG_SETTINGCaptionSettingFont宋体设置线型、线宽对话框的代码如下:void CGraphicView:OnSetting() /TODO: Add your command handler code hereCSettingDlg dlg;dlg.m_nLineWidth=m_nLineWidth; dlg.m_nLineStyle=m_nLineStyle;if(IDOK=dlg.DoModal()m_n

44、LineWidth=dlg.m_nLineWidth; m_nLineStyle=dlg.m_nLineStyle;3.3.5颜色颜色对话框看起来比较复杂。实际上,MFC为我们提供了一个类:CColorDialog,可以很方便的创建这样的一个颜色对话框。void CGraphicView:OnColor() / TODO: Add your command handler code here CColorDialog dlg;dlg.m_cc.Flags |=CC_RGBINIT | CC_FULLOPEN; dlg.m_cc.rgbResult=m_clr;if(IDOK=dlg.DoMod

45、al()m_clr=dlg.m_cc.rgbResult;3.3.6打开与保存void CGraphicView:OnFileOpen() / TODO: Add your command handler code hereHMETAFILE hmetaFile;hmetaFile=GetMetaFile("meta.wmf");m_dcMetaFile.PlayMetaFile(hmetaFile);DeleteMetaFile(hmetaFile);Invalidate();void CGraphicView:OnFileSave() / TODO: Add your

46、command handler code here HMETAFILE hmetaFile;hmetaFile=m_dcMetaFile.Close();CopyMetaFile(hmetaFile,"meta.wmf");m_dcMetaFile.Create();DeleteMetaFile(hmetaFile);第4章 结果及结论4.1运行结果运行结果如图7、8、9图7图8图94.2结论其实学任何一种语言都是一样的。需要勤奋+毅力+运气=成功,这是我认为的一个公式。这里毅力和勤奋是个人因素,而运气这是先天的。如果以前没有接触过编程语言的话,在接触VC前我建议你先学习一

47、些基础语言,比如C等都是一些比较好学的基础语言,我当初就是从C语言过度学VC的。学基础语言的目的是学习语法结构和如何编写概念,只有你理解和掌握了这些编程用的工具才能学习高级语言。这些基础语言中我建议大家学C语言,其实VC就是C+也就是C语言的"儿子","父亲"学习起来比较容易上手,但遇到类似WINDOWS的程序的时候比较固执不容易沟通,在这种条件下才有了"儿子","儿子"比较开朗应变能力强,但是就因为他这些优点才使初学者难以掌握。 VC是C+语言,是一种面向对象的编程语言。他于基础语言不同点在于,基础语言是一条路走

48、到底的(中断技术除外),而面向对象是等待你的指令才往下走,是被动的编程语言。这点是学习VC前必须扭转的概念。通过这次学年设计,我了解vc+是Windows平台上的C+编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL、COM等的知识,难度比较大。Windows下编程需要了解Windows的消息机制以及回调(callback)函数的原理;MFC是Win32API的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等等;COM是代码共享的二进制标准,需要掌握其基本原理等等。基于我们这次用VC+编写了一个简单的画图板,功能不是很多,但是从中的到不少收获。主要有:1对

49、项目和文档的了解,我们在编写程序时,要对不同的文件进行编写。其中项目就是文件的集合,包括头文件、源代码文件、资源文件。文档窗口也称编辑窗口,是用户进行输入或编辑头文件、源文件、资源的区域。在编辑文件时,为了增加程序的可读性,系统用绿色显示注释语句,用蓝色显示关键字。2菜单:我们绘制画图板时,就要建立一个“绘图”菜单。对于“绘图”菜单下还有几个子菜单项,通过建立菜单同时让它实现菜单上的命令,这就要我们对每个菜单项进行设置,诸如,ID、标题、快捷键、热键等。还有一些属性设置,设置不好,容易出错,所以每次建立菜单,都需谨慎设置,记住每个菜单对应的参数。3.文件打开与保存,对于我们绘制出一幅图片,那么

50、我们就要把它保存下来。如果我们无法保存,我们做了也就没没什么意义了。对于图形的保存于打开,我们还存在很多问题,自定义保存不同文件夹下尚未解决,所以还需要我们进一步的学习和了解,争取实现我们心里多希望的。4.在编程时遇到了图像在变换大小时,原来的图形会消失,后来通过老师的讲解,及查看相关资料,这里涉及的一个重绘问题。经过多次修改,添加代码,才得以解决。所以我觉得学习VC+就要拿出那种坚持不懈的精神,做什么也是,只有你不放弃对它了解,才会实现我们自己想要的,这就要我们要不断的学习VC+,从中学习更多我们没了解到的知识。5对于CView视图,经过查询主要是负责内存数据与用户的交互。包括数据的显示、用

51、户操作的响应(如菜单的选取、鼠标的响应)。最重要的是OnDraw(重画窗口),通常用CWnd:Invalidate()来启动它。另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。最后通过学习VC+,从中受益匪浅,更多的知识,还有待于我们去挖掘实现更多有趣的东西,同样它也是一个很强大的软件。参考文献【1】VC+深入详解 孙鑫 余安萍 编著 电子工业出版社出版【2】VC+程序设计基础教程 谭浩强 主编 宋金珂 高丽华 张迎新 编著 清华大学出版社出版附录:简易画图板主要程序代码/ GraphicView.cpp : implementation of the CGraphicView

52、class#include "stdafx.h"#include "Graphic.h"#include "GraphicDoc.h"#include "GraphicView.h"#include "SettingDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CGraphicViewIMPLEMENT_DYNCREATE(CGraphicView, C

53、View)BEGIN_MESSAGE_MAP(CGraphicView, CView)/AFX_MSG_MAP(CGraphicView)ON_COMMAND(IDM_DOT, OnDot)ON_COMMAND(IDM_LINE, OnLine)ON_COMMAND(IDM_RECTANGLE, OnRectangle)ON_COMMAND(IDM_ELLIPSE, OnEllipse)ON_COMMAND(IDM_SHANXING, OnShanxing)ON_COMMAND(IDM_LIANXUXIAN, OnLianxuxian)ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()ON_COMMAND(IDM_SETTING, OnSetting)ON_COMMAND(IDM_COLOR, OnColor)ON_COMMAND(IDM_JDHS, OnJdhs)ON_COMMAND(IDM_WTHS, OnWths)

温馨提示

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

评论

0/150

提交评论