VC课程设计说明书Word格式.docx
《VC课程设计说明书Word格式.docx》由会员分享,可在线阅读,更多相关《VC课程设计说明书Word格式.docx(42页珍藏版)》请在冰豆网上搜索。
完成需求分析,确定程序功能,确立程序设计思想
6月30日~7月1日:
进行详细设计,实现编码
7月2日:
进行程序测试,完善编码;
撰写设计说明书,准备答辩
7月3日:
答辩
四、主要参考资料
[1]王育坚.VisualC++面向对象编程教程.第2版.北京:
清华大学出版社,2008
[2]侯俊杰.深入浅出MFC.第2版.广东:
南方出版社,2007
指导教师(签名):
教研室主任(签名):
注:
可以附页
课程设计成绩评定表
出勤
情况
出勤天数
缺勤天数
成
绩
评
定
出勤情况及设计过程表现(20分)
课设答辩(20分)
设计成果(60分)
总成绩(100分)
提问
(答辩)
问题
综
合
指导教师签名:
年月日
1总体设计
1.1程序设计思想
根据绘图板的构造及用户的需求,首先要具有最基本的画图工具栏,其中具有曲线、直线、矩形、椭圆等基本图形按钮及文字按钮,当按下不同按钮时,需要完成不同图形的绘制,这就要添加WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE的消息处理函数,并填写相应语句以实现图形及文本绘制。
若想设置所绘图形的颜色、线宽及样式,需要设置不同的画笔和画刷,设置颜色可以通过调用颜色通用对话框返回颜色值,而字体的设置也可通过调用字体通用对话框返回字体值。
其次,当改变窗口大小时,所绘内容将要消失,这时就需要对所绘图形及文字进行重绘。
然后,要想实现所绘图形的保存,就需要对各个图形及字体进行序列化。
最后,可以加一些附加设置,增加画笔、画刷、橡皮按钮,创建颜色工具栏,在状态栏显示鼠标坐标。
1.2程序流程图
打开程序,绘制图形文本,可以设置格式,如保存则执行序列化,关闭,重新打开时可将保存图形打开。
打开
是否打开保存图形
否
是
显示保存图形
设置图形文本格式
图形文本绘制
是否保存
序列化
关闭
图1程序流程图
1.3程序模块图
绘图应用程序包括四个主要模块:
绘制图形文字模块、设置图形文字格式模块、重绘模块、图形文字序列化模块。
图2程序模块图
1.4程序设计步骤
1.在工具栏添加按钮,添加绘制手划线、直线、矩形、椭圆、字体代码
2.在资源视图中,增加设置菜单及风格对话框,利用菜单命令分别调用颜色、风格、字体对话框,实现图形及文字的格式设置
3.新建手划线、直线、矩形、椭圆、文字的一般类,添加代码实现图形及文字的绘制
4.对手划线、直线、矩形、椭圆、文字进行序列化,以实现图形及文字的保存及打开
5.在资源视图中,绘制不同光标,为图形工具栏填加画笔、画刷、橡皮按钮,在代码中设置光标,并完成绘制功能
6.创建颜色工具栏,实现快捷设置颜色,并设置图形工具栏及颜色工具栏位置属性
7.添加状态栏,显示鼠标坐标
1.5程序功能介绍
1.绘制直线、手划线、矩形、椭圆、文字
2.具有画笔、画刷及橡皮功能
3.设置画笔颜色
4.设置各种图形的风格样式(包括线条风格及填充样式)
5.设置字体
6.重绘功能(改变窗口大小时重新绘制)
7.保存并打开所绘图形
2详细设计
2.1类型设置
在绘制图形及字体之前,要对绘制哪个图形设置标记,定义整型shape变量,为0时,表示绘制手划线,为1时表示绘制直线,2表示绘制矩形,3表示绘制椭圆,4表示绘制文字,5表示使用画笔,6表示使用画刷,7表示使用橡皮。
2.2图形的绘制
2.2.1绘制手划线
Shape为0时绘制手划线,首先为视图类CMyDrawView添加成员变量。
线段起始坐标定义为CPoint类型,鼠标拖拽标记定义为bool型,绘制时采用标准的十字光标,定义一个HCURSOR型成员变量,在视图类CMyDrawView的头文件中增添必要的成员变量的定义。
在视图类CMyDrawView的构造函数中初始化拖拽标记,设置十字光标。
利用类向导为视图类添加按下鼠标左键WM_LBUTTONDOWN、移动鼠标WN_MOUSEMOVE和释放鼠标左键WM_LBUTTONUP的消息处理函数。
系统中任一时刻只有当前窗口才能捕获鼠标。
在OnLButtonDown()函数中通过调用CWnd类的成员函数SetCapture()捕获鼠标,由于在客户区捕获鼠标后在非客户区就不能使用鼠标了,因此使用鼠标画图结束后应该调用函数ReleaseCapture()释放鼠标。
在应用程序的初始化成员函数InitInstance()中调用SetWindowText()函数设置窗口标题为简易画图板。
2.2.2绘制直线
Shape为1时绘制直线,跟绘制手划线类似,在视图类OnMouseMove()函数中调用SetROP2(R2_NOTCOPYPEN)设置虚画笔,并没有真正绘制,而在视图类OnLButtonUp()函数中才真正调用MoveTo()、LineTo()函数完成起点到当前点的绘制。
2.2.3绘制矩形
Shape为2时绘制直线,跟绘制直线类似,同样在视图类OnMouseMove()函数中调用SetROP2(R2_NOTCOPYPEN)设置虚画笔,而在视图类OnLButtonUp()函数中才真正调用Rectangle()函数完成起点到当前点的绘制。
2.2.4绘制椭圆
Shape为3时绘制直线,跟绘制直线类似,同样在视图类OnMouseMove()函数中调用SetROP2(R2_NOTCOPYPEN)设置虚画笔,而在视图类OnLButtonUp()函数中才真正调用Ellipse()函数完成起点到当前点的绘制。
2.2.5绘制文字
Shape为3时绘制文字,首先在资源视图中新建对话框,仅有一个编辑框,新建对话框类CText,通过类向导设置关联变量m_text(CString类型)。
在视图类OnLButtonDown()函数中调用对话框,获取输入的字符串,通过调用TextOut()函数在鼠标按下位置point绘制字符串。
2.3图形及字体风格设置
2.3.1获得画笔颜色
首先在菜单栏添加颜色选项,通过类向导为颜色添加COMMOND消息处理函数,在函数中通过调用颜色通用对话框获得颜色的值,并将颜色值赋给CMyDrawView类的成员变量m_color,m_color为画笔颜色变量。
在绘制直线、手划线、矩形、椭圆时,将画笔颜色设置为m_color。
2.3.2风格设置
首先在资源视图中插入对话框,添加一组单选按钮表示画笔样式,再添加一组单选按钮表示画刷样式,包括普通话刷和堆画刷。
再增加一个编辑框和一个旋转按钮,设置旋转按钮属性,是编辑框与旋转按钮成为一体,为对话框建类CTypeallDlg,通过类向导为单选按钮、编辑框、旋转按钮定义关联变量,通过语句将编辑框与旋转按钮关联,
设置旋转按钮值范围及初始值。
在菜单栏添加风格选项,通过类向导为风格添加COMMOND消息处理函数,在函数中调用风格对话框,获取所设置的值,将画笔类型赋给CMyDrawView类的成员变量pentype,pentype为画笔类型变量,将画刷类型赋给CMyDrawView类的成员变量brushtype,brushtype为画刷类型变量,将画笔宽度赋给CMyDrawView类的成员变量penwidth,penwidth为画笔宽度变量。
在绘制直线、手划线、矩形、椭圆时,将画笔类型设置为pentype,将画笔宽度设置为pentype,在绘制矩形、椭圆时,将画刷类型设置为brushtype。
2.3.3字体设置
首先在菜单栏添加字体选项,通过类向导为字体添加COMMOND消息处理函数,在函数中通过调用字体通用对话框获得字体及文字颜色的值,并将字体值赋给CMyDrawView类的成员变量m_fontdlg,m_fontdlg为字体变量,将文字颜色值赋给CMyDrawView类的成员变量m_clrtext,m_clrtext为文字颜色变量。
2.4重绘
2.4.1手划线重绘
首先要新建一般类CLine,基类为CObject,然后为类CLine定义成员变量。
一条线段需要起点、终点、画笔类型、画笔宽度、画笔颜色来确定,在头文件CLine.h中定义两个表示起点和终点的成员变量m_pt1(CPoint类型)和m_pt2(CPoint类型)以及表示画笔类型、画笔宽度、画笔颜色的成员变量pentype(int类型)、penwidth(int类型)、m_color(COLORREF类型),定义成员函数DrawLine(),它根据pt1,pt2,tp,wt,cl画一条直线。
一般都使用数组来保存多条线段的数据,而且MFC提供了实现动态数组的模版。
类CObArray支持CObject指针数组,用它定义对象可以动态生成。
这样可以将存放在每条线段数据的变量的指针存到CObArray类的对象中。
为此在CMyDrawDoc文档类中定义成员变量和成员函数,并包括CLine类定义的头文件。
成员变量m_LineArray是MFC数组类模版CTypedPtrArray的对象,为了使用MFC类模版,必须包含MFC头文件afxtempl.h。
在实现源文件MyDrawDoc.cpp中编写成员函数的实现代码。
在视图类CMyDrawView的鼠标移动处理函数OnMouseMove()中调用AddLine()函数,保存当前线段的起点、终点、画笔类型、画笔宽度、画笔颜色。
在改变窗口大小时,调用OnDraw()函数重新绘制,在其中填写代码将保存在动态数组中的线段一一绘制出来,这样就实现了手划线的重绘。
2.4.2直线重绘
与手划线重绘类似,新建一般类CSline,基类为CObject,同样根据起点、终点、画笔类型、画笔宽度、画笔颜色进行重绘,只是将保存当前线段的起点、终点、画笔类型、画笔宽度、画笔颜色的函数AddSline()放到视图类CMyDrawView的鼠标左键释放处理函数OnLButtonUp()中。
2.4.3矩形重绘
同理,矩形重绘需要新建一般类CRectangle,基类为CObject,根据起点、终点、画笔类型、画笔宽度、画笔颜色、画刷类型进行重绘,与直线重绘一样,也只将保存当前矩形的起点、终点、画笔类型、画笔宽度、画笔颜色、画刷类型的函数AddRectangle()放到视图类CMyDrawView的鼠标左键释放处理函数OnLButtonUp()中。
2.4.4椭圆重绘
同理,椭圆重绘需要新建一般类CEllipse,基类为CObject,根据起点、终点、画笔类型、画笔宽度、画笔颜色、画刷类型进行重绘,与直线重绘一样,也只将保存当前椭圆的起点、终点、画笔类型、画笔宽度、画笔颜色、画刷类型的函数AddEllipse()放到视图类CMyDrawView的鼠标左键释放处理函数OnLButtonUp()中。
2.4.5文字重绘
新建一般类CFonttext,基类为CObject,根据字体、文字颜色、位置、字符串进行重绘,只将保存当前文字的字体、文字颜色、位置、字符串的函数AddFonttext()放到视图类CMyDrawView的鼠标左键按下处理函数OnLButtonDown()中绘制文字函数之前。
2.5序列化
2.5.1手划线序列化
在CLine类的声明头文件Line.h中添加函数Serialize()的声明和DECLARE_SERIAL宏。
在实现源文件Line.cpp中成员函数定义前添加IMPLEMENT_SERIAL宏。
在CLine类Serialize()函数中将起点、终点、画笔类型、画笔宽度、画笔颜色变量进行序列化。
在CMyDrawDoc类Serialize()函数中调用CObArray类的序列化函数。
至此,MyDraw已经实现了文档的读写功能。
为CMyDrawDoc类添加虚函数DeleteContents(),当点击新建命令时实现对当前客户区窗口中所绘制图形的清除。
在文档派生类的成原函数AddLine()调用文档类的成员函数SetModifedFlag(),为程序添加提示保存功能。
2.5.2直线序列化
与手划线序列化做相似的处理,只是对应好相应的类及相应的成员函数。
在CSline类Serialize()函数中将起点、终点、画笔类型、画笔宽度、画笔颜色变量进行序列化。
2.5.3矩形序列化
在CRectangle类Serialize()函数中将起点、终点、画笔类型、画笔宽度、画笔颜色、画刷类型进行序列化。
2.5.4椭圆序列化
与矩形序列化做相似的处理,只是对应好相应的类及相应的成员函数。
2.5.5字体序列化
与上相同,在CFonttext类Serialize()函数中将字体、文字颜色、位置、字符串进行序列化。
未能实现。
2.6附加模块
2.6.1添加画笔、画刷、橡皮
首先在资源视图的图形工具栏中添加三个按钮,分别手绘画笔、画刷、橡皮的按钮图标,通过类向导分别填加画笔、画刷、橡皮的COMMOND消息处理函数,分别填写代码设置shape为5,shape为6,shape为7。
画笔、画刷、橡皮其实就是绘制不同样式的手划线,按照绘制手划线的方式添加代码,画笔与手划线绘制相同,画刷要将创建的画笔宽度设为6,画笔类型设为PS_SOLID,其他不变,橡皮要将画笔宽度设为4,画笔类型设为PS_SOLID,画笔颜色设为白色,其他不变。
在资源视图中插入三个光标cursor,分别手绘画笔、画刷、橡皮的光标,在视图类CMyDrawView的鼠标移动处理函数OnMouseMove()中添加设置光标的代码。
如下当shape=5时设置光标:
HCURSORhCursor=SetCursor(AfxGetApp()->
LoadCursor(IDC_CUR_PEN));
在视图类CmyDrawView的构造函数中,初始化shape=5,使得程序运行即为画笔光标。
2.6.2创建颜色工具栏
新建工具栏,添加各种颜色的按钮,第一个为调用颜色通用对话框的按钮,在CmainFrame类的OnCreate()函数中添加创建颜色工具栏的代码,参照系统工具栏的创建方式,通过类向导分别填加各按钮的COMMOND消息处理函数,将对应颜色值赋给m_color,完成颜色的获取。
2.6.3设置工具栏样式
在CmainFrame类的OnCreate()函数中设置图形工具栏和颜色工具栏位置属性分别为CBRS_LEFT、CBRS_BOTTOM,分别将他们放到界面的左方和下方。
分别为工具栏各按钮设置按下凹下和按其他按钮恢复的功能,通过类向导分别为各按钮填加UPDATE_COMMOND_UI的消息处理函数,通过判断按下按钮标志添加如下代码pCmdUI->
SetCheck(TRUE)实现按钮按下,pCmdUI->
SetCheck(FALSE)实现按钮恢复。
2.6.4在状态栏显示鼠标坐标
在资源视图的StingTable中最后添加ID为ID_POINT,在CmainFrame类中的indicators[]数组第一个元素后添加ID_POINT,在CMyDrawView的鼠标移动处理函数OnMouseMove()中添加实现代码,利用SetPaneText()函数为对应状态栏添加显示鼠标坐标的字符串。
3参考文献
附录
设置工具栏按钮标志:
voidCMyDrawView:
:
Online()//设置图形工具栏按钮标志
{shape=0;
}
Onsline()
{shape=1;
Onrectangle()
{shape=2;
Ontext()
{shape=4;
Onellipse()
{shape=3;
Onpen()
{shape=5;
Onerase()
{shape=7;
Oncolor1()//设置颜色工具栏按钮返回值及标志
{m_color=RGB(0,0,0);
Oncolor2()
{m_color=RGB(255,255,255);
Oncolor3()
{m_color=RGB(128,128,128);
Oncolor4()
{m_color=RGB(192,192,192);
Oncolor5()
{m_color=RGB(128,0,0);
Oncolor6()
{m_color=RGB(255,0,0);
Oncolor7()
{m_color=RGB(128,128,0);
Oncolor8()
{m_color=RGB(255,255,0);
Oncolor9()
{m_color=RGB(0,128,0);
Oncolor10()
{m_color=RGB(0,255,0);
Oncolor11()
{m_color=RGB(0,128,128);
Oncolor12()
{m_color=RGB(0,255,255);
Oncolor13()
{m_color=RGB(0,0,128);
Oncolor14()
{m_color=RGB(0,0,255);
Oncolor15()
{m_color=RGB(128,0,128);
Oncolor16()
{m_color=RGB(255,0,255);
图形绘制模块:
CMyDrawView:
CMyDrawView()
//初始化
pentype=0;
brushtype=8;
penwidth=1;
m_bdragging=false;
m_hcross=AfxGetApp()->
LoadStandardCursor(IDC_CROSS);
//获取十字光标
OnLButtonDown(UINTnFlags,CPointpoint)
{if(shape!
=5&
&
shape!
=6&
=7)
{SetCapture();
:
SetCursor(m_hcross);
}
m_ptorigin=point;
m_ptnow=point;
m_bdragging=TRUE;
if(shape==4)
{CTextdlg;
if(dlg.DoModal()==IDOK)//调用字体对话框获取字符串
{UpdateData();
stext=dlg.m_text;
CClientDCdc(this);
CMyDrawDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
pDoc->
AddFonttext(&
m_fontdlg,m_clrtext,point,stext);
//保存文字格式
CFont*pfntold=dc.SelectObject(&
m_fontdlg);
dc.SetTextColor(m_clrtext);
dc.TextOut(point.x,point.y,stext);
dc.SelectObject(pfntold);
CView:
OnLButtonDown(nFlags,point);
OnMouseMove(UINTnFlags,CPointpoint)
{
CClientDCdc(this);
if(shape==5)//获取画笔、画刷、橡皮光标
{HCURSORhCursor=SetCursor(AfxGetApp()->
elseif(shape==6)
LoadCursor(IDC_CUR_BRUSH));
elseif(shape==7)
LoadCursor(IDC_CUR_ERASE));
if(m_bdragging)
{CMyDrawDoc*pDoc=GetDocument();
CPenpennew,*ppenold;
CBrushbrushnew,*pbrushold;
if(shape==0)
{pDoc->
AddLine(m_pt