简单的绘图程序实验报告_第1页
简单的绘图程序实验报告_第2页
简单的绘图程序实验报告_第3页
简单的绘图程序实验报告_第4页
简单的绘图程序实验报告_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

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

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

4、块的大部份功能都写在了CDrawView类里面。该模块也是此次程序的重点模块之一,主要负责画一些简单图形,例如:直线、矩形、圆角矩形、椭圆、任意曲线(铅笔)等等;有线型、线宽的设置;还有画笔颜色和填充色的选择,可以画各种各样颜色的线条;还包含的右键菜单设置的函数。 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_c

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

7、e()成员函数鼠标移动响应函数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 = point;/临时点m_l

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

9、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 )/初始化CClientDC

10、 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,m_color);dc.

11、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,m_fColor);pDo

12、c-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( m_ptOld );/

13、上次鼠标移动到的位置之间的临时线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: /画圆角矩形dc.SetROP

14、2( 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,point);break

15、;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);/恢复先前的画笔m_p

16、tOld = 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_lMouseDown =

17、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.SetROP2( R2_COPY

18、PEN );/使用当前的画笔的颜色 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);break;case 5:

19、/画圆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 = m_ptOrigin

20、 + 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(m_ptOrigin,p

21、oint,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-SetModifiedFlag();

22、/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)TR

23、ACE0(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);/ Do not ca

24、ll 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() / TODO: If this i

25、s 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)this-m_ptOrigi

27、n = 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_LineWidth, m_color)

28、;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); pDC-Ellipse(CRect(m_ptOrigin,m_p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论