vc++课程设计文档格式.docx

上传人:b****7 文档编号:21828069 上传时间:2023-02-01 格式:DOCX 页数:24 大小:92.35KB
下载 相关 举报
vc++课程设计文档格式.docx_第1页
第1页 / 共24页
vc++课程设计文档格式.docx_第2页
第2页 / 共24页
vc++课程设计文档格式.docx_第3页
第3页 / 共24页
vc++课程设计文档格式.docx_第4页
第4页 / 共24页
vc++课程设计文档格式.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

vc++课程设计文档格式.docx

《vc++课程设计文档格式.docx》由会员分享,可在线阅读,更多相关《vc++课程设计文档格式.docx(24页珍藏版)》请在冰豆网上搜索。

vc++课程设计文档格式.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1