c++简单绘图板_第1页
c++简单绘图板_第2页
c++简单绘图板_第3页
c++简单绘图板_第4页
c++简单绘图板_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、课程设计报告课程设计题目:简单绘图板 学生姓名 :余勇 专 业:数字媒体技术班 级:1122202指导教师 :李祥 2013年 01 月 12 日东华理工大学VC+课程设计设计目的: (1)要求学生达到熟练掌握C+语言的基本知识和技能; (2)基本掌握面向对象程序设计的基本思路和方法; (3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。 设计要求:(1)要求利用面向对象的方法以及C+的编程思想来完成系统的系统结构; (2)要求在设计的过程中,建立清晰的UML类关系图,描述出类族之间的关系; (3)在系统中定义的每个类中要有各自的属性和方法; (4)在系统的设计中,要用到面向对

2、象的封装、继承和派生、多态的属性。 设计选题:简单绘图板要求:(1)程序中包含菜单项和工具栏;(2)先选择菜单项或单击工具栏上的命令按钮,然后在窗体空白区域单击鼠标后,绘制相应菜单项或命令按钮指定的图形、文字。设计思路:问题分析:绘图板需要创建一个用户界面,然后用户界面中需要有菜单栏和工具栏进行不同的操作选择。 在菜单栏中能指定不同的基本图形进行绘制。设计一个单文档类型的MFC AppWizard (exe)工程,工程取名为:绘图板。此程序将实现简单的绘图功能,包括点、直线、矩形、椭圆、扇形和连续线的绘制。并且能实现绘图的控制,包括线宽、线型和颜色的设置,图形的保存和打开简单绘图板设计图: 绘

3、图文件点打开直线保存矩形椭圆连续线结构分析:首先,新建一个单文档类型的MFC AppWizard (exe)工程,工程取名为:Graphic。为此程序添加一个子菜单,菜单名称为“绘图”,并为其添加六个菜单项,分别用来控制不同图形的绘制。当用户选择其中的一个菜单项后,程序将按照当前的选择进行相应图形的绘制。添加的六个菜单项的ID。然后分别为这六个菜单项添加命令响应,本程序让视类(CGraphicView)对这些菜单命令进行响应,在程序运行以后,当用户单击某个菜单项时,应该把用户的选择保存起来,以便随后的绘图操作使用。因此在CMyView类中添加一个私有变量DrawType;用来保存用户的选择,该

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

5、户选择【绘图】菜单下的不同子菜单项时,将变量DrawType设置为不同的值。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 code herem_nDrawType=3;void CGra

6、phicView:OnEllipse() / TODO: Add your command handler code herem_nDrawType=4;void CGraphicView:OnLianxuxian() / TODO: Add your command handler code herem_nDrawType=5;对于直线、矩形和椭圆,在绘制时都可有两点来确定其图形。当鼠标左击时得到一个点,当鼠标左键松开时得到另外一个点。为视类CGraphicView分别捕获鼠标左键按下和弹起这两个消息。另外当鼠标左键按下时,需要将鼠标当前按下点保存,因此我们为CGraphicView再增加一

7、个CPoint类型的私有成员变量:m_ptOrigin,在视类的构造函数中将此变量初始化为0。在鼠标按下消息响应函数中,保存该点,代码如下:void CGraphicView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultm_ptOrigin=point; /保存鼠标按下得到点,也是绘制一个点CView:OnLButtonDown(nFlags, point);在鼠标左键弹起消息响应函数中实现绘图,代码如下:void CGraphicV

8、iew:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default/创建并获得设备描述CClientDC dc(this); switch (m_nDrawType)case 1:dc.SetPixel(point,RGB(0,255,0)); /*绘制点*/break;case 2: /*绘制直线*/dc.MoveTo(m_ptOrigin);/*调用MoveTo函数移动到原点*/dc.LineTo(point);/*调用LineTo函数绘制到终点。

9、*/break;case 3: /*绘制矩形*/ dc.Rectangle(CRect(m_ptOrigin,point);break;case 4: /*绘制椭圆*/dc.Ellipse(CRect(m_ptOrigin,point);break;CView:OnLButtonUp(nFlags, point);在上述程序中,设置一个点,用到的函数是SetPixel,这也是CDC类的一个成员方法,该函数的生命形式如下:COLORREF SetPixel (POINT point,COLORREF crColor);该函数是在指定的点设置一个像素。其中第一个参数(point)是指定的点,第二个

10、参数(crColor)是指定的颜色。在程序中设定的颜色在系统颜色表中可能不存在,但系统会选择一种和这个颜色最接近的颜色。RGB是一个宏,它有三个参数,分别代表红、绿、蓝三种颜色的值。这三个参数BYTE类型,取值范围为0255。RGB(0,0,0)是黑色,RGB(255,255,255)是白色,将这三个分量设置成为0255之间的任意值,从而得到各种不同的颜色。Windows系统为我们提供了一个画图程序,在该程序中,利用画笔可以绘制连续的线条,绘制连续的线条,首先要得到线条的起点,然后需要捕获鼠标移动过程中的每一个点,这可以通过捕获鼠标移动消息(WM_MOUSEMOVE)来实现。在此消息响应函数中

11、,在依次捕获的各个点之间绘制一条条非常短的线段,从而就可以绘制出一条连续的线条。于是,我增加了一个鼠标移动消息(WM_MOUSEMOVE)的响应函数(OnMouseMove)。这样,只要鼠标在应用程序窗口中移动时都会进入到这个消息响应函数中。然后我为CMyview添加一个BOOL型的私有变量Draw,当鼠标左键按下去时,此变量为真;当鼠标左键弹起时,此变量为假。主题程序代码 / 绘图板View.cpp : implementation of the CMyView class/#include "stdafx.h"#include "绘图板.h"#inc

12、lude "绘图板Doc.h"#include "绘图板View.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_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, OnLianx

13、uxian)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/ Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CV

14、iew:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)END_MESSAGE_MAP()/ CMyView construction/destructionCMyView:CMyView()/ TODO: add construction code hereDrawType=0;savepoint=0; Draw=FALSE;m_color=(255,0,0);CMyView:CMyView()BOOL CMyView:PreCreateWindow(CREATESTRUCT& cs)/ T

15、ODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT csreturn CView:PreCreateWindow(cs);/ CMyView drawingvoid CMyView:OnDraw(CDC* pDC)CMyDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here/ CMyView printingBOOL CMyView:OnPreparePrinting(CPrin

16、tInfo* pInfo)/ default preparationreturn DoPreparePrinting(pInfo);void CMyView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add extra initialization before printingvoid CMyView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add cleanup after printing/ CMyView diagnostics#if

17、def _DEBUGvoid CMyView:AssertValid() constCView:AssertValid();void CMyView:Dump(CDumpContext& dc) constCView:Dump(dc);CMyDoc* CMyView:GetDocument() / non-debug version is inlineASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc);return (CMyDoc*)m_pDocument;#endif /_DEBUG/ CMyView message handl

18、ersvoid CMyView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultsavepoint=point;Draw=TRUE;CView:OnLButtonDown(nFlags, point);void CMyView:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCView:

19、OnLButtonUp(nFlags, point);CClientDC dc(this);switch (DrawType)/绘制椭圆case 1:dc.Ellipse(CRect(savepoint,point);break;/绘制点case 2:dc.SetPixel(point,m_color);break;/绘制直线case 3:if(Draw=true)dc.MoveTo(savepoint);dc.LineTo(point);savepoint=point;break;/绘制矩形case 4:dc.Rectangle(CRect(savepoint,point);break;Dr

20、aw=FALSE;void CMyView:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCView:OnMouseMove(nFlags, point);/创建并获得描述 CClientDC dc(this);switch (DrawType)/绘制连续线case 5:CPen pen1;CPen *oldPen;pen1.CreatePen(PS_SOLID,2,m_color); CPen *Oldpen=dc.SelectObjec

21、t(&pen1);if(Draw=true)dc.MoveTo(savepoint); dc.LineTo(point);/修改线段的起点 savepoint=point;/恢复描述dc.SelectObject(Oldpen);break;void CMyView:OnCircle() / TODO: Add your command handler code hereDrawType=1;void CMyView:OnDot() / TODO: Add your command handler code hereDrawType=2;void CMyView:OnLine() /

22、TODO: Add your command handler code hereDrawType=3;void CMyView:OnRecgangle() / TODO: Add your command handler code hereDrawType=4;void CMyView:OnLianxuxian() / TODO: Add your command handler code hereDrawType=5;实验心得: 这次课程设计我成功的完成了。通过本次课程设计,我完成了用移动鼠标对直线,矩形,椭圆、连续线的简单绘制工具的的制作,其中完成了绘图形状的选择。 基于平时课外上机实验的练习,对菜单的创建,COMMAND消息处理函数和 UPDATE_COMMAND_UI消息函数的添加过程比较熟练,这部分还算简单。难的是代码的添加,对绘制图形的程序有大概的思路,但具体编写时变量的运用以及函数的调用设置。这次实验中关键就是确定画图起点及终点坐标,因为是用鼠标绘制图形,所以需用函数来捕获鼠标当前所在位置的坐标,因此我设置了OnLButtonDown()函数来捕获起点坐标,OnMouseMove()函数来捕获鼠标移

温馨提示

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

评论

0/150

提交评论