




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录:一、设计目的2二、需求分析2三、运行环境2四、功能要求2五、总体设计31.根据题目,得到系统功能模块图 32. 程序流程图43图形类图54关键代码6六、测试过程131.实际完成的情况132.程序的性能分析133.上机过程中出现的问题及其解决方案134.程序中可以改进的地方说明135.程序中可以扩充的功能及设计实现构想146系统测试14七、设计总结16八、系统使用手册17九、参考文献20十、附录21一、设计目的利用Visual C+设计二维平面图形:可通过菜单或者工具栏按钮,选择绘画工具,画不同的平面图形(直线、圆弧、矩形、圆角矩形、圆、椭圆等);可通过颜色对话框选择不同的颜色,使所画的图形具有不同颜色;可保存文档所画的图形,并能打开该图形。二、需求分析1 选作这个二维图形的设计题目,主要是基于了解在电脑上的画图软件的功能是如何实现的,以及在MFC平台是怎么实现功能调用的,实现图形的绘制,从而可以进一步的了解到c+是如何面向对象的程序设计,以及在我们平常使用的一些软件的一些功能实现的算法。在一些基本的菜单如:文件菜单、编辑菜单、工具菜单、还有窗口菜单都是如何实现的。熟练掌握类的继承、多态和构造函数,以及在VC+6.0的软件的一些扩展功能。了解编程的实际用处,增加对编程更深入的了解,对自己所学的知识更加深入的学习与掌握。2 通过本次实验主要实现一些画图的基本功能,本程序可以通过菜单栏或工具栏进行图形的绘制,本程序可以绘制直线、圆弧、矩形、圆角矩形、圆、椭圆等。图像的颜色可以通过编辑框选择,也可以自定义颜色。笔画的线性有实线型、虚线型、点画线,也可以自己设定并且设定笔画的宽度(当然必须要大于0),在对话框可以显示你选择的线性。还可以进行撤销功能和全部删除功能。在完成后可以将自己的作品保存起来,并且能够打开。为了达到以上所叙述的优点及功能,我使用VC开发平台,MFC框架实现一个画图程序,尽可能多的实现Windows自带的画图功能,并扩展其功能。并且优化界面,绘图方便。三、运行环境操作系统Microsoft Windows四、功能要求1能够用鼠标操控方式,绘制直线、圆弧、矩形、圆角矩形、圆、椭圆2. 在绘图时,选择绘制某种图像后(如直线),在画布中按住鼠标左键后移动鼠标,在画布中实时的根据鼠标的移动显示相应的图形。在松开鼠标左键后,一次绘图操作完成3编辑图像的颜色可,以通过编辑框选择,也可以自定义颜色4笔画的线性有实线型、虚线型、点画线,也可以自己设定并且设定笔画的宽度(宽度大于0),在对话框可以显示选择的线性和线宽5.可以以矢量图方式保存绘制的图形。6. 可以读取保存的矢量图形文件,并显示绘图的结果。 7. 有画直线、圆弧、矩形、圆角矩形、圆、椭圆的工具箱。8. 有颜色选择工具箱。9. 在鼠标移向一工具不动时,有工具的功能提示。五、总体设计1.根据题目,得到系统功能模块图 填充调色板自定义设置画图椭圆圆正方形直线圆弧矩形圆角矩形线条调色板线宽线性W1W2W3编辑颜色文件保存所画的图形打开图形查看工具栏状态栏画图栏二维平面图形设计程序图1 系统功能图2.程序流程图选择线型圆弧矩形圆角矩形椭圆圆直线正方形选择颜色选择线宽开始选择绘图工具绘图关闭保存?保存是结束否图2 系统流程图3.图形类图SaveFile(CMetaFileDC *pDC)Draw(CDC *pDC)class Square 设置起点SetStartPoint(CPoint ptStart) 设置终点SetEndPoint(CPoint ptEnd) Update()更新属性,在SetEndPoint之后调用 设置画笔颜色SetPenColor(COLORREF crColor) 设置画笔宽SetPenWidth(int nWidth) 设置画笔风格SetPenStyle(int nStyle) 设置画刷填充风格SetBrushIndex(int nIndex) 设置画刷颜色SetBrushColor(COLORREF crColor) 设置参考点SetOriginRef(CPoint p t)移动时更新坐标属性MoveUpdate(CPoint pt) 画图操作Draw(CDC *pDC) Serialize(CArchive &ar);SetBrushFill(bool bFill); 保存所所画的图形SaveFile(CMetaFileDC *pDC)class CShape : public CObject BOOL m_bBIndex 画笔类型m_nPenStyle 画笔宽度m_nPenWidth 画笔颜色m_crPenColor 画刷颜色m_crBrushColor 画刷类型m_nBrushIndex 最小矩形CRect m_rect 记录图元的第一点和最后一点m_ptStart,m_ptEnd BOOL m_BrushFill画刷是否填充Draw(CDC *pDC)SaveFile(CMetaFileDC *pDC)class CCircle Draw(CDC *pDC);SaveFile(CMetaFileDC *pDC)class CRectangle Draw(CDC *pDC); SaveFile(CMetaFileDC *pDC)class CLine SaveFile(CMetaFileDC *pDC)Draw(CDC *pDC);class CArc class CEllipse Draw(CDC *pDC)SaveFile(CMetaFileDC *pDC)SaveFile(CMetaFileDC *pDC);Draw(CDC *pDC);class CRoundRect 元文件设备上下文类CMetaFileDC m_dcMetaFile;所画图形类型m_nDrawType; 画线类型m_nLineStyle;画线宽度m_nLineWidth; 画线颜色m_Color;/保存颜色画笔颜色,画刷颜色m_crPenColor,m_crBrushColor 画刷类型m_nBrushIndex; / BOOL m_bBIndex;BOOL m_bFill; BOOL m_bDrawing;/是否在画CShape *m_pShape;/定义一个基类指针POSITION m_Pos;/存放被选中图元在链表中的位置class CGraphic1View : public CViewvoid OnLButtonDown(UINT nFlags, CPoint point);void OnLine(); void OnEllipse(); void OnRectangle();void OnMouseMove(UINT nFlags, CPoint point);void OnLButtonUp(UINT nFlags, CPoint point);void OnDlgColor(); void OnSetting();void OnFont();void OnCircle(); void OnSquare();void OnFileSaveAs();void OnWidth1();void OnWidth2();void OnWidth3();void OnLinewidth();void OnSettingLW();void OnFillcolor();void OnArc();void OnRoundrect(); void OnFileOpen();void OnFileSave();void OnDraw(CDC* pDC);class CSittingDlg : public CDialog/设置线型、线宽、颜色对话框颜色m_Color 线宽m_nLineWidth线型m_nLineStyle 画刷 m_nbrushvoid OnChangeEditlinewidth();/自定义线宽void OnRadio1();/线宽1void OnRadio2();/线宽2void OnRadio3();/线宽3void OnPaint();HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);/设置4.关键代码(1)实现用画笔画图:/*根据m_nDrawType的值判断选择画图的形状,使用画笔进行画图*/switch(m_nDrawType)case TYPE_LINE: /直线m_pShape=new CLine();break;case TYPE_ARC: /圆弧m_pShape=new CArc();break;case TYPE_RECTANGLE: /矩形m_pShape=new CRectangle();break;case TYPE_SQUARE: /正方形m_pShape=new CSquare();break;case TYPE_ROUNDRECT: /圆角矩形m_pShape=new CRoundRect();break;case TYPE_ELLIPSE: /椭圆m_pShape=new CEllipse();break;case TYPE_CIRCLE: /圆m_pShape=new CCircle();break;(2)调色板的使用/编辑自定义线条颜色void CGraphic1View:OnDlgColor() / TODO: Add your command handler code hereCColorDialog cDlg; /调用MFC的颜色对话框cDlg.m_cc.Flags|=CC_RGBINIT|CC_FULLOPEN;/m_cc是choosecolor的结构图,CC_FULLOPEN将颜色板完全打开cDlg.m_cc.rgbResult=m_Color;/rgbresult指示用户的颜色选择if(IDOK=cDlg.DoModal()m_Color=cDlg.m_cc.rgbResult;/设置选项响应函数void CGraphic1View:OnSetting() / TODO: Add your command handler code hereCSittingDlg dlgSetting; /设置对话框类对象dlgSetting.m_nLineWidth=m_nLineWidth;/设置线宽dlgSetting.m_nLineStyle=m_nLineStyle;/设置线型dlgSetting.m_Color=m_Color;/设置颜色if(IDOK=dlgSetting.DoModal()m_nLineWidth=dlgSetting.m_nLineWidth;m_nLineStyle=dlgSetting.m_nLineStyle; (3) 使用链表管理图元实现重绘CObList是一个用于存储对象的链表,它可以储存CObject 及其派生类的对象。它存储的是对像的指针。CObList 类提供共了加入对象、删除对象、查找对象等一系列的方法,使用这些方法,我们可对图元进行一些简单的操作。CObList对象最好定义在CDoc类中,这样方便我们今后的串行化。CObList对象定义在CDoc中,我们就不能在CView类中直接使用,这时我们可以通过CView类中的GetDocument ( ) 函数获取CDoc 类的指针,我们通过指针就可以访问CDoc中的CObList对象。在画图时,当鼠标左键抬起时,我们可以认定图元绘制完毕,所以,在鼠标左键抬起的时候,我们可以将画好的图元加入链表中。在CDoc类中定义CObList对象m_listShape; 在鼠标左键抬起的消息响应函数中加入如下代码: CGraphic1Doc *pDoc=GetDocument();if (m_bDrawing & m_pShape)m_pShape-SetEndPoint(point);pDoc-m_listShape.AddTail(m_pShape); /图元加入链表m_pShape = NULL;m_bDrawing = FALSE;Invalidate(); /刷新每个一完成的图元都存放在链表中,我们可以通过一些查找的方法,随时将他们取出使用。例如,为了实现现场的保护,我们可以在OnDraw (CDC *pDC ) 函数中,我们可以遍历整个链表,将其全部取出,重绘出来。 在OnDraw (CDC *pDC)中重绘所有图元 :CGraphic1Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/重绘所有图元CObList *pListObj = &( GetDocument()-m_listShape ); /获取链表的地址POSITION pos = pListObj-GetHeadPosition(); /得到链表头的位置while (pos!=NULL)CShape* pShape = (CShape*)pListObj- GetNext(pos); /获取下一个图元的指针pShape-Draw(pDC); /画图在使用链表的时候,我们的图元对象都是动态创建的,图元被删除后或是程序退出的时候,一定要把他们析构掉,否则会造成内存泄漏。析构可以在CDoc类的析构函数中进行。 /析构,防止内存泄露POSITION pos=m_listShape.GetHeadPosition();while(pos)delete m_listShape.GetNext(pos);/释放内存空间m_listShape.RemoveAll();(4)串行化为了使我们的类可以串行化,我们要做如下工作: 我们可以为我们的自定义类的定义中添加DECLARE_SERIAL(类名) 在.cpp文件中加上IMPLEMENT_SERIAL(类名,基类名,版本号) 编写Serialize函数,将需要的信息串行化。 在基类CShape 添加宏定义: 在头文件中 class CShape : public CObject DECLARE_SERIAL(CShape) public: ; 在实现部分 IMPLEMENT_SERIAL(CShape,CObject,1) CShape:CShape() 派生类也类似。 编写CShape 的Serialize函数: 添加虚函数 virtual void Serialize( CArchive& ar ); void CShape:Serialize(CArchive &ar)CObject:Serialize( ar );if (ar.IsStoring()ar m_nPenWidth m_nPenStyle m_crPenColor;ar m_nBrushIndex m_crBrushColor;ar m_ptStart m_nPenWidth m_nPenStyle m_crPenColor;ar m_nBrushIndex m_crBrushColor;ar m_ptStart m_ptEnd;Update();派生类中的Serialize函数: 如果不用串行化新的信息,可以使用CShape类的串行化函数。 (5)图片的保存和打开通过和CFile类的配合,实现了对可序列化对象(Serializable Objects,这个概念后面描述)的文件读写。CFile是MFC类库中所有文件类的基类。所有MFC提供的文件I/O功能都和这个类有关。在实际的使用中,我们可以使用CFileDialog 对话框获取文件的完整文件名,然后用CFile 类打开文件进行读写。使用的CObList(“建立链表”)也是支持串行化的,其中提供了串行化函数Serialize,这个函数可以将链表中所有的对象串行化,前提是这些对象都支持串行化。我们这个函数就能很方便的实现图元的串行化。 实现读操作的代码如下:void CGraphic1View:OnFileOpen() / TODO: Add your command handler code here Invalidate();CString fileExtention (Windows picture (*.bmp) | *.bmp|);CFileDialog dlg(TRUE, .bmp, NULL,OFN_ALLOWMULTISELECT|OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, fileExtention, this);/打开多个文件CString filename;if(dlg.DoModal() = IDOK )filename= dlg.GetFileName();/获取文件的完整文件名if(filename.IsEmpty()return;CFile file;file.Open(filename,CFile:modeRead,NULL);CArchive ar(&file,CArchive:load);CGraphic1Doc* pDoc= GetDocument();pDoc-m_listShape.Serialize(ar);ar.Close();file.Close();Invalidate();实现读操作的代码如下:CString fileExtention (Windows picture (*.bmp) | *.bmp|ALL Files (*.*)|*.*|);/文件过滤器CFileDialog dlg(FALSE, .bmp, NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, fileExtention, NULL);if(dlg.DoModal() = IDOK )CString filename = dlg.GetFileName();CFile file;/定义文件对象if(!file.Open(filename,CFile:modeWrite|CFile:modeCreate,NULL) /以写方式打开文件return;CArchive ar(&file,CArchive:store); /构建CArchive 对象CGraphic1Doc* pDoc= GetDocument(); pDoc-m_listShape.Serialize(ar);/调用串行化函数ar.Close();/写完毕,关闭文件流 file.Close(); Invalidate(); (6) OnLButtonDown代码:void CGraphic1View:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultm_nBegin=point;switch(m_nDrawType)case TYPE_LINE: /绘制直线m_pShape=new CLine();break;case TYPE_ARC: /绘制圆弧m_pShape=new CArc();break;case TYPE_RECTANGLE: /绘制矩形m_pShape=new CRectangle();break;case TYPE_SQUARE: /绘制正方形m_pShape=new CSquare();break;case TYPE_ROUNDRECT: /绘制圆角矩形m_pShape=new CRoundRect();break;case TYPE_ELLIPSE: /绘制椭圆m_pShape=new CEllipse();break;case TYPE_CIRCLE: /绘制圆m_pShape=new CCircle();break;if(m_pShape != NULL )/设置图元的属性m_pShape-SetStartPoint(point); /设置起点 m_pShape-SetEndPoint(point); /设置终点,开始时与起点相m_pShape-SetPenStyle(m_nLineStyle); /设置画笔类型m_pShape-SetPenWidth(m_nLineWidth); /设置画笔线宽m_pShape-SetPenColor(m_Color); /设置画笔颜色m_pShape-SetBrushIndex(m_bBIndex); /设置画刷类型m_pShape-SetBrushColor(m_crBrushColor); /设置画刷颜色m_bDrawing = TRUE;/处于画图的过程中CView:OnLButtonDown(nFlags, point); (7)OnMouseMove代码:void CGraphic1View:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCDC *pDC=GetDC();int oldPen=pDC-SetROP2(R2_NOTXORPEN);if (m_bDrawing & m_pShape) m_pShape-Draw(pDC); /重画,擦除用m_pShape-SetEndPoint(point); /设置新的终点m_pShape-Draw(pDC); /绘新图元pDC-SetROP2 (oldPen); /还原CString str;str.Format (_T(%d,%d),point.x,point.y); (CMainFrame*)GetParent()-GetMessageBar()-SetWindowText(str);/在状态栏显示当前画面坐标CView:OnMouseMove(nFlags, point); (8)OnLButtonUp代码:void CGraphic1View:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultm_nEnd=point;CGraphic1Doc *pDoc=GetDocument();if (m_bDrawing & m_pShape)m_pShape-SetEndPoint(point);pDoc-m_listShape.AddTail(m_pShape); /图元加入链表m_pShape = NULL;m_bDrawing = FALSE;Invalidate(); /刷新CView:OnLButtonUp(nFlags, point); (9)OnDraw代码:void CGraphic1View:OnDraw(CDC* pDC)CGraphic1Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/重绘所有图元CObList *pListObj = &( GetDocument()-m_listShape ); /获取链表的地址POSITION pos = pListObj-GetHeadPosition(); /得到链表头的位置while (pos!=NULL)CShape* pShape = (CShape*)pListObj- GetNext(pos); /获取下一个图元的指针pShape-Draw(pDC); /画图/ TODO: add draw code for native data here 六、测试过程:1.实际完成的情况 实际完成了设计要求的基本任务,可通过菜单或者工具栏按钮,选择绘画工具,画不同的平面图形(直线、圆弧、矩形、圆角矩形、圆、椭圆等);可通过颜色对话框选择不同的颜色、线型、线宽,使所画的图形具有不同颜色、线型、线宽;可保存文档所画的图形,并能打开该图形。除此,我在程序中加了画刷功能(填充为线性)。2.程序的性能分析程序的功能简单,算法简单,性能应该还可以。继承关系很简单,就有一个基类CShape和几个派生类,程序比较稳定。CShape为虚基类,实现多态。测试过程中发现了不合适或不相容的类型说明;有的指针未初始化,导致出现上溢、下溢和地址异常等问题,并逐个予以解决,保证了临时存储在模块内的数据在程序执行过程中完整、正确;有的变量无初值;有的变量初始化或缺省值有错;有的变量名不正确的。通过调试程序逐步解决了这些问题。3.上机过程中出现的问题及解决方案 问题1.窗口重绘的问题 在画完图形时,当改变窗口的大小改变时,所获得图形会消失。解决方案是在OnDraw里进行图形的重绘,不过要先将所获得图形的对象保存下来,可以用动态链表保存图形对象,在OnDraw中遍历链表重绘所有的图形。问题2.颜色对话框在对话框中响应ON_PAINT消息时,增加了OnPaint()函数进行绘制线条,在组框控件中显示,线条的宽度变了或者线条的类型变了,组框中的绘制直线及时发生变化。而在运行后当改变线宽或者线条类型时,没有发生变化。进行单步调试,发现线宽的变量没有得到值,经学习孙鑫老师的视频知道,在OnPaint()函数中增加了UpdateData();此函数是将控件中发生变化的值及时地传递给响应得变量,最终解决了。问题3.图形的保存和打开问题按照Visual C+/MFC入门教程,最后终于实现了图元对象的串行化。不过在打开一个新的图形的时候原来的图形不会消失。问题4.橡皮筋技术的实现起初画的图形画图的过程不能事实时显示,后来查了一下,要用橡皮筋技术。解决方法是在OnMouseMove中实现所画图形的实时更新。4.程序中可以改进的地方说明 1)保存功能只能保存为BMP格式,也只能打开BMP文件,可以改进成能打开和保存多种类型的文件。 2)在画图的速度过快的时候会闪,图形的绘制过程不是很友好。 3)图元的移动和删除等都没有实现,功能不完整。 4)程序的绘图区的大小不能动态的改变,没有实现滚动条功能。 5) 程序中未实现鼠标右键和快捷键的功能。 可以改进的地方还有很多,这里就不一一列举了。5.程序中可以扩充的功能及设计实现构想 本程序实现的功能非常简单。没有实现铅笔的功能,铅笔的画法非常简单,但在其保存时遇到了问题,所有没有实现。此外还可以加上图元的移动与删除的功能,移动的过程应该是不断的擦除原来的图形再画新图的过程。也可以加上橡皮擦功能,我设想应该是用背景色填充来实现。目前的程序利用图元的串行化只能将图片保存为BMP格式,也只能打开BMP格式的文件,以后可以扩充让其实现能打开和保存多种格式的文件。图形的复制、剪切、粘贴等基本功能也没有实现。所画图形的种类也比较少,图形的绘制过程不是很友好。程序中未实现鼠标右键和快捷键的功能,也有待实现。还有很多很多的地方需要扩充或修改。6系统测试1.测试方法 由于软件错误的复杂性,软件测试需要综合应用测试技术,软件测试步骤为单元测试、集成测试、确认测试和系统测试。 单元测试是对源程序中每一个程序单元进行测试,检查各个模块是否正确实现了规定的功能,从而发现模块在编码中或算法中的错误。该阶段涉及编码和详细设计的文档。各模块经过单元测试后,将各模块组装起来进行集成测试,以检查与设计相关的软件体系结构的有关问题。确认测试主要检查已实现的软件是否满足需求规格说明书中确定的各种需求。系统测试将已确定的软件与其他系统元素(如硬件、其他支持软件、数据和人工等)结合在一起进行测试。 2. 基本功能 在窗口中可以绘制七种基本图形,直线、圆弧、矩形、正方形、圆角矩形、圆、椭圆;默认画笔的颜色为红色,线条类型为实线,线宽为1;可以使用鼠标进行拖动,改变图形的大小。在左边的工具条中可进行选择。在设置内可以设置线宽,颜色,线型(虚线和点线由于分辨率问题只能在线宽为1是可以看清楚)。2.点击画图中自定义、颜色或工具栏颜色设置,可弹出下
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025四川南充遴选农业技术指导员、农业机械指导员考试参考试题及答案解析
- 2025下半年云南轻纺职业学院招聘9人备考考试题库附答案解析
- 2025年甘肃省平凉市庄浪县考核招聘农村订单定向医学生76人考试参考试题及答案解析
- 2025广西河池市住房保障和房产管理中心招聘工作人员1人备考考试题库附答案解析
- 丰城市某公司门卫招聘备考考试题库附答案解析
- 2025上海浦东新区医疗急救中心招聘35人考试备考题库及答案解析
- 2025山东威海市复退军人康宁医院招聘6人备考考试题库附答案解析
- 2025湖州南浔区浙江兴上合城市开发集团有限公司子公司招聘18人备考考试题库附答案解析
- 2025四川泸州市农业农村局招聘编外人员2人备考考试题库附答案解析
- 骨科骨折患者术后护理措施
- 工业机器人检查表
- JGJ107-2016钢筋机械连接技术规程
- DL∕ T 1195-2012 火电厂高压变频器运行与维护规范
- 学前儿童英语教育与活动指导(学前教育专业)全套教学课件
- 肿瘤疗效评估新标准mRECIST标准
- 网络热梗是否融入现实生活
- 乐乐课堂版奥数三年级
- 口腔疾病的预防与治疗措施
- 汽车机械基础 课件 绪论
- 客车检车员-中国铁路兰州局集团有限公司编
- 胖东来收银管理制度
评论
0/150
提交评论