c简单绘图板解读.docx
《c简单绘图板解读.docx》由会员分享,可在线阅读,更多相关《c简单绘图板解读.docx(17页珍藏版)》请在冰豆网上搜索。
c简单绘图板解读
课程设计报告
课程设计题目:
简单绘图板
学生姓名:
余勇
专业:
数字媒体技术
班级:
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:
addconstructioncodehere
m_nDrawType=0;
}
然后利用switch/case语句,来分别完成相应图形的绘制。
当用户选择【绘图】菜单下的不同子菜单项时,将变量DrawType设置为不同的值。
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:
:
OnLianxuxian()
{
//TODO:
Addyourcommandhandlercodehere
m_nDrawType=5;
}
对于直线、矩形和椭圆,在绘制时都可有两点来确定其图形。
当鼠标左击时得到一个点,当鼠标左键松开时得到另外一个点。
为视类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(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
//
#include"stdafx.h"
#include"绘图板.h"
#include"绘图板Doc.h"
#include"绘图板View.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CMyView
IMPLEMENT_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
//Standardprintingcommands
ON_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/destruction
CMyView:
:
CMyView()
{
//TODO:
addconstructioncodehere
DrawType=0;
savepoint=0;
Draw=FALSE;
m_color=(255,0,0);
}
CMyView:
:
~CMyView()
{
}
BOOLCMyView:
:
PreCreateWindow(CREATESTRUCT&cs)
{
//TODO:
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
returnCView:
:
PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
//CMyViewdrawing
voidCMyView:
:
OnDraw(CDC*pDC)
{
CMyDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
}
/////////////////////////////////////////////////////////////////////////////
//CMyViewprinting
BOOLCMyView:
:
OnPreparePrinting(CPrintInfo*pInfo)
{
//defaultpreparation
returnDoPreparePrinting(pInfo);
}
voidCMyView:
:
OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{
//TODO:
addextrainitializationbeforeprinting
}
voidCMyView:
:
OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{
//TODO:
addcleanupafterprinting
}
/////////////////////////////////////////////////////////////////////////////
//CMyViewdiagnostics
#ifdef_DEBUG
voidCMyView:
:
AssertValid()const
{
CView:
:
AssertValid();
}
voidCMyView:
:
Dump(CDumpContext&dc)const
{
CView:
:
Dump(dc);
}
CMyDoc*CMyView:
:
GetDocument()//non-debugversionisinline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
return(CMyDoc*)m_pDocument;
}
#endif//_DEBUG
/////////////////////////////////////////////////////////////////////////////
//CMyViewmessagehandlers
voidCMyView:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
savepoint=point;
Draw=TRUE;
CView:
:
OnLButtonDown(nFlags,point);
}
voidCMyView:
:
OnLButtonUp(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
CView:
:
OnLButtonUp(nFlags,point);
CClientDCdc(this);
switch(DrawType)
{
//绘制椭圆
case1:
dc.Ellipse(CRect(savepoint,point));
break;
//绘制点
case2:
dc.SetPixel(point,m_color);
break;
//绘制直线
case3:
if(Draw==true)
{
dc.MoveTo(savepoint);
dc.LineTo(point);
savepoint=point;
}break;
//绘制矩形
case4:
dc.Rectangle(CRect(savepoint,point));
break;
}
Draw=FALSE;
}
voidCMyView:
:
OnMouseMove(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
CView:
:
OnMouseMove(nFlags,point);
//创建并获得描述
CClientDCdc(this);
switch(DrawType)
//绘制连续线
case5:
{
CPenpen1;
CPen*oldPen;
pen1.CreatePen(PS_SOLID,2,m_color);
CPen*Oldpen=dc.SelectObject(&pen1);
if(Draw==true)
{
dc.MoveTo(savepoint);
dc.LineTo(point);
//修改线段的起点
savepoint=point;
}
//恢复描述
dc.SelectObject(Oldpen);
break;
};
}
voidCMyView:
:
OnCircle()
{
//TODO:
Addyourcommandhandlercodehere
DrawType=1;
}
voidCMyView:
:
OnDot()
{
//TODO:
Addyourcommandhandlercodehere
DrawType=2;
}
voidCMyView:
:
OnLine()
{
//TODO:
Addyourcommandhandlercodehere
DrawType=3;
}
voidCMyView:
:
OnRecgangle()
{
//TODO:
Addyourcommandhandlercodehere
DrawType=4;
}
voidCMyView:
:
OnLianxuxian()
{
//TODO:
Addyourcommandhandlercodehere
DrawType=5;
}
}
实验心得:
这次课程设计我成功的完成了。
通过本次课程设计,我完成了用移动鼠标对直线,矩形,椭圆、连续线的简单绘制工具的的制作,其中完成了绘图形状的选择。
基于平时课外上机实验的练习,对菜单的创建,COMMAND消息处理函数和UPDATE_COMMAND_UI消息函数的添加过程比较熟练,这部分还算简单。
难的是代码的添加,对绘制图形的程序有大概的思路,但具体编写时变量的运用以及函数的调用设置。
这次实验中关键就是确定画图起点及终点坐标,因为是用鼠标绘制图形,所以需用函数来捕获鼠标当前所在位置的坐标,因此我设置了OnLButtonDown()函数来捕获起点坐标,OnMouseMove()函数来捕获鼠标移动是的当前位置坐标,OnLButtonUp()函数来捕获终点坐标。
而绘制图形使用的函数是OnPaint(),将图形的起点和终点坐标和鼠标的位置坐标相联系后就能用鼠标来绘制图形了,所以在它们之间用opoint和cpoint两变量实现链接。
另外我觉得将绘图语句集中在OnPaint()函数中,然后其他函数来调用OnPaint()函数,这样不容易引起混乱,同时程序更简单,更有条理,便于修改。
这次课程设计虽只是做了一个极其简单的绘图工具的制作,但也让我从设计者的角度看到了设计程序以及电脑软件工具的实质及难度,看似一个很简单的工具,其制作的背后工作是很大的,不光是图标,按钮的设置,程序的编写,代码的实现都是很精密且不容许一点错误的工作。
平时我们使用的很顺手的一个小小工具,其开发的各项小号都不可小觑,由此,我们需要学的东西还太多太多。
课程设计评分表
学生姓名:
余勇班级:
1122202学号:
201120220202
课程设计题目:
绘图板
项目内容
满分
实评
选
题
能结合所学课程知识、有一定的能力训练。
符合选题要求
(5人一题)
10
工作量适中,难易度合理
10
能
力
水
平
能熟练应用所学知识,有一定查阅文献及运用文献资料能力
10
理论依据充分,数据准确,公式推导正确
10
能应用计算机软件进行编程、资料搜集录入、加工、排版、制图等
10
能体现创造性思维,或有独特见解
10
成
果
质
量
总体设计正确、合理,各项技术指标符合要求。
10
说明书综述简练完整,概念清楚、立论正确、技术用语准确、结论严谨合理;分析处理科学、条理分明、语言流畅、结构严谨、版面清晰
10
设计说明书栏目齐全、合理,符号统一、编号齐全。
格式、绘图、表格、插图等规范准确,符合国家标准
10
有一定篇幅,字符数不少于5000
10
总分
100
指导教师评语:
指导教师签名:
年月日