绘图软件课程设计报告.docx
- 文档编号:24254814
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:52
- 大小:693.71KB
绘图软件课程设计报告.docx
《绘图软件课程设计报告.docx》由会员分享,可在线阅读,更多相关《绘图软件课程设计报告.docx(52页珍藏版)》请在冰豆网上搜索。
绘图软件课程设计报告
课程设计成绩
考勤成绩(%)
指导老师评语
报告及程序成绩(%)
总评成绩
指导老师签名:
《windows应用程序编程与设计》
课程设计报告
学院(系):
计算机科学与技术系
专业班级:
10级软件工程(专升本)1班
学生姓名:
陈志铭
学号:
1007105230
指导教师:
赵欢喜
时间:
从2010年1月4日到2010年1月14日
报告摘要
本课程设计是利用C++编程来实现“绘图应用程序”、“通信录应用程序”和“五子棋游戏”。
设计中我们利用MFC编程,对程序的界面进行设计,通过设计进一步掌握利用VisualC++进行程序设计的能力理解和运用面向对象程序设计的思想和方法,初步掌握开发一个小型简单实用系统的基本方法,理解Windows程序的运行过程以及掌握Winsocket编程方法。
通过这个课程设计使我进一步掌握C++的面向过程和面向对象的功能,从而掌握面向对象程序设计的基本知识和基本技能。
也通过该设计使我对学过的理论知识和上机取得的实践经验,解决具体、复杂的实际问题,培养了动手能力、独立解决问题的能力。
该课程设计侧重软件设计的综合训练,包括问题分析、总体结构设计、用户界面设计、程序设计基本技能和技巧,以至一整套软件工作规范的训练和科学作风的培养。
关键字:
WinSock编程,MFC编程,Windows程序,绘图应用程序,通信录应用程序,五子棋游
项目一:
设计一个简单的绘图应用程序
项目二:
设计一个简单的通信录应用程序
项目三:
设计一个简单的五子棋游戏
设计一个简单计算器
1.设计目的与要求
1.1设计目的
1.掌握用VC++6.0开发环境开发软件的方法;
2.熟悉获得帮助的方法;
3.掌握SDI应用程序结构,熟悉基于对话框的应用程序编程方法;
4.掌握用资源编辑器进行图标,菜单,工具栏,对话框等资源的编辑;
5.掌握对话框,常用控件和ActiveX控件的使用方法;
6.熟悉文档/视图结构,掌握文档和视图的相互控制技巧;
1.2设计内容
设计一个简单的绘图应用程序,具有以下功能:
1.具备基本的图形绘制功能:
直线、圆、矩形;(必须实现的功能)
2.编辑功能包括:
具有橡皮拉线功能,允许鼠标拖放,能双击选中图形元素,能删除和剪切图形元素,能撤消最近的修改等;(这部分功能选做)
3.数据保存功能:
能够把图形数据保存到文件中必须实现的功能)。
1.3设计要求
1.用VC++进行编码,实现应用程序的功能。
注重编码质量,代码要有适当的注释;
2.提交设计报告一份(课程设计任务书、目录、主要的数据结构、设计的基本思路、设计的步骤及主要代码、心得体会、参考文献)。
2设计的基本思路
2.1菜单的编辑
1.首先利用MFCAppWizard[exe]向导创建SDI应用程序Yangzhanghui。
然后在工作区的ResourceView页面选择Menu并展开,双击下面的IDR_MAINFRAME项弹出菜单资源编辑器显示应用程序向导所创建的菜单资源。
2.为程序添加主菜单。
双击菜单栏右边的虚线空白框,打开菜单单项属性对话框。
在Caption文本框中输入主菜单标题“绘图(&L)”,以同样的方法建立“颜色(Y)”和“画笔粗细(Q)”等菜单,其中“颜色(Y)”的ID是ID_COLOR(要注意)。
3.给主菜单“绘图(&L)”和“画笔粗细(Q)”添加菜单项。
“绘图(L)”的菜单项是分别是“画直线”,“画矩形”,“画椭圆”,“画圆”,其ID分别是ID_DRAW_LINE,ID_DRAW_RECTANGLE,ID_DRAW_ELLIPSE,ID_DRAW_ROUND。
“画笔颜色(Q)”的菜单项是“粗”,“中”,“细”,其ID分别是ID_WIDTH,ID_WIDTH1,ID_WIDTH2。
2.2工具栏的编辑
在工作区的ResourceView页面选择Toolbar并展开,双击下面的IDR_MAINFRAME项弹出工具栏资源编辑器.单击工具栏资源最后的空白按钮,用画笔工具分别绘制相应的四个图标,其ID与菜单项的ID相同。
2.3应用程序的编写
1.各个功能的设计
2.各个功能的实现
3设计的过程及步骤
3.1基本功能的实现
1.为视图类CyangzhanghuiView添加变量,代码如下
Public:
intm_y;intm_x;intn;intm_y2;intm_y1;intm_x2;intm_x1;
CPointStart;
protected:
CPointm_ptOrigin;
COLORREFm_linecolor;
UINTm_linewidth;
2.在视图类的构造函数中填写代码如下:
CYangzhanghuiView:
:
CYangzhanghuiView()
{
m_x=0;//初始化
m_y=0;
m_linewidth=1;
}
3.为视图类CyangzhanghuiView添加菜单栏的消息处理函数OnDrawLine()画直线,OnDrawRectangle()画矩形,OnDrawEllipse()画椭圆,OnDrawRound()画圆,OnColor()颜色处理,OnWidth()粗线条,OnWidth()1中线条,OnWidth()2细线条。
画直线代码如下:
voidCYangzhanghuiView:
:
OnDrawLine()
{
//TODO:
Addyourcommandhandlercodehere
n=1;
MessageBox("现在画直线!
");
}
画矩形代码如下:
voidCYangzhanghuiView:
:
OnDrawRectangle()
{
//TODO:
Addyourcommandhandlercodehere
n=2;
MessageBox("现在画矩形!
");
}
画椭圆代码如下:
voidCYangzhanghuiView:
:
OnDrawEllipse()
{
//TODO:
Addyourcommandhandlercodehere
n=3;
MessageBox("现在画椭圆!
");
}
画圆代码如下:
voidCYangzhanghuiView:
:
OnDrawRound()
{
//TODO:
Addyourcommandhandlercodehere
n=4;
MessageBox("现在画圆!
");
}
画笔颜色的选择代码如下:
voidCYangzhanghuiView:
:
OnColor()
{
//TODO:
Addyourcommandhandlercodehere
CColorDialogcolor(0,CC_PREVENTFULLOPEN,this);
color.DoModal();
m_linecolor=color.GetColor();//画笔颜色的选择
}
voidCYangzhanghuiView:
:
OnWidth()
{
//TODO:
Addyourcommandhandlercodehere
m_linewidth=5;
}
voidCYangzhanghuiView:
:
OnWidth1()
{
//TODO:
Addyourcommandhandlercodehere
m_linewidth=3;
}
voidCYangzhanghuiView:
:
OnWidth2()
{
//TODO:
Addyourcommandhandlercodehere
m_linewidth=1;
4.为视图类CYangzhanghuiView添加鼠标消息处理函数OnLButtonDown(),OnLButtonUp(),OnMouseMove(),并填写代码如下:
voidCYangzhanghuiView:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
m_x1=point.x;//起始点坐标
m_y1=point.y;
Start=point;
CScrollView:
:
OnLButtonDown(nFlags,point);
}
voidCYangzhanghuiView:
:
OnLButtonUp(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
CClientDCpDC(this);
m_x2=point.x;//终止点坐标
m_y2=point.y;
CPointptOrg;
ptOrg=GetScrollPosition();
switch(n)
{
case1:
{
POINTpolylpt[2]={{m_x1,m_y1},{m_x2,m_y2}};
pDC.Polyline(polylpt,2);
GetDocument()->Addshape(1,Start+ptOrg,point+ptOrg);//绘制一条直线
break;
}
case2:
{
pDC.Rectangle(m_x1,m_y1,m_x2,m_y2);
GetDocument()->Addshape(3,Start+ptOrg,point+ptOrg);//绘制一个矩形
break;
}
case3:
{
pDC.Ellipse(m_x1,m_y1,m_x2,m_y2);
GetDocument()->Addshape(2,Start+ptOrg,point+ptOrg);
break;
}
case4:
{
pDC.Ellipse(m_x1,m_y1,m_x2,m_y1+m_x2-m_x1);
GetDocument()->Addshape(4,Start+ptOrg,point+ptOrg);
break;
}
}
Invalidate();//刷新
CScrollView:
:
OnLButtonUp(nFlags,point);
}
voidCYangzhanghuiView:
:
OnMouseMove(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
m_x=point.x;
m_y=point.y;//获取鼠标坐标
CPointptOrg,ptStart,ptEnd;
ptOrg=GetScrollPosition();//获取当前工作区原点的坐标
ptStart=m_ptOrigin+ptOrg;//加上原点的坐标来修正线段的坐标
ptEnd=point+ptOrg;
CScrollView:
:
OnMouseMove(nFlags,point);
}
5.在视图类CyangzhanghuiView的OnDraw()函数中填写代码。
voidCYangzhanghuiView:
:
OnDraw(CDC*pDC)
{
CYangzhanghuiDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
CStringstrCoins,str;
CStatusBar*pStatus=(CStatusBar*)AfxGetApp()->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR);//状态栏的设置
CPenpen,*old;
pen.CreatePen(PS_SOLID,m_linewidth,m_linecolor);//创建画笔,并调入设备环境
old=(CPen*)pDC->SelectObject(&pen);
old=(CPen*)pDC->SelectObject(&pen);
if(pStatus)
{
strCoins.Format("%d",m_x);
str.Format("%d",m_y);
//设置要显示的信息
pStatus->SetPaneText(2,strCoins);
pStatus->SetPaneText(3,str);
}
intnIndex=pDoc->GetNum();
while(nIndex--)
{pDoc->GetShape(nIndex)->Draw(pDC);}
}
6.为了完成滚动视图功能,还需要在视图类的OnInitialUpdate()函数中添加代码。
voidCYangzhanghuiView:
:
OnInitialUpdate()
{
CScrollView:
:
OnInitialUpdate();
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
CSizesizeTotal;
sizeTotal.cx=sizeTotal.cy=2000;//定义滚动视图的大小
SetScrollSizes(MM_TEXT,sizeTotal);//设置滚动视图的映射的模式和大小
}
7.状态栏的显示,需要在StringTable中添加ID_X:
x坐标,
ID_Y:
y坐标。
在MainFrm.cpp中添加如下代码:
staticUINTindicators[]=
{
ID_SEPARATOR,//statuslineindicator
ID_INDICATOR_CAPS,
ID_X,
ID_Y,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
上述代码实现的功能:
画直线,画矩形,画椭圆,画圆,画笔颜色的选择,线条粗细的选择以及滚动视图和状态栏的鼠标的坐标位置显示等。
3.2完善绘图程序
在重绘窗口时能够显示已绘制的图形并实现序列化功能:
1.为线段定义新类CShape。
执行Insert|NewClass命令,打开NewClass对话框。
在Classtype下拉列表框中选择GenericClass,在Name文本框中输入CShape,在Baseclass栏中输入CObject,然后单击OK按钮.
2.为类CShape定义成员变量和成员函数。
添加代码如下。
classCShape:
publicCObject
{protected:
public:
CShape(){};
virtual~CShape(){};
CShape(intflag,CPointpt1,CPointpt2);
DECLARE_SERIAL(CShape)
//virtual~CShape();
intFlag;
CPointpoint1;
CPointpoint2;
voidSerialize(CArchive&ar);
voidDraw(CDC*pDC);
};
在实现源文件CShape.cpp中编写如下成员函数的实现代码。
CShape:
:
CShape(intflag,CPointpt1,CPointpt2)
{Flag=flag;
point1=pt1;
point2=pt2;
}
voidCShape:
:
Draw(CDC*pDC)
{if(Flag==1)
{pDC->MoveTo(point1);
pDC->LineTo(point2);}
if(Flag==2){
pDC->Ellipse(point1.x,point1.y,point2.x,point2.y);}
if(Flag==3){
pDC->Rectangle(point1.x,point1.y,point2.x,point2.y);}
if(Flag==4){
pDC->Ellipse(point1.x,point1.y,point2.x,point1.y+point2.x-point1.x);}
}
3.利用动态数组来保存多条线段的数据。
类CObArray支持Cobject指针数组,用它定义的对象可以动态生成,这样可将存放每条线段数据的变量的指针存放在CobArray的对象中。
为此在CYangzhanghuiDoc文档类中定义以下成员变量m_shape,GetNum()
和成员函数Addshape,并包括类模板的头文件#include
代码如下:
classCYangzhanghuiDoc:
publicCDocument
{
protected:
//createfromserializationonly
CYangzhanghuiDoc();
DECLARE_DYNCREATE(CYangzhanghuiDoc)
//Attributes
public:
CTypedPtrArray
CShape*GetShape(intnindex);//获取指定序号线段对象的指针
voidAddshape(intflag1,CPointptr1,CPointptr2);//向动态数组中添加新的线段对象的指针
intGetNum();//获取线段的数量
//Operations
public:
//Overrides
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CYangzhanghuiDoc)
public:
virtualBOOLOnNewDocument();
virtualvoidSerialize(CArchive&ar);
//}}AFX_VIRTUAL
//Implementation
public:
virtual~CYangzhanghuiDoc();
#ifdef_DEBUG
virtualvoidAssertValid()const;
virtualvoidDump(CDumpContext&dc)const;
#endif
protected:
//Generatedmessagemapfunctions
protected:
//{{AFX_MSG(CYangzhanghuiDoc)
//NOTE-theClassWizardwilladdandremovememberfunctionshere.
//DONOTEDITwhatyouseeintheseblocksofgeneratedcode!
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
在实现源文件YangzhanghuiDoc.cpp中编写如下成员函数的实现代码。
voidCYangzhanghuiDoc:
:
Addshape(intflag1,CPointptr1,CPointptr2)
{CShape*pShape=newCShape(flag1,ptr1,ptr2);//新建一条线段对象
m_shape.Add(pShape);//将该线段对象加到动态数组
}
CShape*CYangzhanghuiDoc:
:
GetShape(intnindex)
{if(nindex<0||nindex>m_shape.GetUpperBound())//判断是否越界
returnNULL;
returnm_shape.GetAt(nindex);//返回给定序号线段对象的指针
}
intCYangzhanghuiDoc:
:
GetNum()
{returnm_shape.GetSize();//返回线段的数量
}
4.为了在改变程序窗口大小后或重新打开窗口时显示窗口中原有的图形,必须在OnDraw()函数中重新绘制前面用鼠标所绘制的线段。
这些线段的坐标作为CShape类的成员变量,所有CShape对象的指针已保存在动态数组m_shape中。
OnDraw()中添加以下代码。
intnIndex=pDoc->GetNum();
while(nIndex--)
{pDoc->GetShape(nIndex)->Draw(pDC);}
5.按照序列化条件,在Cshape类的声明头文件中添加函数Serialize()的声明和DECLARE_SERIAL宏。
classCShape:
publicCObject
{protected:
public:
CShape(){};
virtual~CShape(){};
CShape(intflag,CPointpt1,CPointpt2);
DECLARE_SERIAL(CShape)
//virtual~CShape();
intFlag;
CPointpoint1;
CPointpoint2;
voidSerialize(CArchive&ar);//类Cshape的序列化函数
voidDraw(CDC*pDC);//声明序列化类CShape
};
6.在实现源文件Shape.cpp中成员函数定义前添加IMPLEMENT_SERIAL宏。
IMPLEMENT_SERIAL(CShape,CObject,1)//实现序列化类CShape
编写CShape类的序列化函数Serialize()的实现代码:
voidCShape:
:
Serialize(CArchive&ar)
{if(ar.IsStoring())
ar< else ar>>point1>>point2>>Flag; } 7.以上实现了CShape类的序列化,但只是一条线段的序列化。 在文档类中定义的CobArray型的变量m_shape,由于CobArray类自身提供了序列化函数,作为CobArray类得到对象m_shape可以直接进行序列化。 变量m_shape中存放的是CShape对象的指针,自然会调用CShape的序列化函数。 这样通过对m_shape变量的序列化可以完成多个m_shape对象的序列化,即完成所有线段数据的读写。 代码
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 绘图 软件 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)