vc++课程设计.docx
- 文档编号:8691829
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:24
- 大小:92.35KB
vc++课程设计.docx
《vc++课程设计.docx》由会员分享,可在线阅读,更多相关《vc++课程设计.docx(24页珍藏版)》请在冰豆网上搜索。
vc++课程设计
VC++课程设计
姓名:
xxxxx
学号:
200901030226
班级:
09计2
一.目的:
1.掌握用VC++6.0开发环境开发软件的方法;
2.熟悉获得帮助的方法;
3.掌握SDI应用程序结构,熟悉基于对话框的应用程序编程方法;
4.掌握用资源编辑器进行图标,菜单,工具栏,对话框等资源的编辑;
5.掌握对话框,常用控件和ActiveX控件的使用方法;
6.熟悉文档/视图结构,掌握文档和视图的相互控制技巧;
二.设计题目:
1.开发一个小型绘图应用程序,具体要求如下:
(1)具有标准Windows应用程序的界面和风格(视图要求滚动);
(2)通过选择菜单或工具栏中相应功能完成基本几何图形的绘制(基本几何图形包括直线、圆、椭圆、矩形、多边形、扇形、弧等);
(3)几何图形实现存盘和读取显示功能;
(4)应用程序界面友好;
三.功能及实现说明:
功能及实现说明:
本程序要求通过选择菜单或工具栏中相应功能完成基本几何图形的绘制(基本几何图形包括直线、圆、椭圆、矩形、多边形、扇形、弧等),还有就是实现了图形的颜色及样式大小的设定,和具有存档的功能。
所以需要使用颜色通用对话框,还有就是扇形、弧时需要用户自己输入参数,所以需要一个参数输入对话框;还有就是在状态栏动态的显示鼠标的坐标(这部分代码添加在OnMouseMove()中了)。
四.设计思路分析即源代码实现:
1.首先利用MFCAppWizard应用程序向导创建一个SDI应用程序MyDraw,然后为视图类CMyDrawView添加成员变量。
线段起始点的坐标定义为CPoint类型,鼠标拖拽标记定义为bool类型。
绘图时需要需要采用标准的十字光标,定义一个HCURSOR型成员变量。
在视图类的头文件添加如下的成员变量:
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。
代码附录:
【1】
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);
}
voidCMyDrawView:
:
OnMouseMove(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
if(m_bDragging)
{
CPointptOrg,ptStart,ptEnd;///////滚动
ptOrg=GetScrollPosition();
ptStart=m_ptOrigin+ptOrg;
ptEnd=point+ptOrg;
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_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.MoveTo(downPoint);
dc.LineTo(point);
}
TempOld=point;
break;}
caseDRAW_ELLIPSE:
{
dc.SetROP2(R2_NOTXORPEN);
//dc.SetROP2(R2_NOT);
CBrush*pBrushOld;
pBrushOld=(CBrush*)dc.SelectStockObject(NULL_BRUSH);
if(TempOld!
=point)
{
dc.Ellipse(downPoint.x,downPoint.y,TempOld.x,TempOld.y);
dc.Ellipse(downPoint.x,downPoint.y,point.x,point.y);
}
TempOld=point;
dc.SelectObject(pBrushOld);
break;
}
caseDRAW_RECTANGLE:
{
dc.SetROP2(R2_NOTXORPEN);
//dc.SetROP2(R2_NOT);
CBrush*pBrushOld;
pBrushOld=(CBrush*)dc.SelectStockObject(NULL_BRUSH);
if(TempOld!
=point)
{
dc.Rectangle(downPoint.x,downPoint.y,TempOld.x,TempOld.y);
dc.Rectangle(downPoint.x,downPoint.y,point.x,point.y);
}
TempOld=point;
dc.SelectObject(pBrushOld);
break;
}
caseDRAW_CIRCLE:
{
dc.SetROP2(R2_NOTXORPEN);
//dc.SetROP2(R2_NOT);
CBrush*pBrushOld;
pBrushOld=(CBrush*)dc.SelectStockObject(NULL_BRUSH);
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);
TempOld=point;
dc.SelectObject(pBrushOld);
break;
}
caseDRAW_MANY:
dc.SetROP2(R2_NOTXORPEN);
//dc.SetROP2(R2_NOT);
if(TempOld!
=point)
{
dc.MoveTo(downPoint);
dc.LineTo(TempOld);
dc.MoveTo(downPoint);
dc.LineTo(point);
}
TempOld=point;
break;
}
dc.SelectObject(pOldPen);
deletepNewPen;
}
//在状态栏显示坐标
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);
pStatus->SetPaneText(1,strPoint);
}
}else
{
pStatus->SetPaneText(1,"");
}
CView:
:
OnMouseMove(nFlags,point);
}
voidCMyDrawView:
:
OnLButtonUp(UINTnFlags,CPointpoint)
{
CMyDrawDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
upPoint=point;
CClientDCdc(this);
OnPrepareDC(&dc);
dc.DPtoLP(&point);
switch(CurrentDraw)
{
caseDRAW_LINE:
pDoc->AddLine(m_Style,m_Color,m_Size,downPoint,point);
break;
caseDRAW_ELLIPSE:
pDoc->AddPoint(m_Style,m_Color,m_Size,downPoint,point);
break;
caseDRAW_RECTANGLE:
pDoc->AddPointRect(m_Style,m_Color,m_Size,downPoint,point);
break;
caseDRAW_CIRCLE:
pDoc->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));
break;
caseDRAW_MANY:
pDoc->AddLine(m_Style,m_Color,m_Size,downPoint,point);
break;
}
if(m_bDragging)
{
m_bDragging=false;
ReleaseCapture();
}
CView:
:
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;
CPointm_pt1;
CPointm_pt2;
UINTm_nStyle;
COLORREFm_nColor;
UINTm_nSize;
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< else ar>>m_nStyle>>m_nSize>>m_nColor>>m_pt1>>m_pt2; } CFan.cpp: CFan: : CFan(UINTStyle,COLORREFColor,UINTSize,CRectRect,CPointpt1,CPointpt2) { m_nStyle=Style; m_nColor=Color; m_nSize=Size; m_Rect=Rect; m_pt1=pt1; m_pt2=pt2; } voidCFan: : Serialize(CArchive&ar) { if(ar.IsStoring()) ar< else ar>>m_nStyle>>m_nColor>>m_nSize>>m_Rect>>m_pt1>>m_pt2; } 在文档类的头文件里面添加下列代码: ////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); } CLine*CMyDrawDoc: : GetPoint(intnIndex) { if(nIndex<0||nIndex>m_PointArray.GetUpperBound()) returnNULL; returnm_PointArray.GetAt(nIndex); } CLine*CMyDrawDoc: : GetPointRect(intnIndex) { if(nIndex<0||nIndex>m_PointRectArray.GetUpperBound()) returnNULL; returnm_PointRectArray.GetAt(nIndex); } CFan*CMyDrawDoc: : GetFan(intnIndex) { if(nIndex<0||nIndex>m_FanArray.GetUpperBound()) returnNULL; returnm_FanArray.GetAt(nIndex); } CFan*CMyDrawDoc: : GetArc(intnIndex) { if(nIndex<0||nIndex>m_ArcArray.GetUpperBound()) returnNULL; returnm_ArcArray.GetAt(nIndex); } voidCMyDrawDoc: : AddLi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- vc 课程设计