mfc简单绘图程序_第1页
mfc简单绘图程序_第2页
mfc简单绘图程序_第3页
mfc简单绘图程序_第4页
mfc简单绘图程序_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

M F C简单的绘图程序 王帅 目录摘要2关键字21 引言2设计目的32 功能说明2 2.1菜单栏3 2.1.1图形3 2.1.2画笔4 2.1.3画硬币4 2.2工具栏5 2.3状态栏53 功能的实现53.1 视图设计53.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.状态栏中的显示394程序功能的测试415最后总结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_C_6744_4AD2_80A4_D44683D0A5AF_INCLUDED_)#define AFX_MYDRAW2_0VIEW_H_C_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. 开始重写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度的正弦值相乘并且赋给新的变量Rs POINT 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中引入正五边形类的头文件: #include “Pentangle.h”添加一个私有变量,创建指向正五边形的指针变量: CPentangle *pentangle; 2.4正三角形类的创建及定义(这个类中添加了旋转)创建一个正三角形类,命名为CDelta,继承CShape类,在该类中添加公有成员变量,代码如下:public:CDelta();CDelta(int x,int y,int radius=0); /带参数的构造函数,其中x为外接圆圆心的横坐标,y为外接圆圆心的纵坐标,radius为外接圆半径int Radius; /外接圆半径CPoint cp; /外接圆圆心double theta; /在正三角形原图上旋转过的角度double st; /该变量储存的是sin(theta)double ct; /该变量储存的事cos(theta)Draw(CDC* pDC); 重新定义Draw函数virtual CDelta();在无参数构造函数中初始化变量,代码如下: CDelta:CDelta()cp.x=0; /圆心的横坐标初始为0cp.y=0; /圆心的纵坐标初始为0Radius=0; /外接圆半径初始为0 在带参数构造函数中将传入的值赋给各变量,代码如下:CDelta:CDelta(int x,int y,int radius)cp.x=x; /将传入的x值赋给圆心的横坐标cp.y=y; /将传入的y值赋给圆心的纵坐标Radius=radius; /将传入的radius值赋给外接圆半径ct=1; /调用该函数时将cos(theta)设置为1st=0; /调用该函数时将sin(theta)设置为0与正五边形相同,要引入数学类的头文件以及定义宏变量PI,#include “math”#define PI 3. 开始重写定义的Draw(CDC* pDC)函数,代码如下:CDelta:Draw(CDC* pDC)double rc=Radius*cos(60*PI/180); /外接圆半径与60度余弦值相乘后赋给rcdouble rs=Radius*sin(60*PI/180); /外接圆半径与60度正弦值相乘后赋给rsct=cos(theta); /将theta的余弦值赋给ctst=sin(theta); /将theta的正弦值赋给stPOINT dx1,dx11; /定义两个点(接下来会详细说明)POINT dx2,dx22; /同上POINT dx3,dx33; /同上dx1.x=cp.x-cp.x;dx1.y=cp.y-Radius-cp.y;dx11.x=dx1.x*ct-dx1.y*st+cp.x;dx11.y=dx1.y*ct+dx1.x*st+cp.y;dx2.x=cp.x-rs-cp.x;dx2.y=cp.y+rc-cp.y;dx22.x=dx2.x*ct-dx2.y*st+cp.x;dx22.y=dx2.y*ct+dx2.x*st+cp.y;dx3.x=cp.x+rs-cp.x;dx3.y=cp.y+rc-cp.y;dx33.x=dx3.x*ct-dx3.y*st+cp.x;dx33.y=dx3.y*ct+dx3.x*st+cp.y; POINTpts=dx11.x,dx11.y,dx22.x,dx22.y,dx33.x,dx33.y;/定义点数组,存储正三角形的三个点pDC-Polygon(pts,3);/利用画多边形的函数Polygon()画正三角形,pts为储存的三个点,3为点的个数接下来对Draw函数里的变量以及运算进行解释:R如图所示,正三角形的中心到各顶点的距离为半径,设中心点的坐标为(cp.x,cp.y),则可得到右下角的坐标为cp.x+R*sin(60*PI/180),cp.y+R*cos(60*PI/180)按顺时针方向,接下来两个点的坐标分别为cp.x-R*sin(60*PI/180),cp.y-R*cos(60*PI/180)cp.x,cp.x-R此时,我们得到了三个顶点的坐标,如果按这三个点的坐标画图,就会得到如图所示的三角形,在此基础上,不妨设此图形逆时针转过的角度为,有以下原理作为基础:设一个点的坐标为(x1,y1),它绕另一个点(x2,y2)旋转角,得到新的点的坐标为:x=(x1-x2)*cos-(y1-y2)*sin+x2;y=(y1-y2)*cos+(x1-x2)*sin+y2;显然,只需得到三个点绕中心旋转后各自的新坐标,我们就可以根据旋转的角得到新的正三角形在Draw(CDC * pDC)函数中,用theta来代替,以右下角顶点为例,原坐标为cp.x+rs,cp.y+rc按如下代码将cos(theta)和sin(theta)替换:ct=cos(theta);st=sin(theta);用dx3.x储存该点与中心点横坐标的差dx3.y储存该点与中心点纵坐标的差,如下:dx3.x=cp.x+rs-cp.x;dx3.y=cp.y+rc-cp.y; 用dx33储存该点旋转后得到的新的坐标:dx33.x=dx3.x*ct-dx3.y*st+cp.x;dx33.y=dx3.y*ct+dx3.x*st+cp.y;这样就得到了该点旋转后的坐标,其它两点按同样方法即可得到新坐标,dx22为左下角的新坐标,dx11为正上方的新坐标接下来,在CMyDraw2_0View的头文件中引入正三角形类,#include “Delta.h”添加私有变量,创建正三角形类的指针变量:CDelta* delta;接下来我直接给出剩下基本形状类的代码(只在当中作注释,不再详细解释)2.5椭圆类的创建和定义创建名为CEllipse的类,继承CShape,在该头文件中添加如下代码:class CEllipse : public CShape public:CEllipse();CEllipse(int x,int y,int w=0,int h=0); /带参数的构造函数,值分别为外接矩形左上角的横坐标、纵坐标、宽度、高度int width; /外接矩形的宽度int height; /外接矩形的高度CPoint center_point; /椭圆中心点Draw(CDC* pDC); /重新定义Draw函数virtual CEllipse();在该类app中添加如下代码:CEllipse:CEllipse()center_point.x=0; /将中心点横坐标初始为0center_point.y=0; /将中心点纵坐标初始为0width=0; /将外接矩形宽度初始为0height=0; /将外接矩形高度初始为0CEllipse:CEllipse(int x,int y,int w,int h)center_point.x=x; /将传入的x值赋给中心点的横坐标center_point.y=y; /将传入的y值赋给中心点的纵坐标width=w; /将传入的w值赋给宽度height=h; /将传入的h值赋给高度CEllipse:Draw(CDC* pDC)pDC-Ellipse(center_point.x-width,center_point.y-height,center_point.x+width,center_point.y+height);/利用Ellipse()函数画椭圆在CMyDraw2_0View的头文件中引入椭圆类,#include “Ellipse.h”添加私有变量,创建椭圆类的指针变量:CEllipse *ellipse;2.6正四边形类的创建及定义命名为CQuadrangle,头文件中添加如下代码:public:CQuadrangle();CQuadrangle(int x,int y,int radius=0); /带参数的构造函数,参数分别为中心点的横坐标、纵坐标、外接圆半径int Radius; /外接圆半径CPoint cPoint; /中心点Draw(CDC* pDC); /重新定义Draw函数virtual CQuadrangle();在该类app中添加如下代码: CQuadrangle:CQuadrangle()cPoint.x=0; /将中心点的横坐标初始为0cPoint.y=0; /将中心点的纵坐标初始为0Radius=0; /将外接圆的半径初始为0CQuadrangle:CQuadrangle(int x,int y,int radius)cPoint.x=x; /将传入的x值赋给中心点的横坐标cPoint.y=y; /将传入的y值赋给中心点的纵坐标Radius=radius; /将传入的radius赋给外接圆半径CQuadrangle:Draw(CDC* pDC)double Rc=Radius*cos(45*PI/180); /将半径与45度余弦值的乘积赋给Rc POINT pts=cPoint.x+Rc,cPoint.y+Rc,cPoint.x+Rc,cPoint.y-Rc,cPoint.x-Rc,cPoint.y-Rc,cPoint.x-Rc,cPoint.y+Rc; /定义点数组,储存四个顶点pDC-Polygon(pts,4);/利用多边形绘画函数画正四边形在CMyDraw2_0View的头文件中引入正四边形类,#include “Quadrangle.h”添加私有变量,创建正四边形类的指针变量:CQuadrangle *quadrangle;2.7正六边形的创建及定义命名为CRegularHexagon,头文件中添加如下代码:public:CQuadrangle();CQuadrangle(int x,int y,int radius=0);/带参数的构造函数,参数分别为中心点的横坐标、纵坐标、外接圆半径int Radius;/外接圆半径CPoint cPoint;/中心点Draw(CDC* pDC);/重新定义Draw函数virtual CQuadrangle();在该类app中添加如下代码:CRegularHexagon:CRegularHexagon()cp.x=0;/将中心点的横坐标初始为0cp.y=0;/将中心点的纵坐标初始为0Radius=0;/将外接圆的半径初始为0CRegularHexagon:CRegularHexagon(int x,int y,int radius)cp.x=x;/将传入的x值赋给中心点的横坐标cp.y=y;/将传入的y值赋给中心点的纵坐标Radius=radius;/将传入的radius值赋给外接圆半径CRegularHexagon:Draw(CDC* pDC)double rs=Radius*sin(30*PI/180);/将半径与30度正弦值的乘积赋给rsdouble rc=Radius*cos(30*PI/180);/将半径与30度余弦值的乘积赋给rcdouble Rs=Radius*sin(60*PI/180);/将半径与60度正弦值的乘积赋给Rsdouble Rc=Radius*cos(60*PI/180);/将半径与60度余弦值的乘积赋给RcPOINT pts=cp.x+rs,cp.y+rc,cp.x-rs,cp.y+rc,cp.x-Radius,cp.y,cp.x-Rc,cp.y-Rs,cp.x+Rc,cp.y-Rs,cp.x+Radius,cp.y;/定义点数组pts,储存正六边形的六个顶点pDC-Polygon(pts,6);/利用多边形绘画函数画出正六边形在CMyDraw2_0View的头文件中引入正六边形类,#include “RegularHexagon.h”添加私有变量,创建正六边形类的指针变量:CRegularHexagon* regularhexagon;2.8直线类的创建及定义命名为CLine,在头文件中添加如下代码:public:CLine();CLine(int sx,int sy,int ex=0,int ey=0);/带参数的构造函数,分别为直线起点的横坐标、纵坐标,终点的横坐标、纵坐标Draw(CDC* pDC);/重新定义Draw函数CPoint p_start; /定义直线起点CPoint p_end;/定义直线终点virtual CLine();在该类app中添加如下代码: CLine:CLine()p_start.x=0;/将起点横坐标初始为0p_start.y=0;/将起点纵坐标初始为0p_end.x=0;/将终点横坐标初始为0p_end.y=0;/将终点纵坐标初始为0CLine:CLine(int sx,int sy,int ex,int ey)p_start.x=sx;/将sx的值赋给起点的横坐标p_start.y=sy;/将sy的值赋给起点的纵坐标p_end.x=ex;/将ex的值赋给终点的横坐标p_end.y=ey;/将ey的值赋给终点的纵坐标CLine:Draw(CDC* pDC)pDC-MoveTo(p_start);/利用MoveTo()函数画出直线起点pDC-LineTo(p_end);/利用LineTo()函数从起点画直线到终点在CMyDraw2_0View的头文件中引入直线类,#include “Line.h”添加私有变量,创建直线类的指针变量:CLine* line;3. 各基本形状类在CMyDraw2_0View类中的调用与绘图的实现 (注:以矩形、圆形、正三角形为重点介绍) 3.1矩形类的调用与与绘图的实现绘图的过程是:鼠标左键按下-鼠标移动-鼠标左键弹起在此,引入鼠标的三个响应函数,分别对应该三个过程:按下ctrl+w,弹出如图所示对话框,并按如图操作,选择右侧的Add Function(本应是黑色,由于已添加,变为灰色),将三个响应函数添加到CMyDraw2_0View类app中。现在,需要告诉鼠标,当鼠标左键按下时开始进行绘画,那么,需要添加一个变量,告诉鼠标是否进行绘画:为View类添加私有成员变量:bool mDown;在View类的构造函数中对该值进行初始化,代码如下:CMyDraw2_0View:CMyDraw2_0View()/ TODO: add construction code heremDown=false;/将mDown初始为false,表示默认为不进行绘画 在鼠标左键按下的响应函数中添加如下代码:Void CMyDraw2_0View:OnLButtonDown(UINT nFlags, CPoint point) mDown=true;/将mDown标记为true,表示此时即将开始绘画 在鼠标左键弹起的响应函数中添加如下代码:void CMyDraw2_0View:OnLButtonUp(UINT nFlags, CPoint point) mDown=false;/将mDown重新标记为false,表明此时应停止绘画 在鼠标移动时判断鼠标是否按下,如果按下则开始进行绘画:void CMyDraw2_0View:OnMouseMove(UINT nFlags, CPoint point) if(mDown)/此处添加绘画代码(下面会说到) 到此,对鼠标是否进行绘画的判断已完成,接下来,需要告诉鼠标画出的图形应该是矩形,不妨设一个变量用来储存类型:在View类中添加私有成员变量:int ShapeType;/该变量用来储存图形类型 在View类构造函数中进行该变量的初始化: ShapeType=-1;/默认为-1,表示为标的随手画(下面会提到)为View类添加菜单中矩形的响应函数: 同样按下Ctrl+W,在弹出的对话框中如下选择:图中,蓝色条中的字符为在资源编辑时定义的矩形的ID,同样选择Add Functioin,在View类中出现如下代码:void CMyDraw2_0View:OnMenuGraphRectangle() / TODO: Add your command handler code here在该函数中添加如下代码:ShapeType=2;/用2来代表矩形这样,就能用数字来表示各个基本形状了有了这个变量后,在鼠标左键按下时,首先判断该变量是否为-1(因为初始为-1,对应的是随手画),假如不是,则对ShapeType的值进行判断,用switch函数进行相应的操作:在鼠标左键按下的相应函数中添加如下代码:if(ShapeType!=-1)/判断当前的ShapeType值是否为-1switch(ShapeType)/对当前传入的ShapeType值进行选择,分别进行队形的操作当然,画矩形需要给矩形类传入矩形的左上角坐标和右下角坐标,在绘图时对应的就是鼠标按下时的坐标(我们把它叫做起始点)、鼠标移动时的坐标(我们把它叫做终点),这样,需要用两个变量来存储这两个点:在View类中添加私有成员变量:CPoint ponit_start;/用来存储起点CPoint point_end;/用来存储终点在鼠标左键按下的响应函数中添加以下代码:point_start=point;/将鼠标按下时的点存储在point_start中point_end.x=0;/将鼠标移动时的点横坐标赋值为0point_end.y=0;/将鼠标移动时的点纵坐标赋值为0最后,一切准备就绪,该进行矩形的绘画了:矩形对应的数字为2,在鼠标按下的相应函数中,在switch()函数中添加以下代码:case 2:rectangle=new CRectangle(point_start.x,point_start.y);break;/new一个矩形对象,将该地址存储在rectangle中,并将鼠标按下时的点(起点)传入,作为矩形的左上角的点此时,当鼠标按下时,鼠标就能知道即将要进行的是矩形的绘画。在鼠标移动的响应函数中也要对ShapeType值作出判断,告诉鼠标该进行矩形的绘画,方法与前面类似:在该函数的开头添加如下代码:CDC* pDC=GetDC();/打开图形设备接口,简单来说,就是用pDC来进行绘画在if(mDown)中添加如下代码:switch(ShapeType)case 2:pDC-SetROP2(R2_NOTXORPEN);/将颜色设置为反色if(point_end.x!=0)/判断鼠标是否移动了rectangle-Draw(pDC);/调用矩形类中的Draw函数point_end=point;/将终点设置为鼠标当前所在的点rectangle-width=point_end.x-point_start.x;/将终点与起点的横坐标之差赋给矩形类中的宽度widthrectangle-height=point_end.y-point_start.y;/将终点与起点的纵坐标之差赋给矩形类中的高度heightrectangle-Draw(pDC);调用矩形类中的Draw函数break;下面对以上代码进行解释:当鼠标按下时,终点point_end的值为0,判断为false,将鼠标此时的点赋给point_end,储存起来,画出矩形,当鼠标移动后,判断为true,此时画出的矩形左上角坐标为鼠标按下时的点,高度和宽度为之前的高度和宽度,由于前面已将颜色设置为反色,所以将鼠标移动之前画的矩形覆盖掉,不会再看见,所以看到的矩形为当前的矩形,之前的矩形已无法看见,否则将会看到一连串的矩形。3.2圆形类的调用在3.1中已经为绘图做好了准备工作,下面只需要用一个数字表示圆形类看,并在鼠标左键按下和鼠标移动的响应函数中的switch语句中添加相应代码即可:void CMyDraw2_0View:OnMenuGraphCircle() / TODO: Add your command handler code hereShapeType=3;/用3来表示圆形在OnLButtonDown()中的switch语句中添加如下代码: Case 3:circle=new CCircle(point_start.x,point_start.y);break;/new 一个圆形类对象,将地址储存在circle中,并将起点传入,作为圆形的中心点在OnMouseMove()中的switch语句中添加如下代码:case 3:pDC-SetROP2(R2_NOTXORPEN);/将颜色设为反色if(poi

温馨提示

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

评论

0/150

提交评论