简单的绘图程序实验报告(共19页).doc

上传人:飞****2 文档编号:13903338 上传时间:2022-05-01 格式:DOC 页数:19 大小:380KB
返回 下载 相关 举报
简单的绘图程序实验报告(共19页).doc_第1页
第1页 / 共19页
简单的绘图程序实验报告(共19页).doc_第2页
第2页 / 共19页
点击查看更多>>
资源描述

《简单的绘图程序实验报告(共19页).doc》由会员分享,可在线阅读,更多相关《简单的绘图程序实验报告(共19页).doc(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上面向对象程序设计实训(基于MFC程序设计) 题目: 简单的绘图程序 院系专业: 姓 名: 学 号: 同组其他学生(学号): 简单绘图程序说明1、功能分析目前这个软件的主要功能有如下:1、 画直线:通过OnLine()函数实现。2、 画矩形:通过OnRectangle()函数实现。3、 画圆角矩形:通过OnRoundrect()函数实现。4、 画椭圆:通过OnEllipse()函数实现。5、 铅笔工具:可以画任意线条。通过直接在OnMouseMove(UINT nFlags, CPoint point)函数里面添加代码实现。6、 右键弹出菜单:可以在客户中点击鼠标右键,

2、快速选择常用菜单。通过OnContextMenu函数实现。7、 状态栏显示鼠标移动的坐标:在程序的右下角显示,通过调用setWidnowText和GetParent()实现。8、 画图颜色选择:可以画任何颜色的线条,通过OnColor()函数实现。9、 线条类型及线宽的设置:可以将画出的线条设置成实线、虚线、点线、点划线,双点划线,还可以设置线条的粗细,通过实例这一功能立刻显示所选择线条的粗细及线型。通过新建CLineSettingDlg类,其中OnSelchangeLineStyle()函数实现线型的改变,OnChangeEditLineWidth()函数实现线宽的改变。再在CDrawVie

3、w类中调用OnLineSetting()函数实现画笔的对话框,CLineSettingDlg类中的OnPaint()函数是实现示例功能的。10、 窗口的重绘时不擦除原来的内容:新建CShape类用来保存线条的颜色,线宽,填充色等属性,在窗口大小发生变化时有OnDraw(CDC* pDC)函数进行重绘工作,重绘中调用了各个绘图函数的Draw(CDC *pDC)函数。11、 所绘图形的保存于读取,通过Serialize(CArchive &ar)函数进行序列化操作,将所绘图形的信息通过文件的形式保存起来。2、系统总体框架简单绘图工具 画直线画矩形画椭圆画圆角矩形铅笔工具 图1 总体框架3、模块设计

4、与分析3.1画图模块:该模块的大部份功能都写在了CDrawView类里面。该模块也是此次程序的重点模块之一,主要负责画一些简单图形,例如:直线、矩形、圆角矩形、椭圆、任意曲线(铅笔)等等;有线型、线宽的设置;还有画笔颜色和填充色的选择,可以画各种各样颜色的线条;还包含的右键菜单设置的函数。 3.2窗口模块:这部分大多数都是编译器自动生成,只做了一些修改,例如:使程序一开始运行便最大话,还是自定义程序的标题。 3.3菜单模块:该部分同样大部分都是编译器自动生成的,自己增添了一部分菜单例如:绘图工具、颜色设置、线条设置等等。还有右键弹出菜单,有颜色及线条设置等等,让使用者可以进行快速的操作。 3.

5、4工具栏与状态栏模块:除了编译器自动生成的之外,还加入了画直线、矩形、圆角矩形、椭圆、铅笔等工具的快速选择,状态栏可以显示鼠标移动的坐标。4、类的设计与分析 4.1、CAboutDlg类 由编译器生成,只做了一处的修改:m_pMainWnd-SetWindowText(_T(简单绘图工具);/设定主框架窗口标题 4.2、CDrawView类 由编译器自动生成的类表1 CDrawView类说明表名称属性说明m_flag数据成员用于选择图形的类型(直线,矩形,椭圆等)m_lMouseDown数据成员用于判断鼠标按下的消息响应m_ptOld数据成员画图的临时点(也是绘图结束的终点)m_ptOrigi

6、n数据成员画图的起点m_color数据成员画笔颜色选择m_vLineWidth数据成员指向颜色表的指针m_vLineStyle数据成员线条风格选择OnContextMenu()成员函数右键弹出菜单OnDraw()成员函数窗口重绘OnEditColor()成员函数颜色选择OnLine()成员函数画直线OnRectangle()成员函数画矩形OnRoundrect()成员函数画圆角矩形OnEllipse()成员函数画椭圆OnColor()成员函数改变线条颜色OnFillcolor()成员函数改变填充色OnLButtonDown()成员函数鼠标按下响应函数OnLButtonUp()成员函数鼠标弹起响

7、应函数OnMouseMove()成员函数鼠标移动响应函数OnLineSetting()成员函数画笔设置对话框响应函数部分源代码:void CDrawView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultif(m_flag=0)SetCapture();:SetCursor(m_hCross);m_ptOrigin = point;m_lMouseDown = true;elsem_ptOrigin = point;m_ptOld =

8、point;/临时点m_lMouseDown = true;/鼠标左键被按下SetCapture(); / 将鼠标消息发送到视窗口CRect rect;GetClientRect(&rect); / 得到客户窗口的大小ClientToScreen(&rect); / 将当前窗口坐标转换成屏幕坐标ClipCursor(&rect); / 把鼠标限定在其参数指定的矩形区域内SetCursor(m_hCross);/ 获得十字光标CScrollView:OnLButtonDown(nFlags, point);/*响应鼠标移动消息,将起点与临时点之间的线擦除*/void CDrawView:OnMo

9、useMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCString str;str.Format(x=%d,y=%d,point.x,point.y);/得到框架类窗口的指针GetParent(),然后指针强制转换为框架类的类型(CMainFrame*)/调用状态栏类的成员函数setWidnowText(CMainFrame*)GetParent()-m_wndStatusBar.SetWindowText(str);if( m_lMouseDown )

10、/初始化CClientDC dc(this);CPen pen(m_vLineStyle,m_vLineWidth,m_color);dc.SelectObject(&pen);CBrush brush; /定义画刷CPen * pOldPen = dc.SelectObject(&pen);/将画笔选入DC,并保存以前所用的画笔brush.CreateSolidBrush(m_fColor); /创建画刷dc.SelectObject(&brush); /获取画刷if(m_flag=0)CClientDC dc(this);CPen pen(m_vLineStyle,m_vLineWidth

11、,m_color);dc.SelectObject(&pen);CDrawDoc *pDoc = GetDocument();ASSERT_VALID(pDoc);CPoint ptOrg, ptStart, ptEnd;ptOrg = GetScrollPosition(); / 获得当前工作区原点的坐标ptStart = m_ptOrigin + ptOrg; / 加上原点的坐标来修正线段的坐标ptEnd = point + ptOrg;CCLine *pCLine = new CCLine(ptStart,ptEnd,m_vLineStyle, m_vLineWidth,m_color,

12、m_fColor);pDoc-m_obArray.Add(pCLine);pDoc-SetModifiedFlag();dc.MoveTo(m_ptOrigin);dc.LineTo(point);m_ptOrigin = point;switch(m_flag)case 1: /画直线dc.SetROP2( R2_NOT ); /当前绘制的像素值设为屏幕像素值的反,这样可以覆盖掉上次的绘图,(自动擦除上次绘制的图形)dc.SelectStockObject(NULL_BRUSH);/使图线不遮去原有背景dc.MoveTo( m_ptOrigin );/这两行代码擦除从起点到dc.LineTo

13、( m_ptOld );/上次鼠标移动到的位置之间的临时线dc.SelectObject(&pen);dc.MoveTo( m_ptOrigin );/这两行代码从起点到鼠标当前位置画线dc.LineTo( point );/ break;case 2: /画矩形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;case 3: /画

14、圆角矩形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;case 4: /画椭圆dc.SetROP2( R2_NOT );dc.SelectStockObject(NULL_BRUSH);dc.Ellipse(CRect(m_ptOrigin,m_ptOld);dc.Ellipse(CRect(m_ptOrigin

15、,point);break;case 5: /画圆,将椭圆的长轴长度与短轴长度相同即可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

16、);/恢复先前的画笔m_ptOld = point; /if 结束CScrollView:OnMouseMove(nFlags, point);void CDrawView:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultif(m_flag=0) if( m_lMouseDown )m_lMouseDown = false;ReleaseCapture();ClipCursor( NULL );elseif( m_lMouseDown )m_

17、lMouseDown = false;CClientDC dc(this);CPen pen(m_vLineStyle,m_vLineWidth,m_color);dc.SelectObject(&pen);CBrush brush; /定义画刷brush.CreateSolidBrush(m_fColor); /创建画刷dc.SelectObject(&brush); /获取画刷CPen * pOldPen = dc.SelectObject(&pen);ReleaseCapture();ClipCursor( NULL );switch(m_flag)case 1: /画直线 dc.Set

18、ROP2( R2_COPYPEN );/使用当前的画笔的颜色 dc.MoveTo( m_ptOrigin ); /这两行代码从起点到鼠标当前位置画线dc.LineTo( point ); /break;case 2: /画矩形dc.Rectangle(CRect(m_ptOrigin,point);break;case 3: /画圆角矩形dc.RoundRect(CRect(m_ptOrigin,point),CPoint(10,15);break;case 4: /画椭圆dc.SetROP2( R2_COPYPEN );dc.Ellipse(CRect(m_ptOrigin,point);b

19、reak;case 5: /画圆dc.SetROP2( R2_COPYPEN );dc.Ellipse(m_ptOrigin.x,m_ptOrigin.y,point.x,m_ptOrigin.y+point.x-m_ptOrigin.x);break;/switch 结束/实现文件保存,将各图形类的地址保存在CObArray m_obArray数组中 CDrawDoc* pDoc = GetDocument(); /得到文档类指针CShape *pShape ;CPoint ptOrg;ptOrg = GetScrollPosition(); / 获得当前工作区原点的坐标m_ptOrigin

20、 = m_ptOrigin + ptOrg; / 加上原点的坐标来修正线段的坐标point = point + ptOrg;switch(m_flag)case 1:pShape = new CLine(m_ptOrigin,point,m_vLineStyle, m_vLineWidth,m_color,m_fColor);break; case 2:pShape = new CRectangle(m_ptOrigin,point,m_vLineStyle, m_vLineWidth,m_color,m_fColor);break;case 3:pShape = new CRoundRect

21、(m_ptOrigin,point,m_vLineStyle, m_vLineWidth,m_color,m_fColor);break;case 4:pShape = new CEllipse(m_ptOrigin,point,m_vLineStyle, m_vLineWidth,m_color,m_fColor);break;case 5:pShape = new CCircle(m_ptOrigin,point,m_vLineStyle, m_vLineWidth,m_color,m_fColor);break; pDoc-m_obArray.Add(pShape);pDoc-SetMo

22、difiedFlag();/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_SH

23、APETOOLBAR)TRACE0(Failed to create toolbarn);return -1; / fail to createint nCount =s_ShapeToolBar.GetToolBarCtrl().GetButtonCount();/设置工具条按钮能被按下并且弹起for(int i=0;iGetWindowRect(rect);ScreenToClient(rect);dc.MoveTo(rect.left+20,(rect.top+rect.bottom)/2);dc.LineTo(rect.right-20,(rect.top+rect.bottom)/2

24、);/ Do not call CDialog:OnPaint() for painting messagesvoid CLineSettingDlg:OnSelchangeLineStyle() / TODO: Add your control notification handler code hereint index = (CComboBox*)GetDlgItem(IDC_LINESTYLE)-GetCurSel(); m_LineStyle = index; Invalidate();void CLineSettingDlg:OnChangeEditLineWidth() / TO

25、DO: If this is a RICHEDIT control, the control will not/ send this notification unless you override the CDialog:OnInitDialog()/ function and call CRichEditCtrl().SetEventMask()/ with the ENM_CHANGE flag ORed into the mask./ TODO: Add your control notification handler code hereInvalidate(); 4.5、Chape

26、类 由自己创建,主要用于保存线条的颜色,线宽,填充色等属性,在窗口重绘时起重要作用。名称属性说明m_flag数据成员用于选择图形的类型(直线,矩形,椭圆等)m_lMouseDown数据成员用于判断鼠标按下的消息响应m_ptEnd数据成员画图的终点m_ptOrigin数据成员画图的起点m_fColor数据成员填充色选择m_color数据成员画笔颜色选择m_LineWidth数据成员线宽选择m_LineStyle数据成员线条风格选择部分源代码:CShape:CShape(CPoint p1, CPoint p2, UINT ps, int pw, COLORREF cl,COLORREF c2)t

27、his-m_ptOrigin = p1;this-m_ptEnd = p2;this-m_LineStyle = ps;this-m_LineWidth = pw;this-m_color = cl; this-m_fColor = c2; 4.6、CLine,CCLine,CCircle,CEllipse,CRectangle,CRoundRect类 由自己创建,由自己创建,它们都是由Chape类派生出来,用于绘制各种不同类型的图形,颜色,线条等属性均取自于Chape类。部分源代码:void CLine:Draw(CDC *pDC)CPen pen(m_LineStyle, m_LineWi

28、dth, m_color);pDC-SelectObject(&pen);CBrush brush(m_fColor);pDC-SelectObject(&brush); pDC-MoveTo(m_ptOrigin.x,m_ptOrigin.y); pDC-LineTo(m_ptEnd.x,m_ptEnd.y);void CEllipse:Draw(CDC *pDC)CPen pen(m_LineStyle, m_LineWidth, m_color);pDC-SelectObject(&pen);CBrush brush(m_fColor);pDC-SelectObject(&brush);

29、 pDC-Ellipse(CRect(m_ptOrigin,m_ptEnd);void CCircle:Draw(CDC *pDC) CPen pen(m_LineStyle, m_LineWidth, m_color);pDC-SelectObject(&pen);CBrush brush(m_fColor);pDC-SelectObject(&brush);pDC-Ellipse(m_ptOrigin.x,m_ptOrigin.y,m_ptEnd.x,m_ptOrigin.y+m_ptEnd.x-m_ptOrigin.x); 流程图:程序运行选择哪个画图工具调用OnMouseMove()鼠

30、标左键按下在屏幕显示所画线条调用OnLButtonUp()再画一次鼠标左键弹起画图结束 画 画 画 画 铅 直矩 圆 椭 笔 线形 角 圆 矩 形6、功能测试图6-1 铅笔工具测试图图6-2 画直线测试图图6-3 画矩形测试图图6-4 画椭圆测试图图6-5 颜色及填充色设置测试图8、 关键源代码1) 在“MainFrm.h”中,在class CMainFrame : public CFrameWnd里的protected下定义: CToolBar m_wndToolBar; /工具栏 在 public下定义:CStatusBar m_wndStatusBar; /此函数可实现在状态栏显示光标所

31、在位置的坐标CString str;str.Format(x=%d,y=%d,point.x,point.y);/得到框架类窗口的指针GetParent(),然后指针强制转换为框架类的类型(CMainFrame*)/调用状态栏类的成员函数setWidnowText(CMainFrame*)GetParent()-m_wndStatusBar.SetWindowText(str);9、使用手册由于本程序使用比较简单,现在只作一些的使用介绍.下面是程序打开的初始界面:图6-6 程序主体图菜单与工具栏,工具栏可以快捷选择要使用的画笔 图6-7 菜单栏及工具栏此功能与工具栏的一样,只是工具栏那里会比较方便选择 图6-8 绘图工具栏线条类型对话框,颜色设置请参考图6-8 颜色设置测试图图6-12 线宽、线型设置 图6-13 右键弹出菜单专心-专注-专业

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁