1一实训目的(1)培养分析问题、解决问题的能力(2)培养考虑问题的周密性和逻辑思维能力(3)培养实际动手能力(4)培养C++知识的综合运用能力二实训任务和要求1.图形:带颜色的图形。(增加选色功能)线粗不同的图形。(修改线粗的功能)块状图。(图形的填充色和边线颜色可以不同,由用户选择)等等。。2.界面工具栏,状态栏,改变鼠标,查看窗口等等3.编辑在重新打开时和在正常情况下一样画图或者选中图形进行图形编辑。4.文件保存EMF文件,导入位图文件成为一个(由位图填充的)矢量矩形等等。5.编辑单个图像拖动,改变图形节点位置能够进行基本的图形绘制功能:直线,圆、矩形和多边形;数据保存功能,能够把图形数据保存到文件中;简单的编辑功能:改变线条和填充颜色以及线宽;三实训过程和内容3.1需求分析(1)认识C++编程软件C++是一种使用非常广泛的计算机编程语言。C++是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序2设计、制作图标等等泛型程序设计等多种程序设计风格。C++支持C语言的几乎全部功能,在语法上与C语言仅有极微妙的差别;C++语言原本不具备面向对象的设计功能,然而随着面向对象编程的概念的提出以及如Java等语言的发展成熟,C++语言也开发出了支持面向对象功能的版本,现在编程者常用的VC++就是一种面向对象的语言;C++强大(但容易失控的)模板功能使它能在编译期完成许多工作,从而大大提高运行期效率。STL(C++标准模板库,StandardTemplateLibrary);随着STL的不断发展,它已经逐渐成为C++程序设计中不可或缺的部分,其效率可能比一般的native代码低些,但是其安全性与规范性使它大受欢迎。(2)计算机图形的认识在计算机科学中,图形和图像这两个概念是有区别的:图形一般指用计算机绘制的画面,如直线、圆、圆弧、任意曲线和图表等;图像则是指由输入设备捕捉的实际场景画面或以数字化形式存储的任意画面。图像是由一些排列的像素组成的,在计算机中的存储格式有BMP、PCX、TIF、GIFD等,一般数据量比较大。它除了可以表达真实的照片外,也可以表现复杂绘画的某些细节,并具有灵活和富有创造力等特点,而与图像不同,在图形文件中只记录生成图的算法和图上的某些特点,也称矢量图。在计算机还原时,相邻的特点之间用特定的很多段小直线连接就形成曲线,若曲线是一条封闭的图形,也可靠着色算法来填充颜色。它最大的优点就是容易进行移动、压缩、旋转和扭曲等变换。3.2设计(1)C++程序中的应用程序对象(a)基于窗口的应用程序还是使用MFC比较多,所以主要介绍一下MFC。CWnd窗口:它是大多数“看得见的东西”的父类(Windows里几乎所有看得见的东西都是一个窗口,大窗口里有许多小窗口),比如视图CView、框架窗口CFrameWnd、工具条CToolBar、对话框CDialog、按钮CButton,etc;一个例外是菜单(CMenu)不是从窗口派生的。CDocument文档,负责内存数据与磁盘的交互。最重要的是OnOpenDocument(读入),OnSaveDocument(写盘),Serialize(读写)CView视图:负责内存数据与用户的交互。包括数据的显示、用户操作的响应(如菜单的选取、鼠标的响应)。最重要的是OnDraw(重画窗口),通常用CWnd::Invalidate()来启动它。另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。CDC设备文本:无论是显示器还是打印机,都是画图给用户看。这图就抽象为CDC。CDC与其他GDI(图形设备接口)一起,完成文字和图形、图像的显示工作。把CDC想象成一张纸,每个窗口都有一个CDC相联系,负责画窗口。CDC有个常用子类CClientDC(窗口客户区),画图通常通过CClientDC完成。CDialog:对话框CWinApp应用程序类:似于C中的main函数,是程序执行的入口和管理者,负责程序建立、消灭,主窗口和文档模板的建立。CGdiObject及子类:用于向设备文本画图。它们都需要在使用前选进DC。CPen笔:画线CBrush刷子:填充CFont字体:控制文字输出的字体CBitmap:位图3CPalette:调色板CRgn区域:指定一块区域可以用于做特殊处理。CFile文件:最重要的不外是Open(打开),Read(读入),Write(写)CString字符串:封装了C中的字符数组CPoint点:(x,y)对CRect矩形:(left,top,right,bottom)CSize大小:(cx,cy)对(宽、高)(b)MFC五大群组①GeneralPurposeclasses:提供字符串类、数据处理类(如数组与链表),异常情况处理类、文件类等。②WindowsAPIclasses:用来封装WindowsAPI,例如窗口类、对话框类、DC类等。③Applicationframeworkclasses:组成应用程序骨干类,即此组类,包括Dcoument/View、消息泵、消息映射、消息传递、动态创建、文件读写等等。④Highlevelabstractions:包括工具栏、状态栏、拆分窗口、滚动窗口等等。视觉性UI对象属于此类,例如工具栏CToolBar、状态栏CStatusBar、对话框列CDialogBar。加强型的View也属此类,如可滚动的ScrollView、以对话框为基础的CFormView、小型文字编辑器CEditView、树状结构的CTreeView,支持RTF文件格式的CRichEditView等等。⑤operationsystemextensions:包括OLE、ODBC、DAO、MAPI、WinSock、ISAPI等等。(2)文档对象、视图对象和框架对象在MFC中引入了文档-视图结构的概念,文档相当于数据容器,视图相当于查看数据的窗口或是和数据发生交互的窗口。因此一个完整的应用一般由四个类组成:CWinApp应用类,CFrameWnd窗口框架类,CDocument文档类,CView视类。在程序运行时CWinApp将创建一个CFrameWnd框架窗口实例,而框架窗口将创建文档模板,然后有文档模板创建文档实例和视实例,并将两者关联。一般来讲我们只需对文档和视图进行操作,框架的各种行为已经被MFC安排好了而不需人为干预,这也是设计文档-视结构的本意,让我们将注意力放在完成任务上而从界面编写中解放出来。在应用中一个视图对应一个文档,但一个文档可以包含多个视图。一个应用中只用一个框架窗口,对多文档界面来讲可能有多个MDI子窗口。每一个视图都是一个子窗口,在单文档界面中父窗口即是框架窗口,在多文档界面中父窗口为MDI子窗口。一个多文档应用中可以包含多个文档模板,一个模板定义了一个文档和一个或多个视图之间的对应关系。同一个文档可以属于多个模板,但一个模板中只允许定义一个文档。同样一个视图也可以属于多个文档模板。一般来说用户的输入/输出基本都是通过视图进行,但一些例外的情况下可能需要和框架直接发生作用。在使用菜单时大家会发现当一个菜单没有进行映射处理时为禁止状态,在多视图的情况下菜单的状态和处理映射是和当前活动视相联系的,这样MFC可以保证视他能正确的接收到各种消息,但有时候也会产生不便。有一个解决办法就是在框架中对消息进行处理,这样也可以保证当前文档可以通过框架得到当前消息。在用户进行输入后如何使视的状态得到更新?这个问题在一个文档对应一个视图时是不存在的,但是现在有一个文档对应了两个视图,当在一个视上进行了4输入时如何保证另一个视图也得到通知呢?MFC的做法是利用文档来处理的,因为文档管理着当前和它联系的视图,由它来通知各个视图是最合适的。例如:voidCView::OnUpdate(CView*pSender,LPARAMlHint,CObject*pHint)voidCDocument::UpdateAllViews(CView*pSender,LPARAMlHint=0L,CObject*pHint=NULL)当文档的UpdateAllViews被调用时和此文档相关的所有视图对象的OnUpdate都会被调用,而参数lHint和pHint都会被传递。那么还有一个问题:如何在OnUpdate中知道是那个视图发生了改变呢,这就可以利用pHint参数,只要调用者将this指针赋值给参数就可以了,当然完全可以利用该参数传递更复杂的结构。视图对象的初始化,当一个文档被打开或是新建一个文档时视图的CView::OnInitialUpdate()会被调用,你可以通过重载该函数对视图对象进行初始化,并在结束前调用父类的OnInitialUpdate,因为这样可以保证OnUpdate会被调用。文档中内容的清除,当文档被关闭时(比如退出或是新建前上一个文档清除)voidCDocument::DeleteContents()会被调用,你可以通过重载该函数来进行清理工作。在单文档结构中上面两点尤其重要,因为软件运行文档对象和视图对象只会被产生并删除一次。所以应该将上面两点和C++对象构造和构析分清楚。文档模板分为两类单文档模板和多文档模板,分别由CSingleDocTemplate和CMultiDocTemplate表示,模板的作用在于记录文档对象,视图对象,框架对象之间的对应关系。还有一点就是模板可以记录应用程序可以打开的文件的类型,当打开文件时会根据文档模板中的信息选择正确的文档和视图。当使用者通过视图对象修改了数据时,应该调用GetDocument()-SetModifiedFlag(TRUE)通知文档数据已经被更新,这样在关闭文档时会自动询问用户是否保存数据。(3)菜单设计(a)菜单的种类:①生成数据②插入排序③希尔排序④起泡排序⑤快速排序⑥选择排序⑦堆排序⑧归并排序(非递归)⑨归并排序(递归)⑩退出(b)工具条的实现例如,24位工具条的实现:①在mainframe.h文件中声明成员变量:CToolBarm_hotToolBar;在CMainFrame::OnCreate()中创建工具条,假设你已经创建了一个ToolBar资源和两个工具条位图(Bitmap)资源:IDB_TOOLBAR_COLD和IDB_TOOLBAR_HOT,前者表示的是常态按钮,而后者表示的是鼠标移到上面时的状态按钮。用下面的代码创建工具条:if(!m_hotToolBar.CreateEx(this,TBSTYLE_FLAT|TBSTYLE_LIST,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||!m_hotToolBar.LoadToolBar(IDR_HOTBAR)){TRACE0(Failedtocreatetoolbar\n);return-1;//failtocreate5}②在CMainFrame::OnCreate()中还要添加如下代码,它们实现对位图资源的存取://Setuphotbarimagelists.CImageListimageList;CBitmapbitmap;//Createandsetthenormaltoolbarimagelist.bitmap.LoadBitmap(IDB_TOOLBAR_COLD);imageList.Create(21,20,ILC_COLORDDB|ILC_MASK,13,1);imageList.Add(&bitmap,RGB(255,0,255));m_hotToolBar.SendMessage(TB_SETIMAGELIST,0,(LPARAM)imageList.m_hImageList);imageList.Detach();bitmap.Detach();//Createandsetthehottoolbarimagelist.bitmap.L