ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:305.27KB ,
资源ID:8623009      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8623009.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(简单的绘图程序实验报告.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

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()函数实现线宽的改变。再在CDrawView类中调用OnLine

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

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

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

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

7、etting()成员函数画笔设置对话框响应函数部分源代码:void CDrawView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default if(m_flag=0) SetCapture(); :SetCursor(m_hCross); m_ptOrigin = point; m_lMouseDown = true; else m_ptOrigin = point; m_ptOld = point;/临时点 m_lMouseDown = t

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

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

10、tDC 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

12、_color,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 ); /这两

13、行代码擦除从起点到 dc.LineTo( 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_p

14、tOrigin,point); break; case 3: /画圆角矩形 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_ptO

15、rigin,m_ptOld); dc.Ellipse(CRect(m_ptOrigin,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_pt

16、Origin.x); break; /switch 结束 dc.SelectObject(pOldPen);/恢复先前的画笔 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 default if(m_flag=0) if( m_lMouseDown ) m_lMouseDown = false; Rel

17、easeCapture(); ClipCursor( NULL ); else if( m_lMouseDown ) m_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);

18、ReleaseCapture(); ClipCursor( NULL ); switch(m_flag) case 1: /画直线 dc.SetROP2( 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);

19、 break; case 4: /画椭圆 dc.SetROP2( R2_COPYPEN ); dc.Ellipse(CRect(m_ptOrigin,point); break; 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();

20、/得到文档类指针 CShape *pShape ; CPoint ptOrg; ptOrg = GetScrollPosition(); / 获得当前工作区原点的坐标 m_ptOrigin = 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 CRectangl

21、e(m_ptOrigin,point,m_vLineStyle, m_vLineWidth,m_color,m_fColor); break; case 3: pShape = new CRoundRect(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 CCirc

22、le(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_VISI

23、BLE | CBRS_LEFT | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) | !s_ShapeToolBar.LoadToolBar(IDR_SHAPETOOLBAR) TRACE0(Failed to create toolbarn); return -1; / fail to create int nCount =s_ShapeToolBar.GetToolBarCtrl().GetButtonCount();/设置工具条按钮能被按下并且弹起 for(int i=0;iGetWindowRect(rec

24、t); ScreenToClient(rect); dc.MoveTo(rect.left+20,(rect.top+rect.bottom)/2); dc.LineTo(rect.right-20,(rect.top+rect.bottom)/2); / Do not call CDialog:OnPaint() for painting messagesvoid CLineSettingDlg:OnSelchangeLineStyle() / TODO: Add your control notification handler code here int index = (CComboB

25、ox*)GetDlgItem(IDC_LINESTYLE)-GetCurSel(); m_LineStyle = index; Invalidate();void CLineSettingDlg:OnChangeEditLineWidth() / TODO: If this is a RICHEDIT control, the control will not / send this notification unless you override the CDialog:OnInitDialog() / function and call CRichEditCtrl().SetEventMa

26、sk() / with the ENM_CHANGE flag ORed into the mask. / TODO: Add your control notification handler code here Invalidate(); 4.5、Chape类 由自己创建,主要用于保存线条的颜色,线宽,填充色等属性,在窗口重绘时起重要作用。名称属性说明m_flag数据成员用于选择图形的类型(直线,矩形,椭圆等)m_lMouseDown数据成员用于判断鼠标按下的消息响应m_ptEnd数据成员画图的终点m_ptOrigin数据成员画图的起点m_fColor数据成员填充色选择m_color数据成员画笔颜色选择m_LineWidth数据成员线宽选择m_LineStyle数据成员线条风格选择部分源代码:CShape:CShape(CPoint p1, CP

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

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