简单的绘图程序实验报告.docx

上传人:b****6 文档编号:8623009 上传时间:2023-02-01 格式:DOCX 页数:20 大小:305.27KB
下载 相关 举报
简单的绘图程序实验报告.docx_第1页
第1页 / 共20页
简单的绘图程序实验报告.docx_第2页
第2页 / 共20页
简单的绘图程序实验报告.docx_第3页
第3页 / 共20页
简单的绘图程序实验报告.docx_第4页
第4页 / 共20页
简单的绘图程序实验报告.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

简单的绘图程序实验报告.docx

《简单的绘图程序实验报告.docx》由会员分享,可在线阅读,更多相关《简单的绘图程序实验报告.docx(20页珍藏版)》请在冰豆网上搜索。

简单的绘图程序实验报告.docx

简单的绘图程序实验报告

 

面向对象程序设计实训

(基于MFC程序设计)

 

题  目:

简单的绘图程序

院系专业:

姓名:

学号:

同组其他学生(学号):

 

简单绘图程序说明

1、功能分析

目前这个软件的主要功能有如下:

1、画直线:

通过OnLine()函数实现。

2、画矩形:

通过OnRectangle()函数实现。

3、画圆角矩形:

通过OnRoundrect()函数实现。

4、画椭圆:

通过OnEllipse()函数实现。

5、铅笔工具:

可以画任意线条。

通过直接在OnMouseMove(UINTnFlags,CPointpoint)函数里面添加代码实现。

6、右键弹出菜单:

可以在客户中点击鼠标右键,快速选择常用菜单。

通过OnContextMenu函数实现。

7、状态栏显示鼠标移动的坐标:

在程序的右下角显示,通过调用setWidnowText和GetParent()实现。

8、画图颜色选择:

可以画任何颜色的线条,通过OnColor()函数实现。

9、线条类型及线宽的设置:

可以将画出的线条设置成实线、虚线、点线、点划线,双点划线,还可以设置线条的粗细,,通过实例这一功能立刻显示所选择线条的粗细及线型。

通过新建CLineSettingDlg类,其中OnSelchangeLineStyle()函数实现线型的改变,OnChangeEditLineWidth()函数实现线宽的改变。

再在CDrawView类中调用OnLineSetting()函数实现画笔的对话框,CLineSettingDlg类中的OnPaint()函数是实现示例功能的。

10、窗口的重绘时不擦除原来的内容:

新建CShape类用来保存线条的颜色,线宽,填充色等属性,在窗口大小发生变化时有OnDraw(CDC*pDC)函数进行重绘工作,重绘中调用了各个绘图函数的Draw(CDC*pDC)函数。

11、所绘图形的保存于读取,通过Serialize(CArchive&ar)函数进行序列化操作,将所绘图形的信息通过文件的形式保存起来。

2、系统总体框架

 

图1总体框架

3、模块设计与分析

3.1画图模块:

该模块的大部份功能都写在了CDrawView类里面。

该模块也是此次程序的重点模块之一,主要负责画一些简单图形,例如:

直线、矩形、圆角矩形、椭圆、任意曲线(铅笔)等等;有线型、线宽的设置;还有画笔颜色和填充色的选择,可以画各种各样颜色的线条;还包含的右键菜单设置的函数。

3.2窗口模块:

这部分大多数都是编译器自动生成,只做了一些修改,例如:

使程序一开始运行便最大话,还是自定义程序的标题。

3.3菜单模块:

该部分同样大部分都是编译器自动生成的,自己增添了一部分菜单例如:

绘图工具、颜色设置、线条设置等等。

还有右键弹出菜单,有颜色及线条设置等等,让使用者可以进行快速的操作。

3.4工具栏与状态栏模块:

除了编译器自动生成的之外,还加入了画直线、矩形、圆角矩形、椭圆、铅笔等工具的快速选择,状态栏可以显示鼠标移动的坐标。

4、类的设计与分析

4.1、CAboutDlg类

由编译器生成,只做了一处的修改:

m_pMainWnd->SetWindowText(_T("简单绘图工具"));//设定主框架窗口标题

4.2、CDrawView类

由编译器自动生成的类

表1CDrawView类说明表

名称

属性

说明

m_flag

数据成员

用于选择图形的类型(直线,矩形,椭圆等)

m_lMouseDown

数据成员

用于判断鼠标按下的消息响应

m_ptOld

数据成员

画图的临时点(也是绘图结束的终点)

m_ptOrigin

数据成员

画图的起点

m_color

数据成员

画笔颜色选择

m_vLineWidth

数据成员

指向颜色表的指针

m_vLineStyle

数据成员

线条风格选择

OnContextMenu()

成员函数

右键弹出菜单

OnDraw()

成员函数

窗口重绘

OnEditColor()

成员函数

颜色选择

OnLine()

成员函数

画直线

OnRectangle()

成员函数

画矩形

OnRoundrect()

成员函数

画圆角矩形

OnEllipse()

成员函数

画椭圆

OnColor()

成员函数

改变线条颜色

OnFillcolor()

成员函数

改变填充色

OnLButtonDown()

成员函数

鼠标按下响应函数

OnLButtonUp()

成员函数

鼠标弹起响应函数

OnMouseMove()

成员函数

鼠标移动响应函数

OnLineSetting()

成员函数

画笔设置对话框响应函数

部分源代码:

voidCDrawView:

:

OnLButtonDown(UINTnFlags,CPointpoint)

{

//TODO:

Addyourmessagehandlercodehereand/orcalldefault

if(m_flag==0)

{

SetCapture();

:

:

SetCursor(m_hCross);

m_ptOrigin=point;

m_lMouseDown=true;

}

else

{

m_ptOrigin=point;

m_ptOld=point;//临时点

m_lMouseDown=true;//鼠标左键被按下

SetCapture();//将鼠标消息发送到视窗口

CRectrect;

GetClientRect(&rect);//得到客户窗口的大小

ClientToScreen(&rect);//将当前窗口坐标转换成屏幕坐标

ClipCursor(&rect);//把鼠标限定在其参数指定的矩形区域内

SetCursor(m_hCross);//获得十字光标

}

CScrollView:

:

OnLButtonDown(nFlags,point);

}

/*响应鼠标移动消息,将起点与临时点之间的线擦除*/

voidCDrawView:

:

OnMouseMove(UINTnFlags,CPointpoint)

{

//TODO:

Addyourmessagehandlercodehereand/orcalldefault

CStringstr;

str.Format("x=%d,y=%d",point.x,point.y);

//得到框架类窗口的指针GetParent(),然后指针强制转换为框架类的类型(CMainFrame*)

//调用状态栏类的成员函数setWidnowText

((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);

if(m_lMouseDown)

{//初始化

CClientDCdc(this);

CPenpen(m_vLineStyle,m_vLineWidth,m_color);

dc.SelectObject(&pen);

CBrushbrush;//定义画刷

CPen*pOldPen=dc.SelectObject(&pen);//将画笔选入DC,并保存以前所用的画笔

brush.CreateSolidBrush(m_fColor);//创建画刷

dc.SelectObject(&brush);//获取画刷

if(m_flag==0)

{

CClientDCdc(this);

CPenpen(m_vLineStyle,m_vLineWidth,m_color);

dc.SelectObject(&pen);

CDrawDoc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

CPointptOrg,ptStart,ptEnd;

ptOrg=GetScrollPosition();//获得当前工作区原点的坐标

ptStart=m_ptOrigin+ptOrg;//加上原点的坐标来修正线段的坐标

ptEnd=point+ptOrg;

CCLine*pCLine=newCCLine(ptStart,ptEnd,m_vLineStyle,m_vLineWidth,m_color,m_fColor);

pDoc->m_obArray.Add(pCLine);

pDoc->SetModifiedFlag();

dc.MoveTo(m_ptOrigin);

dc.LineTo(point);

m_ptOrigin=point;

}

switch(m_flag)

{

case1:

//画直线

dc.SetROP2(R2_NOT);//当前绘制的像素值设为屏幕像素值的反,这样可以覆盖掉上次的绘图,(自动擦除上次绘制的图形)

dc.SelectStockObject(NULL_BRUSH);//使图线不遮去原有背景

dc.MoveTo(m_ptOrigin);//这两行代码擦除从起点到

dc.LineTo(m_ptOld);//上次鼠标移动到的位置之间的临时线

dc.SelectObject(&pen);

dc.MoveTo(m_ptOrigin);//这两行代码从起点到鼠标当前位置画线

dc.LineTo(point);//

break;

case2:

//画矩形

dc.SetROP2(R2_NOT);

dc.SelectStockObject(NULL_BRUSH);

dc.Rectangle(CRect(m_ptOrigin,m_ptOld));

dc.SelectObject(&pen);

dc.Rectangle(CRect(m_ptOrigin,point));

break;

case3:

//画圆角矩形

dc.SetROP2(R2_NOT);

dc.SelectStockObject(NULL_BRUSH);

dc.RoundRect(CRect(m_ptOrigin,m_ptOld),CPoint(15,15));

dc.RoundRect(CRect(m_ptOrigin,point),CPoint(15,15));

break;

case4:

//画椭圆

dc.SetROP2(R2_NOT);

dc.SelectStockObject(NULL_BRUSH);

dc.Ellipse(CRect(m_ptOrigin,m_ptOld));

dc.Ellipse(CRect(m_ptOrigin,point));

break;

case5:

//画圆,将椭圆的长轴长度与短轴长度相同即可

dc.SetROP2(R2_NOT);

dc.SelectStockObject(NULL_BRUSH);

dc.Ellipse(m_ptOrigin.x,m_ptOrigin.y,m_ptOld.x,m_ptOrigin.y+m_ptOld.x-m_ptOrigin.x);

dc.Ellipse(m_ptOrigin.x,m_ptOrigin.y,point.x,m_ptOrigin.y+point.x-m_ptOrigin.x);

break;

}//switch结束

dc.SelectObject(pOldPen);//恢复先前的画笔

m_ptOld=point;

}//if结束

CScrollView:

:

OnMouseMove(nFlags,point);

}

voidCDrawView:

:

OnLButtonUp(UINTnFlags,CPointpoint)

{

//TODO:

Addyourmessagehandlercodehereand/orcalldefault

if(m_flag==0)

{

if(m_lMouseDown)

{

m_lMouseDown=false;

ReleaseCapture();

ClipCursor(NULL);

}

}

else

{

if(m_lMouseDown)

{

m_lMouseDown=false;

CClientDCdc(this);

CPenpen(m_vLineStyle,m_vLineWidth,m_color);

dc.SelectObject(&pen);

CBrushbrush;//定义画刷

brush.CreateSolidBrush(m_fColor);//创建画刷

dc.SelectObject(&brush);//获取画刷

CPen*pOldPen=dc.SelectObject(&pen);

ReleaseCapture();

ClipCursor(NULL);

switch(m_flag)

{

case1:

//画直线

dc.SetROP2(R2_COPYPEN);//使用当前的画笔的颜色

dc.MoveTo(m_ptOrigin);//这两行代码从起点到鼠标当前位置画线

dc.LineTo(point);//

break;

case2:

//画矩形

dc.Rectangle(CRect(m_ptOrigin,point));

break;

case3:

//画圆角矩形

dc.RoundRect(CRect(m_ptOrigin,point),CPoint(10,15));

break;

case4:

//画椭圆

dc.SetROP2(R2_COPYPEN);

dc.Ellipse(CRect(m_ptOrigin,point));

break;

case5:

//画圆

dc.SetROP2(R2_COPYPEN);

dc.Ellipse(m_ptOrigin.x,m_ptOrigin.y,point.x,m_ptOrigin.y+point.x-m_ptOrigin.x);

break;

}//switch结束

//实现文件保存,将各图形类的地址保存在CObArraym_obArray数组中

CDrawDoc*pDoc=GetDocument();//得到文档类指针

CShape*pShape;

CPointptOrg;

ptOrg=GetScrollPosition();//获得当前工作区原点的坐标

m_ptOrigin=m_ptOrigin+ptOrg;//加上原点的坐标来修正线段的坐标

point=point+ptOrg;

switch(m_flag)

{

case1:

pShape=newCLine(m_ptOrigin,point,m_vLineStyle,m_vLineWidth,m_color,m_fColor);

break;

case2:

pShape=newCRectangle(m_ptOrigin,point,m_vLineStyle,m_vLineWidth,m_color,m_fColor);

break;

case3:

pShape=newCRoundRect(m_ptOrigin,point,m_vLineStyle,m_vLineWidth,m_color,m_fColor);

break;

case4:

pShape=newCEllipse(m_ptOrigin,point,m_vLineStyle,m_vLineWidth,m_color,m_fColor);

break;

case5:

pShape=newCCircle(m_ptOrigin,point,m_vLineStyle,m_vLineWidth,m_color,m_fColor);

break;

}

pDoc->m_obArray.Add(pShape);

pDoc->SetModifiedFlag();

}//if结束

m_lMouseDown=false;

}

CScrollView:

:

OnLButtonUp(nFlags,point);

}

4.3、CMainFrame类

主要由编译器生成,做了小部分修改:

//工具条的风格

if(!

s_ShapeToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_LEFT

|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||

!

s_ShapeToolBar.LoadToolBar(IDR_SHAPETOOLBAR))

{

TRACE0("Failedtocreatetoolbar\n");

return-1;//failtocreate

}

intnCount=s_ShapeToolBar.GetToolBarCtrl().GetButtonCount();//设置工具条按钮能被按下并且弹起

for(inti=0;i

{

s_ShapeToolBar.SetButtonStyle(i,TBBS_CHECKGROUP);

}

s_ShapeToolBar.EnableDocking(CBRS_ALIGN_ANY);//以下两行使形状工具条和标准工具条具有停靠能力,并且可以停靠在任何地方

m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);

EnableDocking(CBRS_ALIGN_ANY);

DockControlBar(&m_wndToolBar);

DockControlBar(&s_ShapeToolBar,AFX_IDW_DOCKBAR_LEFT,NULL);//使形状工具条停靠在客户区左边。

用于改变工具条停靠的地方。

4.4、CLineSettingDlg类

由自己创建,主要是响应菜单中的各个设置选项,该类实现的功能比较少。

表1CSettingDlg类说明表

名称

属性

说明

m_LineWidth

数据成员

记录线的粗细

m_LineStyle

数据成员

记录线条的类型

OnChangeEditLineWidth()

OnSelchangeLineStyle()

成员函数

编辑框控件(ID_LINESETTING)的响应函数

OnPaint()

成员函数

在示例中显示所需要的线型和线宽

部分源代码:

voidCLineSettingDlg:

:

OnPaint()

{

CPaintDCdc(this);//devicecontextforpainting

//TODO:

Addyourmessagehandlercodehere

UpdateData();

CPenpen(m_LineStyle,m_LineWidth,m_color);//创建画笔

dc.SelectObject(&pen);

CRectrect;

GetDlgItem(IDC_SAMPLE)->GetWindowRect(rect);

ScreenToClient(rect);

dc.MoveTo(rect.left+20,(rect.top+rect.bottom)/2);

dc.LineTo(rect.right-20,(rect.top+rect.bottom)/2);

//DonotcallCDialog:

:

OnPaint()forpaintingmessages

}

voidCLineSettingDlg:

:

OnSelchangeLineStyle()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

intindex=((CComboBox*)GetDlgItem(IDC_LINESTYLE))->GetCurSel();

m_LineStyle=index;

Invalidate();

}

voidCLineSettingDlg:

:

OnChangeEditLineWidth()

{

//TODO:

IfthisisaRICHEDITcontrol,thecontrolwillnot

//sendthisnotificationunlessyouoverridetheCDialog:

:

OnInitDialog()

//functionandcallCRichEditCtrl().SetEventMask()

//withtheENM_CHANGEflagORedintothemask.

//TODO:

Addyourcontrolnotificationhandlercodehere

Invalidate();

}

4.5、Chape类

由自己创建,主要用于保存线条的颜色,线宽,填充色等属性,在窗口重绘时起重要作用。

名称

属性

说明

m_flag

数据成员

用于选择图形的类型(直线,矩形,椭圆等)

m_lMouseDown

数据成员

用于判断鼠标按下的消息响应

m_ptEnd

数据成员

画图的终点

m_ptOrigin

数据成员

画图的起点

m_fColor

数据成员

填充色选择

m_color

数据成员

画笔颜色选择

m_LineWidth

数据成员

线宽选择

m_LineStyle

数据成员

线条风格选择

 

部分源代码:

CShape:

:

CShape(CPointp1,CP

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

当前位置:首页 > 工程科技 > 环境科学食品科学

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

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