首页 Visual C 设计二维平面图形

Visual C 设计二维平面图形

举报
开通vip

Visual C 设计二维平面图形目录: 一、设计目的……………………………………………………………………………………………………………2 二、需求分析……………………………………………………………………………………………………………2 三、运行环境……………………………………………………………………………………………………………2 四、功能要求……………………………………………………………………………………………………………2 五、总体设计……………………………………………………………………………………………………………3 1.根据题目,得到系...

Visual C  设计二维平面图形
目录: 一、 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 目的……………………………………………………………………………………………………………2 二、需求 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 ……………………………………………………………………………………………………………2 三、运行环境……………………………………………………………………………………………………………2 四、功能要求……………………………………………………………………………………………………………2 五、总体设计……………………………………………………………………………………………………………3 1.根据题目,得到系统功能模块图  ………………………………………………3 2. 程序流程图…………………………………………………………………………………………………4 3.图形类图………………………………………………………………………………………………………5 4.关键代码………………………………………………………………………………………………………6 六、测试过程………………………………………………………………………………………………………………13 1.实际完成的情况……………………………………………………………………………………………13 2.程序的性能分析……………………………………………………………………………………………13 3.上机过程中出现的问题及其解决 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 ……………………………………………13 4.程序中可以改进的地方说明…………………………………………………………………13 5.程序中可以扩充的功能及设计实现构想………………………………………14 6.系统测试…………………………………………………………………………………………………………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.根据题目,得到系统功能模块图  图1 系统功能图 2.程序流程图 图2 系统流程图 3.图形类图 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 here CColorDialog 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 here CSittingDlg 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_ptEnd; } else { ar >> 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 default m_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 default CDC *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 default    m_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.测试方法 由于软件错误的复杂性,软件测试需要综合应用测试技术,软件测试步骤为 单元测试 部编版二年级下册第二单元测试题部编版二年级下册第二单元测试卷部编版二年级下册第二单元测试部编版二年级下册语文第二单元测试卷人教版七年级下册英语单元测试卷 、集成测试、确认测试和系统测试。 单元测试是对源程序中每一个程序单元进行测试,检查各个模块是否正确实现了规定的功能,从而发现模块在编码中或算法中的错误。该阶段涉及编码和详细设计的文档。各模块经过单元测试后,将各模块组装起来进行集成测试,以检查与设计相关的软件体系结构的有关问题。确认测试主要检查已实现的软件是否满足需求规格说明 关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf 中确定的各种需求。系统测试将已确定的软件与其他系统元素(如硬件、其他支持软件、数据和人工等)结合在一起进行测试。 2. 基本功能 在窗口中可以绘制七种基本图形,直线、圆弧、矩形、正方形、圆角矩形、圆、椭圆; 默认画笔的颜色为红色,线条类型为实线,线宽为1;可以使用鼠标进行拖动,改变图形的大小。在左边的工具条中可进行选择。在设置内可以设置线宽,颜色,线型(虚线和点线由于分辨率问题只能在线宽为1是可以看清楚)。 2.点击画图中自定义、颜色或工具栏颜色设置,可弹出下拉菜单颜色、线线宽、线型设置两个选项,选择颜色即可弹出颜色框 3.保存点击保存,弹出对话框 4.点击打开 七、设计总结 通过这次课程设计使我对可视化编程有了进一步的了解。了解了MFC的基本框架和怎样用MFC进行开发。熟悉了消息响应的一些常用函数。因为以前没有接触过MFC,在设计的过程中遇到了很多很多的问题。在解决问题的过程中,和同学商量、上网查、问老师等,学到了很多的东西。虽说程序实现的功能非常的简单,但自己仍然做了接近两个星期,从熟悉MFC到编码到调试,在做的过程中还要不断的修改,不断的增加功能,有时一个问题可能几天都解决不了,我的图形重绘和保存功能就做了很长的时间。在做的过程中我对C++的面向对象的思想有了更深的理解,所有的数据和方法都有封装在类的内部,而且一个类的设计非常重要。类之间的继承关系要理清楚。我对MFC的消息映射和各种响应事件有了初步了解,对窗口的初始化和重绘有了一些了解。我感觉这两周的课设天天泡在机房,有时候晚上不睡觉,埋头编码的感觉很好,虽说一天下来会很累,但觉得过的很充实。两周的课设转眼结束了,觉得时间过的很快,课设时间可能有些短,要是时间再长些我们可能能做出更好的程序,因为平时上课的时候很少有这种机会,也没有时间。总之这次课程设计很有意义,也学到了很多的东西,让我在今后更加注意了软件设计的过程。 八、系统使用手册 1. 本程序的基本功能: 在窗口中可以绘制七种基本图形,直线、圆弧、矩形、正方形、圆角矩形、圆、椭圆; 默认画笔的颜色为红色,线条类型为实线,线宽为1;可以使用鼠标进行拖动,改变图形的大小。在左边的工具条中可进行选择。在设置内可以设置线宽,颜色,线型(虚线和点线由于分辨率问题只能在线宽为1是可以看清楚)。并且能够将图形保存为BMP格式,能打开BMP格式的文件(只能打开自己绘制的图形)。 2.用户可以通过菜单项和左边的图形工具栏实现这些操作。 点击画图中线条调色板、填充调色板(线条填充)或设置 线宽中W1、W2、W3或自定义 保存点击保存,弹出对话框 点击打开  九、参考文献 【1】Visual C 孙鑫 视频讲解 【2】Visual C++/MFC入门教程. 【3】李兰,任凤华.C++面向对象程序设计.西安电子科技大学出版社.2010年9月 十、附录: Shape.h Shape.cpp Arc.h Arc.cpp Circle.h Circle.cpp Ellipse.h Ellipse.cpp Line.h Line.cpp Rectangle.h Rectangle.cpp RoundRect.h RoundRect.cpp Square.h Square.cpp Graphic1Doc.h Graphic1Doc.cpp Graphic1View.h Graphic1View.cpp MainFrm.h MainFrm.cpp resource.h SittingDlg.h SittingDlg.cpp StdAfx.h StdAfx.cpp
本文档为【Visual C 设计二维平面图形】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_003124
暂无简介~
格式:doc
大小:75KB
软件:Word
页数:0
分类:互联网
上传时间:2019-09-12
浏览量:17