基于VCMFC程序设计简易画图板.docx
- 文档编号:26384655
- 上传时间:2023-06-18
- 格式:DOCX
- 页数:36
- 大小:146.65KB
基于VCMFC程序设计简易画图板.docx
《基于VCMFC程序设计简易画图板.docx》由会员分享,可在线阅读,更多相关《基于VCMFC程序设计简易画图板.docx(36页珍藏版)》请在冰豆网上搜索。
基于VCMFC程序设计简易画图板
包头师范学院
本科学年论文
论文题目:
基于VC++MFC程序设计——简易画图板
院系:
信息科学与技术学院
专业:
计算机科学与技术
学号:
姓名:
指导教师:
撰写学年:
2010至2011学年
二零一零年十二月
摘要
本软件是利用VC++这个强大的可视化编程工具开发的,软件主要功能包括图形的绘制、线型的设置、颜色的设置,图形文件的重绘和保存等功能。
本文介绍了如何完成上述功能,同时详细阐述了画图系统的实现过程以及对画图系统所做的功能扩充。
在画图软件设计上,其主要任务是:
实现“绘制图形”、“图形的保存”两项功能。
本软件具有实用性、稳定性、易用性,和可维护性的特点,应该说它应是一个开放性的软件,用户可以根据需要对其功能进行扩充、完善与修改,使其符合自己的要求。
总之,本软件是一个逐步完善的软件。
关键词:
VC++;MFC;绘图
Abstract
Thissoftwareisusingvc++thispowerfulvisualprogrammingtooldevelopment,softwaremainfunctionsincludinggraphicsrendering,linetypeSettings,colorsetting,graphicsfileredrawofpreservingandfunction.
Thepaperintroducedhowtoaccomplishthesefunctions,andexplainsindetaildrawingsystemrealizationprocessandtodrawingsystemdofunctionexpansion.Indrawingsoftwaredesign,itsmaintaskistoachieve"drawings","graphicsave"twofunctions.
Thissoftwarehaspracticability,stability,ease-of-use,andmaintainabilitycharacteristic,shouldsayitshouldbeanopensoftware,theusercanaccordingtotheneedsofitsfunctionswereexpansion,perfectandmodification,makethemcomplywiththeirrequirements.Anyhow,thissoftwareisaperfectgraduallysoftware.
Keywords:
Vc++;MFC;drawing
引言1
第1章vc++6.0和MFC简介2
1.1vc++6.0简介2
1.2MFC简介2
第2章基础知识2
2.1工程的新建3
2.2单文档简介4
2.3添加消息响应函数5
2.4资源5
2.5设备环境6
第3章简易画图板的制作6
3.1设计目的6
3.2总体设计7
3.3详细设计7
3.3.1点、直线、矩形、椭圆的绘制9
3.3.2连续线和扇形的绘制11
3.3.3画刷13
3.3.4设置对话框15
3.3.5颜色16
3.3.6打开与保存17
第4章结果及结论17
4.1运行结果17
4.2结论18
参考文献20
附录:
简易画图板主要程序代码21
致谢31
引言
计算机技术的发展,使人类社会进入了信息化和自动化,计算机智能识别也随着计算机的发展得到了迅速的发展。
特别是图形图像的计算机处理技术更是有了前所未有的进步和应用。
计算机识别也逐渐的从图形图像处理的大环境下分离出来作为一门新的高科技研究领域出现。
画图涉及到的学科很多,包括数字信号处理、工程数学、信息论、运筹学等,它与计算机、自动化、生物学、视觉心理和生理学、人工智能、智能信息处理等众多领域交叉、综合集成,有广泛的应用。
该软件功能与Windows下附件中的画图软件有相似功能。
本程序是在VC6.0平台上用MFC所编。
绘制方面的功能主要包括绘制各种图元,包括直线、矩形、椭圆、扇形、连续线,用笔或画刷自由绘图。
绘图时可以选择各种颜色,各种线型和线宽。
软件支持保存和读取wmf格式的图形。
该软件设计的设计思想是面向对象程序设计的思想。
面向对象技术是一个非常实用而强有力的软件开发方法。
它具有许多特色。
一是方法的唯一性,即方法是对软件开发过程所有阶段进行综合考虑而得到的。
二是从生存期的一个阶段到下一个阶段的高度连续性,即在一个阶段所用到的部分与在下一个阶段所使用的部分是衔接的,所使用的技术经过生存期每一阶段后不改变。
三是把面向对象分析(OOA)、面向对象设计(OOD)和面向对象程序设计(OOP)集成到生存期的相应阶段。
该软件是Windows下附件中的画图软件的辅助工具。
他可以帮我们完成绘制wmf格式的图形,填充了画图程序不能完成wmf格式图形的空缺。
由于笔者所学知识有限,在绘图功能上有许多方面不能满足用户需求。
希望读者提出宝贵的意见和建议。
第1章vc++6.0和MFC简介
1.1vc++6.0简介
VC++6.0是Microsoft公司推出的一个基于Windows系统平台、可视化的集成开发环境,它的源程序按C++语言的要求编写,并加入了微软提供的功能强大的MFC(MicrosoftFoundationClass类库。
MFC中封装了大部分WindowsAPI函数和Windows控件,它包含的功能涉及到整个Windows操作系统。
MFC不仅给用户提供了Windows图形环境下应用程序的框架,而且还提供了创建应用程序的组件,这样,开发人员不必从头设计创建和管理一个标准Windows应用程序所需的程序,而是从一个比较高的起点编程,故节省了大量的时间。
另外,它提供了大量的代码,指导用户编程时实现某些技术和功能。
因此,使用VC++提供的高度可视化的应用程序开发工具和MFC类库,可使应用程序开发变得简单。
1.2MFC简介
MFC(MicrosoftFoundationClasses,是一个微软公司提供的类库(classlibraries),以C++类的形式封装了Windows的API,它包含了窗口等许多类的定义。
各种类的集合构成了一个应运程序的框架结构,以减少应用程序开发人员的工作量。
其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
MFC6.0版本封装了大约200个类,其中的一些可以被用户直接使用。
例如CWnd类封装了窗口的功能,包括打印文本、绘制图形及跟踪鼠标指针的移动等;CsplitterWnd类是从CWnd类派生出来的,继承了基类或称父类CWnd类的所有特性,但增加了自己的功能,实现拆分窗口,使窗口至少可被拆分成两个窗口,用户可以移动两个窗口之间的边框来改变窗口的大小;CtoolBar类可以定义工具栏等。
MFC命名的惯例是类的名字通常是由“C”打头;成员变量使用前缀“m_”,接着使用一个字母来指明数据类型,然后是变量的名称;所有的单词用大写字母开头。
第2章基础知识
2.1工程的新建
打开MicrosoftVisualC++6.0—>点击File—>New在Projects中选择MFCAppWizard(exe;在Projectname中输入工程的名字Graphic,在Location中选择工程存放的路径。
填完后点击OK按钮。
(如图1填完后点击OK按钮,弹出对话框(如图2。
在弹出来的对话框中我们可以选择生成三种不同类型的应用程序:
单文档、多文档、对话框。
单文档程序如记事本,在一个应用程序中只能对一个文档进行操作,降低了编程的复杂度并减少了运行程序时所需的资源。
对某些小型应用(比如文本编辑器或小型图像编辑器)可以采用这种类型的窗口应用程序。
多文档程序如PhotoShop,在一个应用程序中可以同时对多个文档进行操作;对话框程序如QQ,应用程序的界面是对话框形式的。
现对话框版本的程序更小一些。
除了节省资源外,对话框版本的应用程序的加载速度也更快些。
基于对话框的应用程序比完成相同功能的基于窗口的应用程序更简单有效。
这里我们选第一个:
单文档。
选择完后点击Next,设置默认,最后点击Finish完成工程的创建。
图1
图2
2.2单文档简介
生成单文档程序后,进行编译,在运行,我们可以看到以下的结果。
如图3
图3
在ClassView中,我们可以看到系统自动为我们生成了五个类:
CApp,CDoc,CView,CAboutDlg,CMainFrame。
如图4
图4
CApp相当于C语言中的main(函数。
是程序的起始。
CDoc是用于处理程序中文档的类。
CView主要是处理客户区的可视化的操作的类。
CAboutDlg是处理关于对话框的类。
CMainFrame是非客户区的一些资源的类。
我们主要是对CView类进行操作。
2.3添加消息响应函数
系统为我们生成了一个程序的框架,但是这个框架完成不了什么具体的功能。
为了使程序程序完成我们想要做的事,我们要向这个框架中加入一些代码。
VC++程序的运行并不像C语言是按照顺序运行下来的。
每当我们完成一个事件,系统就会发出特定的消息,程序就会跳到相应的消息响应函数中执行里面的代码。
单击菜单中的View->ClassWizard(或按快捷键Ctrl+W),将会弹出MFCClassWizard对话框。
在ClassName中选择CView,在Messages中选择WM_LBUTTONDBLCLK,点击右边的AddFunction按键。
这样我们就为程序添加了鼠标左键双击的消息响应函数,函数名为OnLButtonDblClk(UINTnFlags,CPointpoint。
我们点击EditCode按键就可以进入消息响应函数中。
我们在消息响应函数中添加如下代码:
AfxMessageBox(“HelloWord!
”;运行程序!
当我们在客户区中双击鼠标左键时,我们可以看到效果(如图5)。
我们在完成双击鼠标左键这个事件后,Windows便会发出WM_LBUTTONDBLCLK这条消息。
我们的程序收到这个消息后,就会跳转到鼠标左键双击的消息响应函数内,执行里面的代码。
同样的,我们可以添加其他的消息响应函数,如鼠标左键按下,抬起,鼠标移动等(WM_LBUTTONUP、WM_LBUTTONDOWN、WM_MOUSEMOVE等。
我们程序就是在这样的消息响应机制下运行的。
图5
2.4资源
在ResoureView里,我们可以编辑对话框、菜单、工具条、快捷键等资源。
点开Menu,可以看到一个ID为IDR_MAINFRAME的菜单。
ID是一个标识,实际上是一个无符号整型常量,每一个资源在程序中都有一个唯一的ID号。
双击IDR_MAINFRAME,在右边的视图中双击帮助右边的虚线框,弹出菜单属性,在Caption中输入“画图”,并将其关闭。
双击画图菜单下面出现虚线框,在caption中输入“画线”后将其关闭。
双击画线,在弹出的菜单属性中ID栏的ID_MENUITEM32775改成ID_MENUITEM_LINE。
同样方法在建一个“画圆”菜单项。
注意:
每个资源对应一个ID号,ID号的命名全部用大写字母,且要符合匈牙利命名法。
我们为新的菜单项起名,如果我们选择了Pop-up,生成的菜单就还有下级子菜单;如果没有选择,菜单就没有下级菜单。
我们同样可以在ClassWizard中为我们生成的菜单添加响应。
在ClassWizard中的ObjectIDs中选中菜单的ID号,Messages中选择COMMOND,然后点击AddFunction。
这样,我们就为新建的菜单添加了点击的响应,我们同样可以点击EditCode编辑消息响应函数。
2.5设备环境
CDC是设备环境类的基类直接由CObject派生。
是GDI的关键元素,它代表了物理设备。
每一个C++设备环境对象都有相对应Windows设备环境,并通过一个32位类型的HDC句柄来标识。
CDC类的虚拟性使我们可以很容易的做到编写同时适用于多种设备的代码。
使用CDC类可以使我们的作图不用关心设备的问题。
CClientDC和CWindowDC是显示设备环境类,都是由CDC派生而来,区别在于CClientDC是窗口的客户区不包括边框、标题栏和菜单栏,(0,0)指客户区域的左上角。
CWindowDC的(0,0)指整个屏幕的左上角,这意味着我们可以在显示器的任意地方绘图,包括窗口边框、标题栏和菜单栏等等。
CWindowDC一般应用在框架窗口,而不是视图窗口。
CDC对象被创建后一定要在合适的时候将它删除掉,如果忘记了删除设备环境对象则会造成内存丢失。
在每次绘图前,我们要获取设备环境,我们可以使用CDC*GetDC(函数来获取设备环境。
在绘图完成后,使用voidReleaseDC(CDC*pDC函数释放设备环境。
第3章简易画图板的制作
3.1设计目的
设计一个单文档类型的MFCAppWizard(exe工程,工程取名为:
Graphic。
此程序将实现简单的绘图功能,包括点、直线、矩形、椭圆、扇形和连续线的绘制。
并且能实现绘图的控制,包括线宽、线型和颜色的设置,图形的保存和打开以及笔刷的使用。
3.2总体设计
设计图如图6
线型
图6
3.3详细设计
首先,新建一个单文档类型的MFCAppWizard(exe工程,工程取名为:
Graphic。
为此程序添加一个子菜单,菜单名称为“绘图”,并为其添加六个菜单项,分别用来控制不同图形的绘制。
当用户选择其中的一个菜单项后,程序将按照当前的选择进行相应图形的绘制。
添加的六个菜单项的ID及名称如表1所示。
然后分别为这六个菜单项添加命令响应,本程序让视类(CGraphicView对这些菜单命令进行响应,这六个响应函数的名称分别如表1所示。
表1添加的菜单项
菜单项ID
菜单项名称
菜单项命令响应函数
IDM_DOT
点
OnDot
IDM_LINE
直线
OnLine
IDM-RECTANGLE
矩形
OnRectangle
IDM_ELLIPSE
椭圆
OnEllipse
IDM_SHANXING
扇形
OnShanxing
IDM_LIANXUXIAN
连续线
OnLianxuxian
在程序运行以后,当用户单击某个菜单项时,应该把用户的选择保存起来,以便随后的绘图操作使用。
因此在CGraphicView类中添加一个私有变量m_nDrawType;用来保存用户的选择,该变量的定义如下所述:
private:
UINTm_nDrawType;
接着,在视类的构造函数中将此变量初始化为0,程序代码如下:
CGraphicView:
:
CGraphicView(
{
//TODO:
addconstructioncodehere
m_nDrawType=0;
}
利用switch/case语句,来分别完成相应图形的绘制。
当用户选择【绘图】菜单下的不同子菜单项时,将变量m_nDrawType设置为不同的值。
程序代码如下:
voidCGraphicView:
:
OnDot(
{
//TODO:
Addyourcommandhandlercodehere
m_nDrawType=1;
}
voidCGraphicView:
:
OnLine(
{
//TODO:
Addyourcommandhandlercodehere
m_nDrawType=2;
}
voidCGraphicView:
:
OnRectangle(
{
//TODO:
Addyourcommandhandlercodehere
m_nDrawType=3;
}
voidCGraphicView:
:
OnEllipse(
{
//TODO:
Addyourcommandhandlercodehere
m_nDrawType=4;
}
voidCGraphicView:
:
OnShanxing(
{
//TODO:
Addyourcommandhandlercodehere
m_nDrawType=5;
}
voidCGraphicView:
:
OnLianxuxian(
{
//TODO:
Addyourcommandhandlercodehere
m_nDrawType=6;
}
3.3.1点、直线、矩形、椭圆的绘制
对于直线、矩形和椭圆,在绘制时都可有两点来确定其图形。
当鼠标左击时得到一个点,当鼠标左键松开时得到另外一个点。
为视类CGraphicView分别捕获鼠标左键按下和弹起这两个消息。
另外当鼠标左键按下时,需要将鼠标当前按下点保存,因此我们为CGraphicView再增加一个CPoint类型的私有成员变量:
m_ptOrigin,在视类的构造函数中将此变量初始化为0。
在鼠标按下消息响应函数中,保存该点,代码如下:
voidCGraphicView:
:
OnLButtonDown(UINTnFlags,CPointpoint
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
m_ptOrigin=point;//保存鼠标按下得到点,也是绘制一个点
CView:
:
OnLButtonDown(nFlags,point;
}
在鼠标左键弹起消息响应函数中实现绘图,代码如下:
voidCGraphicView:
:
OnLButtonUp(UINTnFlags,CPointpoint
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
//创建并获得设备描述
CClientDCdc(this;
switch(m_nDrawType
{
case1:
dc.SetPixel(point,RGB(255,0,0);/*绘制点*/
break;
case2:
/*绘制直线*/
dc.MoveTo(m_ptOrigin;/*调用MoveTo函数移动到原点*/
dc.LineTo(point;/*调用LineTo函数绘制到终点。
*/
break;
case3:
/*绘制矩形*/
dc.Rectangle(CRect(m_ptOrigin,point;
break;
case4:
/*绘制椭圆*/
dc.Ellipse(CRect(m_ptOrigin,point;
break;
CView:
:
OnLButtonUp(nFlags,point;
}
在上述程序中,设置一个点,用到的函数是SetPixel,这也是CDC类的一个成员方法,该函数的生命形式如下:
COLORREFSetPixel(POINTpoint,COLORREFcrColor);该函数是在指定的点设置一个像素。
其中第一个参数(point)是指定的点,第二个参数(crColor)是指定的颜色。
在程序中设定的颜色在系统颜色表中可能不存在,但系统会选择一种和这个颜色最接近的颜色。
RGB是一个宏,它有三个参数,分别代表红、绿、蓝三种颜色的值。
这三个参数BYTE类型,取值范围为0~255。
RGB(0,0,0)是黑色,RGB(255,255,255)是白色,将这三个分量设置成为0~255之间的任意值,从而得到各种不同的颜色。
这里的RGB(255,0,0)是红色。
绘制直线时,首先调用MoveTo函数移动到原点,然后调用LineTo函数绘制到终点。
绘制矩形时使用Rectangle函数,该函数声明形式为:
BOOLRectangle(LPCRECTlpRect);
该函数有一个指向Crect对象的参数,后者可以利用两个点来构造。
需要注意的是该函数需要的是指向Crect对象的指针,而上述代码中传递的却是Crect对象,但运行编译时也能成功通过,运行时也不会报错,这是为什么呢?
我们知道C系列的语言都是强类型语言,如果类型不匹配的话,需要进行强制类型转换。
但这里为什么没有进行这样的强制类型转换程序也可以通过呢?
实际上,Crect类提供了这样一个成员函数:
重载LPCRECT操作符,其作用是将Crect转换为LPCRECT类型。
因此,当在程序中给Rectangle函数的参数赋值时,如果它发现该参数是一个Crect对象,它就会隐式地调用LPCRECT操作符,将Crect类型的对象转换为LPRECT类型。
因此,在给函数传递参数时,如果我们看到的传递的数值类型和所需要的类型不匹配,但编译和运行都正确的情况时,就要想想这其中的缘由了。
当然,有的情况下可能是这些类型之间本来就可以互相转换,例如short类型和int类型。
但是参数是对象类的话,就要考虑了,它选择的对象的构造方法进行的隐式转换,还是有其他重载的操作符。
当用户选择椭圆菜单项时,调用Ellipes函数绘制一个椭圆。
3.3.2连续线和扇形的绘制
Windows系统为我们提供了一个画图程序,在该程序中,利用画笔可以绘制连续的线条,下面我们设计绘制连续线和扇形。
为了绘制连续的线条,首先要得到线条的起点,这在前面已经实现。
然后需要捕获鼠标移动过程中的每一个点,这可以通过捕获鼠标移动消息(WM_MOUSEMOVE)来实现。
在此消息响应函数中,在依次捕获的各个点之间绘制一条条非常短的线段,从而就可以绘制出一条连续的线条。
遵照这一思路,我们开始增加程序的功能。
首先为视类增加鼠标移动消息(WM_MOUSEMOVE)的响应函数(OnMouseMove)。
这样,只要鼠标在应用程序窗口中移动时都会进入到这个消息响应函数中。
但这并不是我们所期望的,我们希望在鼠标左键按下后开始绘图。
因此,我们需要有一个变量来表示鼠标左键是否按下这一状态,然后在鼠标移动消息响应函数中对这一变量进行判断。
当此变量为真,即鼠标左键已经按下去,我们开始绘图。
于是,为视类添加一个BOOL型的私有变量m_bDraw,当鼠标左键按下去时,此变量为真;当鼠标左键弹起时,此变量为假,这时,我们就不再绘制线条了。
该变量在视类头文件中的定义代码如下:
Private:
BOOLm_bDraw;
接下来在视类的构造函数中,将此变量初始化为FALSE。
m_bdraw=FALSE;
当鼠标左键按下去时,在视类的OnLButtonDown函数中将此变量初始化为TRUE。
m_bdraw=TRUE;
当鼠标左键弹起时,在视类的OnLButton函数中将此变量初始化为假。
m_bdraw=FALSE;
然后在OnMouseMove函数中首先对m_bdraw变量进行判断,如果其值为真,说明鼠标左键已经按下去了,这时就可开始进行画线操作。
还有一点需要注意,因为每绘制一条线段后,下次应该从这条线段的终点开始继续绘制。
因此,绘制完当前线段后,应该修改线段的起点,将当前线段的终点作为下一条线段的起点,程序代码如下:
voidCGraphicView:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于VC MFC程序设计简易画图板 基于 VC MFC 程序设计 简易 画图板