您好,欢迎访问三七文档
课程设计报告课程设计题目:简单绘图板学生姓名:余勇专业:数字媒体技术班级:1122202指导教师:李祥2013年01月12日东华理工大学VC++课程设计设计目的:(1)要求学生达到熟练掌握C++语言的基本知识和技能;(2)基本掌握面向对象程序设计的基本思路和方法;(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。设计要求:(1)要求利用面向对象的方法以及C++的编程思想来完成系统的系统结构;(2)要求在设计的过程中,建立清晰的UML类关系图,描述出类族之间的关系;(3)在系统中定义的每个类中要有各自的属性和方法;(4)在系统的设计中,要用到面向对象的封装、继承和派生、多态的属性。设计选题:简单绘图板要求:(1)程序中包含菜单项和工具栏;(2)先选择菜单项或单击工具栏上的命令按钮,然后在窗体空白区域单击鼠标后,绘制相应菜单项或命令按钮指定的图形、文字。设计思路:问题分析:绘图板需要创建一个用户界面,然后用户界面中需要有菜单栏和工具栏进行不同的操作选择。在菜单栏中能指定不同的基本图形进行绘制。设计一个单文档类型的MFCAppWizard(exe)工程,工程取名为:绘图板。此程序将实现简单的绘图功能,包括点、直线、矩形、椭圆、扇形和连续线的绘制。并且能实现绘图的控制,包括线宽、线型和颜色的设置,图形的保存和打开设计图:结构分析:首先,新建一个单文档类型的MFCAppWizard(exe)工程,工程取名为:Graphic。为此程序添加一个子菜单,菜单名称为“绘图”,并为其添加六个菜单项,分别用来控制不同图形的绘制。当用户选择其中的一个菜单项后,程序将按照当前的选择进行相应图形的绘制。添加的六个菜单项的ID。然后分别为这六个菜单项添加命令响应,本程序让视类(CGraphicView)对这些菜单命令进行响应,在程序运行以后,当用户单击某个菜单项时,应该把用户的选择保存起来,以便随后的绘图操作使用。因此在CMyView类中添加一个私有变量DrawType;用来保存用户的选择,该变量的定义如下所述:简单绘图板文件打开保存绘图点直线矩形椭圆连续线private:UINTDrawType;在程序运行以后,当用户单击某个菜单项时,应该把用户的选择保存起来,以便随后的绘图操作使用。因此在CGraphicView类中添加一个私有变量m_nDrawType;用来保存用户的选择,该变量的定义如下所述:private:UINTm_nDrawType;接着,在视类的构造函数中将此变量初始化为0,程序代码如下:CGraphicView::CGraphicView(){//TODO:addconstructioncodeherem_nDrawType=0;}然后利用switch/case语句,来分别完成相应图形的绘制。当用户选择【绘图】菜单下的不同子菜单项时,将变量DrawType设置为不同的值。voidCGraphicView::OnDot(){//TODO:Addyourcommandhandlercodeherem_nDrawType=1;}voidCGraphicView::OnLine(){//TODO:Addyourcommandhandlercodeherem_nDrawType=2;}voidCGraphicView::OnRectangle(){//TODO:Addyourcommandhandlercodeherem_nDrawType=3;}voidCGraphicView::OnEllipse(){//TODO:Addyourcommandhandlercodeherem_nDrawType=4;}voidCGraphicView::OnLianxuxian(){//TODO:Addyourcommandhandlercodeherem_nDrawType=5;}对于直线、矩形和椭圆,在绘制时都可有两点来确定其图形。当鼠标左击时得到一个点,当鼠标左键松开时得到另外一个点。为视类CGraphicView分别捕获鼠标左键按下和弹起这两个消息。另外当鼠标左键按下时,需要将鼠标当前按下点保存,因此我们为CGraphicView再增加一个CPoint类型的私有成员变量:m_ptOrigin,在视类的构造函数中将此变量初始化为0。在鼠标按下消息响应函数中,保存该点,代码如下:voidCGraphicView::OnLButtonDown(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefaultm_ptOrigin=point;//保存鼠标按下得到点,也是绘制一个点CView::OnLButtonDown(nFlags,point);}在鼠标左键弹起消息响应函数中实现绘图,代码如下:voidCGraphicView::OnLButtonUp(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefault//创建并获得设备描述CClientDCdc(this);switch(m_nDrawType){case1:dc.SetPixel(point,RGB(0,255,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之间的任意值,从而得到各种不同的颜色。Windows系统为我们提供了一个画图程序,在该程序中,利用画笔可以绘制连续的线条,绘制连续的线条,首先要得到线条的起点,然后需要捕获鼠标移动过程中的每一个点,这可以通过捕获鼠标移动消息(WM_MOUSEMOVE)来实现。在此消息响应函数中,在依次捕获的各个点之间绘制一条条非常短的线段,从而就可以绘制出一条连续的线条。于是,我增加了一个鼠标移动消息(WM_MOUSEMOVE)的响应函数(OnMouseMove)。这样,只要鼠标在应用程序窗口中移动时都会进入到这个消息响应函数中。然后我为CMyview添加一个BOOL型的私有变量Draw,当鼠标左键按下去时,此变量为真;当鼠标左键弹起时,此变量为假。主题程序代码//绘图板View.cpp:implementationoftheCMyViewclass//#includestdafx.h#include绘图板.h#include绘图板Doc.h#include绘图板View.h#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CMyViewIMPLEMENT_DYNCREATE(CMyView,CView)BEGIN_MESSAGE_MAP(CMyView,CView)//{{AFX_MSG_MAP(CMyView)ON_COMMAND(ID_LINE,OnLine)ON_COMMAND(ID_LIANXUXIAN,OnLianxuxian)ON_COMMAND(ID_DOT,OnDot)ON_COMMAND(ID_RECGANGLE,OnRecgangle)ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()ON_COMMAND(ID_CIRCLE,OnCircle)ON_COMMAND(ID_COLOR,OnColor)//}}AFX_MSG_MAP//StandardprintingcommandsON_COMMAND(ID_FILE_PRINT,CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT,CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView::OnFilePrintPreview)END_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CMyViewconstruction/destructionCMyView::CMyView(){//TODO:addconstructioncodehereDrawType=0;savepoint=0;Draw=FALSE;m_color=(255,0,0);}CMyView::~CMyView(){}BOOLCMyView::PreCreateWindow(CREATESTRUCT&cs){//TODO:ModifytheWindowclassorstylesherebymodifying//theCREATESTRUCTcsreturnCView::PreCreateWindow(cs);}///////////////////////////////////////////////////////////////////////////////CMyViewdrawingvoidCMyView::OnDraw(CDC*pDC){CMyDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:adddrawcodefornativedatahere}///////////////////////////////////////////////////////////////////////////////CMyViewprintingBOOLCMyView::OnPreparePrinting(CPrintInfo*pInfo){//defaultpreparationreturnDoPreparePrinting(pInfo);}voidCMyView::OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/){//TODO:addextrainitializationbeforeprinting}voidCMyView::OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/){//TODO:addcleanupafterprinting}///////////////////////////////////////////////////////////////////////////////CMyViewdiagnostics#ifdef
本文标题:c++简单绘图板
链接地址:https://www.777doc.com/doc-6868286 .html