当前位置:文档之家› mfc简单绘图程序

mfc简单绘图程序

M F C简单的绘图程序——王帅目录摘要 (2)关键字 (2)1 引言 (2)设计目的 ............................................................................................................... 错误!未定义书签。

2 功能说明 (2)2.1菜单栏.......................................................................................................... 错误!未定义书签。

2.1.1图形 (3)2.1.2画笔 (4)2.1.3画硬币 (4)2.2工具栏 (5)2.3状态栏 (5)3 功能的实现 (5)3.1 视图设计 (5)3.2 编辑资源 (6)3.3 编程思路及各个函数的实现 (7)(1)思路 (7)(2)代码的实现 (7)1.为基本形状创建一个基类 (8)2.基本形状类的创建 (8)2.1矩形类的创建及定义 (8)2.2圆形类的创建及定义 (10)2.3正五边形类的创建及定义 (11)2.4正三角形类的创建及定义 (14)2.5椭圆类的创建及定义 (16)2.6正四边形类的创建及的定义 (17)2.7正六边形类的创建及定义 (18)2.8直线类的创建及定义 (19)3.各基本形状类在CMyDraw2_0类中的调用和绘图的实现 (20)3.1矩形类的调用与与绘图的实现 (20)3.2圆形类的调用 (24)3.3正三角形类的调用 (25)3.4基本类型调用的剩余代码 (26)4.画笔的使用、颜色及大小的调整 (29)5.画硬币 (35)6.工具栏中的自定义控件 (38)7.状态栏中的显示 (39)4程序功能的测试 (41)5最后总结 (42)摘要:本绘图程序能够进行基本图形的绘画,如直线,圆,矩形,三角形等等,并且在此基础上添加了多边形的绘画,如正五边形等。

除此之外,还能够进行随手画,即用鼠标随意画线条。

为了更好的绘图,还添加了对画笔粗细的调整,以及对画笔颜色的调整,除了特定的颜色,颜色还可根据输入的RGB值随意更改。

还有一些老师的要求,加入了画硬币、显示硬币数目即鼠标坐标等信息。

本程序主要采用面向对象写法。

关键字:程序设计,MFC,绘图1.引言设计目的本绘图程序的设计不仅仅局限于老师课堂的要求,通过C++的编写实现绘图要求,我还想要在此基础上,加入自己的一些想法,想要更好地了解MFC,更好地去实现自己的想法。

2.功能说明2.1菜单栏2.1.1图形图形栏中包括直线、矩形、圆形、椭圆、多边形,多边形中包括正三角形、正四边形、正五边形、正六边形。

①选择直线,可用鼠标拖动画出一条直线②选择矩形,可用鼠标拖动画出矩形③选择圆形,可用鼠标拖动画出圆形④选择椭圆,可用鼠标拖动画出椭圆⑤选择正三角形,可用鼠标拖动画出正三角形⑥选择正四边形,可用鼠标拖动画出正方形⑦选择正五边形,可用鼠标拖动画出正五边形⑧选择正六边形,可用鼠标拖动画出正六边形(注:为了验证自己的想法以及想让画出的图形随意地变换方向,特意在正三角形一项中加入了旋转效果,使鼠标在拖动时能旋转三角形)2.1.2画笔画笔栏中包括颜色、大小及铅笔(1)颜色颜色中包括黑色、红色、绿色、蓝色、橙色、黄色、青色、紫色、粉色、自定义①选择黑色,画出的图形将为黑色②选择红色,画出的图形将为红色③选择绿色,画出的图形将为绿色④选择橙色,画出的图形将为橙色⑤选择黄色,画出的图形将为黄色⑥选择青色,画出的图形将为青色⑦选择紫色,画出的图形将为紫色⑧选择粉色,画出的图形将为粉色⑨选择自定义,可输入RGB值,画出的图形将显示输入的颜色(2)大小大小中包括1、2、3、4、5、6、7①选择1,画笔大小设为1②选择2,画笔大小设为2③选择3,画笔大小设为3④选择4,画笔大小设为4⑤选择5,画笔大小设为5⑥选择6,画笔大小设为6⑦选择7,画笔大小设为7(3)铅笔选中铅笔后,将可以用鼠标进行随意画线2.1.3画硬币画硬币中包括画、增加、减少、清除①选择画,将在客户端窗口中画出初始数量为10的硬币②选择增加,窗口中的硬币数目将增加1个③选择减少,窗口中的硬币数目将减少1个④选择清除,刷新窗口,将硬币消去2.2工具栏工具栏中除了原有的图标外,还加入了自定义的图标①选择,可用鼠标拖动画出一条直线②选择,可用鼠标拖动画出矩形③选择,可用鼠标拖动画出圆形④选择,可用鼠标拖动画出正三角形⑤选择,可用鼠标进行随手画⑥选择,可在窗口画出硬币后,将硬币数量+1⑦选择,可在窗口画出硬币后,将硬币数量-1⑧选择,可利用鼠标对所绘图形进行擦除,橡皮擦的大小与画笔大小相同2.3状态栏状态栏中除了原有的显示外,还加入了硬币的数量以及鼠标的x坐标和y坐标3.功能的实现3.1视图设计利用MFC 生成画图应用程序框架具体步骤如下:(1)执行VC程序,选择File|New命令,弹出New对话框.单击Projects标签,转到Projects选项卡,选择MFC AppWizard(exe)选项,然后在Project name文本框中输入MyDraw2_0(原来也做过一个,不过并没有以面向对象的写法去写,这个就当作是我的第二个版本),文本框是指项目的本地路径。

(2)由于本程序是实现画线,要在视图中完成,所以首先创建一个基于单文档的应用程序3.2编辑资源(1)利用ResourceView中的Menu编辑器在菜单栏添加菜单,该流程图如下3.2所示:图3.2(2)利用ResourceView中的ToolBar编辑器,在工具栏中添加自定义控件。

控件图案如下所示:3.3编程思路及各个函数的实现(1)思路:首先,画定义好的形状。

直线、矩形、圆形等等都属于基本的形状,那么我设定一个基类,称它为CShape,给这个基类定义一个画画的虚函数Draw(CDC *pDC),在这个类里面派生出各个需要的类,如CCircle类,并为这些派生类定义各自的属性及方法,重写基类的Draw函数。

当我需要用到这些类的时候,只需要在View类里创建指针,然后调用里面Draw方法。

由于是当鼠标拖动的时候画出所需的图形,需要添加鼠标响应函数,onLButtonDown(),onLButtonUp,以及onMouseMove()。

画画主要是在onMouseMove()里实现。

接着,是画笔的颜色和大小,本来是想单独创建一个画笔类,定义颜色和大小属性,使CCircle等派生类多继承,在继承一个画笔类,但尝试了几遍,发现在菜单里选择颜色时就会使程序停止运行,于是就放弃了。

重新构思之后,由于画图是在CMyDraw2_0里实现的,就直接在CMyDraw2_0中定义了颜色和大小的变量,这样也方便。

然后是画硬币。

并没有为这个创建单独的类,直接在CMyDraw2_0中的OnDraw()中画硬币,并且在CMyDraw2_0中添加了增加和减少硬币的方法。

工具栏中只要和为各个图标添加函数,作用和菜单栏中的图形一栏中对应即可。

最后还有硬币的数量和鼠标坐标放在状态栏中显示,下面开始进行函数代码的实现。

(2)代码的实现:1.为基本形状创建一个基类,命名为CShape。

在ClassViewz中右键点击MyDraw2_0 classes->new class,在弹出窗口的顶部下拉框中选择Generic Class,如图所示在头文件中添加虚函数Draw(CDC *pDC)public:CShape();virtual Draw(CDC* pDc)=0;//添加的虚函数virtual ~CShape();2.基本形状类的创建(注:以矩形、圆形、正五边形、正三边形为重点介绍)2.1矩形类的创建及定义创建一个矩形类,继承CShape类,如图在该类中重新定义画画函数Draw(),并添加带参数的构造函数,矩形的左上角,以及矩形的宽度和高度,代码如下:Public:CRectangle();Draw(CDC* pDC); //重新定义Draw函数CPoint point_LeftUp; //矩形的左上角坐标CRectangle(int x,int y,int w=0,int h=0);//带参数的构造函数,x表示左上角的横坐标,y表示左上角的纵坐标int width; //矩形的宽度int height; //矩形的高度virtual ~CRectangle();在无参数构造函数中初始化point_LeftUp的坐标和宽度以及高度的值,代码如下:CRectangle::CRectangle(){point_LeftUp.x=0; //左上角坐标x值设置为0point_LeftUp.y=0; //左上角坐标x值设置为0width=0; //矩形的宽度初始为0height=0; //矩形的高度初始为0}在带参数的构造函数中将值赋给point_LeftUp和宽度以及高度,代码如下:point_LeftUp.x=x; //将传入的x值赋给左上角坐标的x值point_LeftUp.y=y; //将传入的y值赋给左上角坐标的y值width=w; //将传入的w值赋给widthheight=h; //将传入的h值赋给height 重写Draw(CDC* pDC)函数,代码如下:CRectangle::Draw(CDC* pDC){pDC->Rectangle(point_LeftUp.x,point_LeftUp.y,point_LeftUp.x+width,point_LeftUp.y+height);//利用Rectangle()函数画出矩形,其中的值分别为矩形的左上角横坐标,左上角纵坐标,右下角横坐标,右下角纵坐标}在CMyDraw2_0View中引入矩形类的头文件:双击CMyDraw2_0View,在代码// MyDraw2_0View.h : interface of the CMyDraw2_0View class///////////////////////////////////////////////////////////////////////////////#if !defined(AFX_MYDRAW2_0VIEW_H__3809529C_6744_4AD2_80A4_D44683D0A5AF__INCLUDED_)#defineAFX_MYDRAW2_0VIEW_H__3809529C_6744_4AD2_80A4_D44683D0A5AF__INCLUDED_下添加如下代码:#include "Rectangle.h"并在View类中添加私有成员变量,创建矩形类的指针:右键点击CMyDraw2_0View,选择Add Member Variable,在弹出的对话框中如下输入:将在CMyDraw2_0View头文件中出现如下代码Private:CRectangle *rectangle;//定义指向矩形类的指针,为私有变量2.2圆形类的创建及定义创建一个圆形类,命名为CCircle,继承CShape类,在该类中添加公有成员变量,代码如下:public:CCircle();CCircle(int x,int y,int radius=0);//带参数的构造函数,其中,x表示圆心的x值,y表示圆心的y值,radius 表示圆的半径Draw(CDC* pDC); //重新定义Draw函数virtual ~CCircle();int Radius; //定义圆的半径CPoint center_point; //定义圆的中心点在无参数的构造函数中初始化变量值,代码如下:CCircle::CCircle(){center_point.x=0; //圆心的横坐标初始为0center_point.y=0; //圆心的纵坐标初始为0Radius=0; //圆的半径初始为0}在带参数的构造函数中将传入的值赋给各变量,代码如下:CCircle::CCircle(int x,int y,int radius){center_point.x=x; //将传入的x值赋给圆心的横坐标center_point.y=y; //将传入的y值赋给圆心的纵坐标Radius=radius; //将传入的radius值赋给圆的半径}重写定义的Draw函数,代码如下:CCircle::Draw(CDC* pDC){pDC->Ellipse(center_point.x-Radius,center_point.y-Radius,center_point.x+Radius,center_point.y+Radius);//利用Ellipse()函数进行圆的绘制,其中的值分别为圆的外接正方形的左上角横坐标、纵坐标,右下角横坐标、纵坐标}在CMyDraw2_0View中引入圆形类的头文件:#include "Circle.h"添加私有成员变量,创建圆形类的指针变量:CCircle *circle; //创建圆形类的指针,可以直接写在矩形类只针对下方2.3正五边形类的创建及定义创建一个正五边形类,命名为CPentangle,继承CShape类,在该类中添加公有成员变量,代码如下:public:CPentangle();CPentangle(int x,int y,int radius=0);//带参数的构造函数,x为外接圆圆心的横坐标,y为外接圆圆心的纵坐标,radius为外接圆的半径int Radius; //定义外接圆半径CPoint cP; //定义外接圆圆心Draw(CDC* pDC); //重新定义Draw函数virtual ~CPentangle();在无参数的构造函数中初始化各变量,代码如下:CPentangle::CPentangle(){cP.x=0; //圆心横坐标初始为0cP.y=0; //圆心纵坐标初始为0Radius=0; //外接圆半径初始为0}在带参数的构造函数中将传入的值赋给各变量,代码如下: CPentangle::CPentangle(int x,int y,int radius){cP.x=x; //将传入的x值赋给圆心的横坐标cP.y=y; //将传入的y值赋给圆心的纵坐标Radius=radius; //将传入的radius值赋给外接圆半径}下面重写的Draw函数与前两个不同,需要用到数学函数cos()以及sin(),由于两个函数用的是弧度制,还需引入数学变量PI,为了能够顺利的写入这些函数,需要在CPentangle类的客户端中引入数学类的头文件:双击ClassView中的CPentangle(),在出现的构造函数上方,在如下代码// Pentangle.cpp: implementation of the CPentangle class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "MyDraw2_0.h"#include "Pentangle.h"下添加数学类头文件:#include “math.h”再定义一个宏变量PI,添加如下代码:#define PI 3.1415926开始重写Draw(CDC* pDC)函数,代码如下:CPentangle::Draw(CDC* pDC){double rc=Radius*cos(36*PI/180); //将半径和36度的余弦值相乘并且赋给新的变量rcdouble rs=Radius*sin(36*PI/180); //将半径和36度的正弦值相乘并且赋给新的变量rsdouble Rc=Radius*cos(18*PI/180); //将半径和18度的余弦值相乘并且赋给新的变量Rcdouble Rs=Radius*sin(18*PI/180); //将半径和18度的正弦值相乘并且赋给新的变量RsPOINT pts[]={{cP.x+rs,cP.y+rc},{cP.x-rs,cP.y+rc},{cP.x-Rc,cP.y-R s},{cP.x,cP.y-Radius},{cP.x+Rc,cP.y-Rs}};//利用点类的数组将五个点储存在点数组pts 中pDC->Polygon(pts,5); //利用函数Polygon()进行多边形的绘画,其中pts 为储存的点,5为点的个数}下面对Draw 函数中各数据进行深层次的分析,表明它们的来历:如图所示:以外接圆圆心为坐标轴中心,设该点的坐标为(cP.x,cP.y);则右下角的坐标为cP.x+R*sin(36*PI/180),cP.y+R*cos(36*PI/180)按顺时针方向看,接下去的几个点的坐标分别为cP.x-R*sin(36*PI/180),cP.y+R*cos(36*PI/180)cP.x-R*cos(18*PI/180),cP.y-R*sin(18*PI/180)cP.x ,cP.y-RcP.x+R*cos(18*PI/180),cP.y-R*sin(18*PI/180)以上为正五边形5个点的来历,接下来在CMyDraw2_0View 中引入正五边形类的头文件: 。

相关主题