vc++课程设计文档格式.docx
《vc++课程设计文档格式.docx》由会员分享,可在线阅读,更多相关《vc++课程设计文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
CPointm_ptOrigin;
boolm_bDragging;
HCURSORm_hCross;
在视图类CMyDrawView的构造函数中初始化拖拽标记,设置十字光标。
m_bDragging=false;
m_hCross=Afx()->
LoadStandardCursor(IDC_CROSS);
2、利用向导类为视图类添加消息:
WM_LBUTTONDOWN,
WM_LBUTTONUP,WM_MOUSEMOVE等消息处理函数。
在函数OnLButtonDown(UINTnFlags,CPointpoint)添加画多边形的代码,在OnMouseMove(UINTnFlags,CPointpoint)里添加画直线、圆、椭圆、矩形、多边形的代码,在OnLButtonUp(UINTnFlags,CPointpoint)里添加画扇形,弧,以及各种图形的存入数组的代码。
【1】
(代码见附录)。
3、由于需要画许多不同的图形,故在视图类声明一个枚举类型的成员变量enumm_eDraw
{DRAW_PENCIL,DRAW_LINE,DRAW_CIRCLE,DRAW_ELLIPSE,DRAW_RECTANGLE,DRAW_MANY,DRAW_FAN,DRAW_ARC};
初始化为曲线;
m_eDrawCurrentDraw=DRAW_PENCIL;
4、对话框的设计:
由于画扇形和弧参数较多,所以设计了用对话框来接受用户的输入,设计如下:
在CDialogFan中添加如下成员变量:
UINTm_nSpan;
UINTm_nStart;
UINTm_nCenterX;
UINTm_nCenterY;
UINTm_nRadius;
5.序列化:
序列化是本课设的重点和难点,不同图形需要的参数类型和个数不同,为了能够序列化所有的图形,可分析知直线、圆、椭圆、矩形、多边形只需要两个CPoint类型的参数即可,而扇形和弧则需要一个CRect类型的参数和两个CPoint类型的参数。
因此,只需创建了2个类即可,分别为Cline,CFan,都继承自CObject。
由于我为图形添加了颜色、样式、粗细的属性,所以每个类还需要存储这些参数。
因此,可为编写如下代码【2】;
6、重绘
因为窗口移动会调用OnDraw()函数,为了使移动窗口或改变窗口的大小时,能够保存图像,需要在OnDraw()里调用每个图形的重绘函数。
详细代码见【3】
7、工具栏和菜单栏:
一个应用程序必然少不了工具栏和菜单栏,因此本课设也运用工具栏和菜单栏,在工具栏设计如下的图标:
P,L,C,E,R,M,F,A,Co,Ss分别代表
曲线、直线、圆、椭圆、矩形、多边形、弧、颜色、样式大小。
为其添加的ID分别为:
ID_DRAW_PENCIL,ID_DRAW_LINE,ID_DRAW_CIRCLE,ID_DRAW_ELLIPSE,
ID_DRAW_RECTANGLE,ID_DRAW_MANY,ID_DRAW_FAN,ID_DRAW_ARC,
菜单栏设计如下,ID与工具栏对应:
利用类向导在视图类里为工具按钮添加消息处理函数,并写如下代码:
【4】,此为实现菜单栏的响应。
为了在工具栏也能响应,需要添加选择对话框:
如下
在对话框的源文件和视图类添加代码【5】:
8.由于本程序代码较多,所以只在附录列出部分重要代码,完整程序见文档MyDraw。
代码附录:
voidCMyDrawView:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
downPoint=point;
TempOld=point;
if(upPoint.x==0&
&
upPoint.y==0)
{
upPoint=point;
}
SetCapture();
:
SetCursor(m_hCross);
m_ptOrigin=point;
m_bDragging=true;
CMyDrawDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
CClientDCdc(this);
OnPrepareDC(&
dc);
dc.DPtoLP(&
point);
CPen*pOldPen;
CPen*pNewPen=newCPen(m_Style,m_Size,m_Color);
pOldPen=dc.SelectObject(pNewPen);
switch(CurrentDraw)
caseDRAW_MANY:
dc.MoveTo(upPoint);
dc.LineTo(point);
pDoc->
AddLine(m_Style,m_Color,m_Size,upPoint,point);
break;
dc.SelectObject(pOldPen);
deletepNewPen;
CView:
OnLButtonDown(nFlags,point);
}
OnMouseMove(UINTnFlags,CPointpoint)
if(m_bDragging)
CPointptOrg,ptStart,ptEnd;
///////滚动
ptOrg=GetScrollPosition();
ptStart=m_ptOrigin+ptOrg;
ptEnd=point+ptOrg;
CMyDrawDoc*pDoc=GetDocument();
//获得文档类的指针
ASSERT_VALID(pDoc);
CClientDCdc(this);
dc.DPtoLP(&
//创建画笔
CPen*pNewPen=newCPen(m_Style,m_Size,m_Color);
pOldPen=dc.SelectObject(pNewPen);
switch(CurrentDraw)
{
caseDRAW_PENCIL:
pDoc->
AddLine(m_Style,m_Color,m_Size,m_ptOrigin,point);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
m_ptOrigin=point;
break;
caseDRAW_LINE:
//dc.SetROP2(R2_NOT);
dc.SetROP2(R2_NOTXORPEN);
if(TempOld!
=point)
{
dc.MoveTo(downPoint);
dc.LineTo(TempOld);
dc.LineTo(point);
}
TempOld=point;
caseDRAW_ELLIPSE:
dc.SetROP2(R2_NOTXORPEN);
//dc.SetROP2(R2_NOT);
CBrush*pBrushOld;
pBrushOld=(CBrush*)dc.SelectStockObject(NULL_BRUSH);
dc.Ellipse(downPoint.x,downPoint.y,TempOld.x,TempOld.y);
dc.Ellipse(downPoint.x,downPoint.y,point.x,point.y);
dc.SelectObject(pBrushOld);
caseDRAW_RECTANGLE:
//dc.SetROP2(R2_NOT);
dc.Rectangle(downPoint.x,downPoint.y,TempOld.x,TempOld.y);
dc.Rectangle(downPoint.x,downPoint.y,point.x,point.y);
caseDRAW_CIRCLE:
intx_Long=:
abs(point.x-downPoint.x);
inty_Long=:
abs(point.y-downPoint.y);
intmax_Offset=x_Long>
=y_Long?
x_Long:
y_Long;
m_Offset=max_Offset;
dc.Ellipse(downPoint.x-max_Offset,downPoint.y-max_Offset,downPoint.x+max_Offset,downPoint.y+max_Offset);
intxOld_Long=:
abs(TempOld.x-downPoint.x);
intyOld_Long=:
abs(TempOld.y-downPoint.y);
intmaxOld_Offset=xOld_Long>
=yOld_Long?
xOld_Long:
yOld_Long;
dc.Ellipse(downPoint.x-maxOld_Offset,downPoint.y-maxOld_Offset,downPoint.x+maxOld_Offset,downPoint.y+maxOld_Offset);
dc.SelectObject(pBrushOld);
}
break;
}
dc.SelectObject(pOldPen);
//在状态栏显示坐标
CStringstrPoint;
CStatusBar*pStatus=(CStatusBar*)AfxGetApp()->
m_pMainWnd->
GetDescendantWindow(ID_VIEW_STATUS_BAR);
CRectrcClient;
GetClientRect(&
rcClient);
if(rcClient.PtInRect(point))
{
if(pStatus)
strPoint.Format("
%d,%d"
point.x,point.y);
pStatus->
SetPaneInfo(1,1,1,60);
SetPaneText(1,strPoint);
}
}else
SetPaneText(1,"
"
);
OnMouseMove(nFlags,point);
OnLButtonUp(UINTnFlags,CPointpoint)
upPoint=point;
caseDRAW_LINE:
pDoc->
AddLine(m_Style,m_Color,m_Size,downPoint,point);
caseDRAW_ELLIPSE:
AddPoint(m_Style,m_Color,m_Size,downPoint,point);
caseDRAW_RECTANGLE:
AddPointRect(m_Style,m_Color,m_Size,downPoint,point);
caseDRAW_CIRCLE:
AddPoint(m_Style,m_Color,m_Size,
CPoint(downPoint.x-m_Offset,downPoint.y-m_Offset),CPoint(downPoint.x+m_Offset,downPoint.y+m_Offset));
caseDRAW_MANY:
}
m_bDragging=false;
ReleaseCapture();
OnLButtonUp(nFlags,point);
【2】
可为CLine类的头文件里添加添加成员变量和构造函数:
CPointm_pt1;
CPointm_pt2;
UINTm_nStyle;
COLORREFm_nColor;
UINTm_nSize;
CLine(UINTm_nStyle,COLORREFColor,UINTSize,CPointpt1,CPointpt2);
可为CFan类的头文件里添加添加成员变量和构造函数:
CRectm_Rect;
CFan(UINTStyle,COLORREFColor,UINTSize,CRectRect,CPointpt1,CPointpt2);
然后再各自的源文件中添加下列代码:
Cline.cpp:
CLine:
CLine(UINTStyle,COLORREFColor,UINTSize,CPointpt1,CPointpt2)
m_pt1=pt1;
m_pt2=pt2;
m_nStyle=Style;
m_nColor=Color;
m_nSize=Size;
voidCLine:
Serialize(CArchive&
ar)
if(ar.IsStoring())
ar<
<
m_nStyle<
m_nSize<
m_nColor<
m_pt1<
m_pt2;
else
ar>
>
m_nStyle>
m_nSize>
m_nColor>
m_pt1>
CFan.cpp:
CFan:
CFan(UINTStyle,COLORREFColor,UINTSize,CRectRect,CPointpt1,CPointpt2)
m_Rect=Rect;
voidCFan:
m_Rect<
m_Rect>
在文档类的头文件里面添加下列代码:
////pencil
intGetNumLines();
voidAddLine(UINTStyle,COLORREFColor,UINTSize,CPointpt1,CPointpt2);
CLine*GetLine(intnIndex);
////Lines
intGetNumPoints();
voidAddPoint(UINTStyle,COLORREFColor,UINTSize,CPointpt1,CPointpt2);
CLine*GetPoint(intnIndex);
////Rectangle
intGetNumPointsRect();
voidAddPointRect(UINTStyle,COLORREFColor,UINTSize,CPointpt1,CPointpt2);
CLine*GetPointRect(intnIndex);
/////fan
intGetNumFans();
voidAddFan(UINTStyle,COLORREFColor,UINTSize,CRectRect,CPointpt1,CPointpt2);
CFan*GetFan(intnIndex);
/////Arc
intGetNumArcs();
voidAddArc(UINTStyle,COLORREFColor,UINTSize,CRectRect,CPointpt1,CPointpt2);
CFan*GetArc(intnIndex);
在源文件里实现他们:
CLine*CMyDrawDoc:
GetLine(intnIndex)
if(nIndex<
0||nIndex>
m_LineArray.GetUpperBound())
returnNULL;
returnm_LineArray.GetAt(nIndex);
GetPoint(intnIndex)
m_PointArray.GetUpperBound())
returnm_PointArray.GetAt(nIndex);
GetPointRect(intnIndex)
m_PointRectArray.GetUpperBound())
returnm_PointRectArray.GetAt(nIndex);
CFan*CMyDrawDoc:
GetFan(intnIndex)
m_FanArray.GetUpperBound())
returnm_FanArray.GetAt(nIndex);
GetArc(intnIndex)
m_ArcArray.GetUpperBound())
returnm_ArcArray.GetAt(nIndex);
voidCMyDrawDoc:
AddLi