游戏设计基础与实践教程 教学ppt课件第4章 MFC编程基础.ppt
第四章 MFC编程基础,2,第四章 MFC编程基础,4.1 开发环境4.2 SDI相关知识4.3 鼠标与键盘4.4 GDI相关知识4.5 位图及其加载,4.6 对话框4.7 控件4.8 菜单4.9 集合类4.10 程序示例,4.1 开发环境,软件开发环境(Software Development Environment,SDE)是指在基本硬件和数字软件的基础上,为支持系统软件和应用软件的工程化开发和维护而使用的一组软件,简称SDE。由以下两部分构成: 软件工具 环境集成机制,3,4.1.1 了解开发平台,1. 应用程序向导 向导实质上是一个源代码生成器,利用应用程序向导可以快速创建各种风格的应用程序框架,自动生成程序通用的源代码,这样大大减轻了编写代码的工作量。 Visual C+集成开发环境包含了创建各种类型应用程序的向导,执行File菜单中的New命令即可看到向导类型。,4,4.1.1 了解开发平台,5,4.1.1 了解开发平台,6,4.1.1 了解开发平台,2. 引入应用程序类向导的目的 为了避免程序员重复编写这些代码,一般的可视化软件开发工具都提供了创建Windows应用程序框架的向导。,7,MFC APPWizardexe的功能如下: 1)MFC APPWizardexe是创建基于MFC的Windows应用程序的向导。当利用MFC APPWizardexe创建一个项目时,它能够自动生成一个MFC应用程序的框架;,4.1.1 了解开发平台,2. 引入应用程序类向导的目的 MFC APPWizardexe的功能如下: 2)即使不添加任何代码,当执行编译、链接命令后,Visual C+ IDE将生成一个Windows界面风格的应用程序。 3)MFC应用程序框架将那些每个程序都共同需要使用的代码封装起来。,8,4.1.1 了解开发平台,2. 引入应用程序类向导的目的 MFC APPWizardexe的功能如下: 4)MFC APPWizardexe向导提供了一系列选项,程序员通过选择不同的选项,可以创建不同类型和风格的MFC应用程序,并可指定不同的程序界面窗口。,9,4.1.1 了解开发平台,2. 引入应用程序类向导的目的 MFC APPWizardexe创建的应用程序的类型包括以下几种: 1)Single document:单文档界面应用程序。 2)Multiple documents:多文档界面应用程序。 3)Dialog based:基于对话框的应用程序。,10,4.1.2 类向导ClassWizard,ClassWizard可以完成的主要功能如下: 创建新类。进行消息映射。添加成员变量覆盖虚拟函数。,方法:ViewClassWizard选项,11,4.1.2 类向导ClassWizard,ClassWizard类向导提供了五个选项卡: Message Maps Member Variables Automation Active Events Class Info,12,4.1.2 类向导ClassWizard,Message Maps 选项卡,13,4.1.2 类向导ClassWizard,Member Variables选项卡,14,4.1.3 项目与项目工作区,1. 项目 项目名是项目中其他文件命名的基础,它的后缀名为 .dsp(Developer Studio Project)。,15,2. 工作区 项目工作区文件的后缀名为 .dsw(Developer Studio Workspace)。,4.1.3 项目与项目工作区,2. 工作区,工作区由ClassView、ResourceView 及 FileView三个面板组成,16,4.1.3 项目与项目工作区,ClassView,17,4.1.3 项目与项目工作区,ResourceView,18,4.1.3 项目与项目工作区,FileView,19,20,第四章 MFC编程基础,4.1 开发环境4.2 SDI相关知识4.3 鼠标与键盘4.4 GDI相关知识4.5 位图及其加载,4.6 对话框4.7 控件4.8 菜单4.9 集合类4.10 程序示例,4.2 SDI相关知识,22,新建一个名为Sample的工程在项目工作区的类视图,我们可以看到应用程序中已有五个类: CAboutDlg CMainFrame CSampleApp CSampleDoc CSampleView,4.2.1 新建一个SDI应用程序,23,4.2.1 新建一个SDI应用程序,MFC中几乎所有的类都以CObject作为基类,Sample程序中的五个类也不例外:CSampleApp负责应用程序的初始化;文档类CSampleDoc继承自CDocument,充当应用程序数据的容器;,24,4.2.1 新建一个SDI应用程序,MFC中几乎所有的类都以CObject作为基类,Sample程序中的五个类也不例外:CSampleView实现文档数据的可视化;CMainFrame为应用程序提供一个窗口;CAboutDlg:向导自动生成的“关于”对话框类。,25,4.2.2 文档视图结构,文档-视图结构是 MFC 模式的基本框架文档是数据元素的集合,并提供了管理和维护数据的手段。视图提供可视的数据显示,还提供了一个与文档中的数据交互的界面,它把用户的输入转化为对文档中数据。,26,4.2.2 文档视图结构,27,文档/视图结构的工作机制,28,文档类由CCmdTarget类派生,CDocument 类的一般方法,29,视图类,CView 的一般方法,CView 的主要虚拟方法,30,SDI程序示例,文档/视图结构功能如此强大,因此一般我们都首先使用AppWizard生成基于文档/视图结构的单文档或多文档框架程序。然后在其中添加自己的特殊代码,完成自己需要的功能。,31,一个显示钱币叠加的小程序,通过本例,来学习文档-视图结构的使用方法。建立一个SDI应用程序,在文档类添加关于钱币个数的数据,并在视图中图示化钱币及其数值;当改变了文档中的钱币数量后,视图上图示化的钱币也得得到实时更新,32,新建工程,并添加数据,利用MFC生成一个名为Coin的SDI工程在CCoinDoc中添加整型变量 m_Coin 来表示钱币数添加成员变量的方法有两种,一种是手工添加,另一种是利用向导来添加 手工方法,就是在CCoinDoc类声明中添加: public: int m_Coin; 向导方法,利用下图所示,33,利用向导添加成员变量,34,成员变量的初始化,根据C+的知识,一般情况下,类的成员变量的初始化是在类的构造函数中完成的。对于文档类,也可以在OnNewDocument()函数中添加成员变量的初始化代码: m_Coin=1;,35,文档数据的可视化,在CCoinView的OnDraw函数中编写代码实现钱币的可视化,即用文字显示钱币个数:,36,文档数据的可视化,在CCoinView的OnDraw函数中编写代码实现钱币的可视化,即用文字显示钱币个数,并用图形显示一摞钱币,添加OnAddCoin函数,37,视图更新,根据MFC中的文档视图机制,如果文档数据发生了变化,则所有的视图都必须被通知到,以便它们能够对所显示的数据进行相应的更新,它是通过:CDocument:UpdateAllViews() 函数来实现的,38,第四章 MFC编程基础,4.1 开发环境4.2 SDI相关知识4.3 鼠标与键盘4.4 GDI相关知识4.5 位图及其加载,4.6 对话框4.7 控件4.8 菜单4.9 集合类4.10 程序示例,39,鼠标与键盘是用户与应用程序交互的手段在MFC中,对鼠标和键盘的处理已经标准化了,只需在应用程序中添加事件,MFC自动生成相对应的处理接口,4.3 鼠标与键盘,40,常用的鼠标事件有: OnLButtonDblClk OnLButtonUp OnLButtonDown OnRButtonDblClk OnRButtonUp OnRButtonDown OnMouseMove,4.3.1 鼠标事件,41,程序示例,还是以上一节的硬币程序为例,来学习在程序中添加鼠标事件我们可以不用点击菜单,而是点击鼠标来更改文档中的硬币数据:单击鼠标左键增加硬币,单击鼠标右键减少硬币,42,在程序中添加鼠标事件,利用平台提供的向导,在CCoinView上单击右键,就会出现右图所示菜单,选中“Add Windows Message Handler”:,43,从事件列表中选择鼠标事件,44,消息处理接口,点击上页右边的”Add and Edit”按钮,就会在CCoinView中出现消息处理函数:,同理,添加鼠标右键单击事件,45,在生成的函数中添加自己的代码,点击鼠标左键,则钱币数加1,即要把文档中的成员变量m_Coin += 1:,46,更新与重绘,在 OnLButtonDown() 函数中添加语句 pDoc-UpdateAllViews(NULL);来实现更新与重绘。其实,在视图类中有一个函数也可以实现相同的功能,即重绘函数 void Invalidate( BOOL bErase = TRUE );,47,在键盘上按下或释放某一个键,同样也会触发某一个对应的消息在类视图中的 CCoinVIew 类上点击右键,选择 “Add Windows Message Handler”,在出现的事件列表中有WM_KEYDOWN和WM_KEYUP,可以选择其中一个,4.3.2 键盘事件,48,程序示例,在硬币程序中添加键盘事件首先添加WM_KEYDOWN事件处理接口,得到,49,具体代码,50,第四章 MFC编程基础,4.1 开发环境4.2 SDI相关知识4.3 鼠标与键盘4.4 GDI相关知识4.5 位图及其加载,4.6 对话框4.7 控件4.8 菜单4.9 集合类4.10 程序示例,51,GDIGraphics Device Interface 图形设备接口负责系统与用户或绘图程序之间的信息交换,并控制在输出设备上显示图形或文字,4.4 GDI相关知识,52,GDI包括的范围很广,具体有以下功能:绘制点、线、矩形、椭圆、多边形等几何图形;显示BMP等多种格式的图像,并能对图像进行拉伸、缩小、裁剪、旋转、改变透明度等操作;可以设置多种字体来显示文字;可以设置画笔和画刷的属性;可以设置不同类型的坐标系。,4.4 GDI相关知识,53,4.4.1 CGdiObject类的派生类,CBitmap:用于管理、绘制位图资源的类;CPen:用于管理线条绘制的类,通过CPen类对象,可以设置绘图时的线型、线条宽度、颜色等属性;CBrush:定义了画刷,通过CBrush类对象,可以设置绘制封闭图形的填充颜色、填充样式等属性;,54,4.4.1 CGdiObject类的派生类,CPalette CPalette:该类用于管理应用程序的调色板,使应用程序的调色板与其他应用程序不干扰;CRgn:该类定义了区域,区域是由一个或多个封闭几何形体构成的一个范围,来进行填充、鼠标测试等工作;CFont:该类用于管理字体,设置绘制文本的字体大小、字体式样等属性。,55,4.4.2 画笔和画刷的使用方法,1. 画笔的使用方法,56,CreatePen,画笔样式很多,如下图:,画笔样式及说明,57,使用画笔的主要步骤,(1)创建新的画笔类对象: 可以调用CPen类的构造函数CPen:CPen()来创建: CPen pen(PS_SOLID, 2, RGB(0, 0, 255); 也可以调用CPen类的成员函数CreatePen()来实现: CPen pen; pen.CreatePen(PS_SOLID, 2, RGB(0, 0, 255);,58,(2)保存旧画笔,并将新创建的画笔对象选入设备对象中CPen* pOldPen = pDC-SelectObject(SelectObject() 是CDC类中的一个重要成员函数,调用该函数可实现选择新对象,并返回旧对象的指针(3)开始绘图工作,调用CDC类的各种绘图函数进行绘图(4)恢复原来的旧画笔,同样调用SelectObject()函数来实现。,使用画笔的主要步骤,59,4.4.2 画笔和画刷的使用方法,2. 画刷的使用方法 画刷主要用于将指定区域用颜色进行充填。 使用画刷与使用画笔的方法相似。首先需要创建一个新的画刷对象,然后用它来取代原有的画刷,使用完后再恢复旧画刷。 MFC的CBrush类封装了绘图的画刷工具。,60,使用画刷的程序,61,使用画刷的步骤,与画笔相同,在创建新画刷对象后,也可以采用两种方法来对其初始化。既可以调用CBrush类的构造函数CBrush:CBrush(); CBrush* brush; brush = new CBrush(RGB(255, 0, 0);也可以调用CBrush类的成员函数CreateSolidBrush() 来实现,即程序中的语句: CBrush brush; brush.CreateSolidBrush(RGB(255, 0, 0);,62,4.4.3 文字的显示和图形的绘制,1. 文字的显示 CDC类中有两种文本输出函数:TextOut() 和 DrawText() TextOut() 只能处理单行文本,后者可以处理多行文本。 BOOL TextOut(int x, int y, const CString TextOut()函数在指定坐标上,以当前字体、颜色等属性显示字符串。,63,CString 用法,CString 是MFC封装的一个用于处理字符串的类,使用很简单 CString str=“Hello, I am Jacky”; pDC-TextOut(10,10,str);该类还有很多成员函数,方便文本处理,4.4.3 文字的显示和图形的绘制,2. 图形的绘制1)画点SetPixel(int x, int y, COLORREF crColor);其中,参数x, y指定点的坐标;crColor 指定颜色值;p为一个POINT结构或CPoint对象,其成员就是x, y,即点的坐标。该函数返回原先此点的颜色。,4.4.3 文字的显示和图形的绘制,2. 图形的绘制1)画点下面的代码表示在(100, 100)点处画一个红点。void CEx09View:OnDraw(CDC* pDC) pDC-SetPixel(100, 100, RGB(255, 0, 0); ,4.4.3 文字的显示和图形的绘制,2. 图形的绘制2)画线 画直线先用MoveTo()函数移动当前点,再用LineTo()函数从当前点到指定点之间画一条直线。,67,画线示例,4.4.3 文字的显示和图形的绘制,2. 图形的绘制3)画椭圆 椭圆的画法是:指定一块矩形区域,GDI就会自动画出一个与矩形内切的椭圆。Ellipse()函数用于画椭圆:BOOL Ellipse(int x1, int y1, int x2, int y2);其中,参数x1, y1指定椭圆外切矩形左上角横、纵坐标; x2, y2指定椭圆外切矩形右下角横、纵坐标。,4.4.3 文字的显示和图形的绘制,2. 图形的绘制4)画矩形 Rectangle()函数用于画矩形:BOOL Rectangle(int x1, int y1, int x2, int y2);其中,参数x1, y1指定矩形左上角横、纵坐标;x2, y2指定矩形右下角横、纵坐标。,4.4.3 文字的显示和图形的绘制,2. 图形的绘制4)画矩形 RoundRect()画一个圆角矩形:BOOL RoundRect(int x1, int y1, int x2, int y2, int x3, int y3);其中,参数x1, y1指定圆角矩形左上角横、纵坐标;x2, y2指定圆角矩形右下角横、纵坐标;x3, y3用于指定绘制矩形圆角的椭圆宽度和高度。,4.4.3 文字的显示和图形的绘制,2. 图形的绘制5)画多边形 BOOL Polygon (LPPOINT lpPoints, int nCount); 该函数会把给出的点连起来,画出一个多边形,其中lpPoints 参数是一个数组,nCount参数指定数组的大小,lpPoints 参数也可以用CPOINT数组代替。,72,第四章 MFC编程基础,4.1 开发环境4.2 SDI相关知识4.3 鼠标与键盘4.4 GDI相关知识4.5 位图及其加载,4.6 对话框4.7 控件4.8 菜单4.9 集合类4.10 程序示例,1. 位图头文件用于识别位图文件,4.5.1 位图结构,4.5.1 位图结构,2. 位图信息用于描述整个位图文件的情况,4.5.1 位图结构,3. 彩色表,4.5.1 位图结构,4. 位图数据,紧跟在彩色表之后的是图像数据字节阵列。图像的每行由表示图像像素的连续字节组成,每一行的字节数取决于图像的颜色数目和用像素表示的图像宽度。,77,4.5.2 位图类,CBitmap 类封装的主要函数,78,从外部导入图片,到显示在视图中,有如下五步:(1) 导入位图:把位图文件作为资源导入到应用程序选择“插入|资源”命令(本例将其ID设置为:IDB_BITMAP1)(2) 采用LoadBitmap(IDB_BITMAP1)函数装载位图,把位图资源装载到 CBitmap对象。 CBitmap bt; bt.LoadBitmap(IDB_BITMAP1);,如何使用位图,79,(3) 读取位图信息,如何使用位图,(4) 构造一个与指定设备兼容的内存设备环境(缓冲区或暂存区),并将位图装入该设备环境(5) 将位图从内存设备环境复制到真正的设备环境中,80,第四章 MFC编程基础,4.1 开发环境4.2 SDI相关知识4.3 鼠标与键盘4.4 GDI相关知识4.5 位图及其加载,4.6 对话框4.7 控件4.8 菜单4.9 集合类4.10 程序示例,81,对话框是一个弹出式窗口,可以独立使用,也可是应用程序中用于用户输入或交互的场所;如果独立使用,就可以利用MFC提供的向导来生成一个基于对话框的应用程序;如果是应用程序的一部分,则是作为资源存在的。对话框中可以包含众多的控件,如按钮、文本框、滚动条、列表框、编辑框等。,4.6 对话框,82,对话框又分为模态对话框和非模态对话框模态对话框不允许用户在关闭对话框之前切换到应用程序的其它窗口;非模态对话框允许用户在对话框与应用程序其它窗口之间的切换。,4.6 对话框,83,创建基于对话框的应用程序,选择Dialog Based,84,应用程序界面,85,运行结果,86,第四章 MFC编程基础,4.1 开发环境4.2 SDI相关知识4.3 鼠标与键盘4.4 GDI相关知识4.5 位图及其加载,4.6 对话框4.7 控件4.8 菜单4.9 集合类4.10 程序示例,87,按钮控件是Windows对话框中最常用的控件。按钮的类型比较丰富,其中主要有普通按钮、单选按钮和复选框按钮等。,4.7.1 按钮,1. 普通按钮,88,2. 单选按钮,4.7.1 按钮,89,3. 复选框,4.7.1 按钮,90,用一个例子来演示静态控件显示一个整形变量,并且每点击一下按钮,变量就会加一。,4.7.2 静态控件,91,编辑框是功能非常强大的控件,与静态控件相比,它不仅可以显示文本,还可以用于接受输入文本,并具有一定的编辑功能如,可以用鼠标或键盘选中框中文字的一部分或全部,裁剪或复制后张贴到另一个编辑框中,4.7.3 编辑框,92,给编辑框映射变量,在菜单中选择ClassWizard命令,从弹出的对话框中选择Member Variables标签点击”Add Variable”按钮,分别给IDC_EDIT1和IDC_EDIT2设置变量m_Edit1和m_Edit2注意变量类别要设置为Control, 变量类型为CEdit。,93,给各个按钮处理函数添加代码,94,给各个按钮处理函数添加代码,95,给各个按钮处理函数添加代码,96,列表框用于集中显示同种类型的内容,4.7.4 列表框,97,给列表框映射变量,在对话框中,添加一个列表框控件,其ID默认为IDC_LIST1在菜单中选择 ClassWizard 命令,从弹出的对话框中选择Member Variables 标签点击 ”Add Variable” 按钮,分别给 IDC_LIST1 设置变量m_List。 注意变量类别要设置为Control, 变量类型为CListBox。,98,列表框的初始化,在OnInitDialog()函数中,添加如下代码,99,删除列表元素,可以通过鼠标在列表框中选择一个元素,然后删除它可以使用DeleteString函数来实现,其原型为: int DeleteString( UINT nIndex ); 其中nIndex 表示该元素在列表框中的序号,序号是从0开始同时,函数GetCurSel( ) 返回列表框中当前被鼠标选中元素的序号,100,许多程序需要让用户在一个范围内选值,给用户提供关于当前范围设置的反馈信息;或对于一个费时的任务,显示其当前进度;或均衡器,4.7.5 进度条,101,程序示例,创建右图所示的一个对话框,点击按钮后,能够增加当前进度给进度条映射变量m_Progress,注意设置变量时,类别为Control,变量类型为CProgressCtrl映射完变量后,就可以通过按钮的触发来改变变量值,102,使用进度条,设置进度条的范围:使用进度条时,首先要设置进度条的范围。我们一般是在对话框的OnInitDialog函数中初始化控件的:设置进度条的当前值:通过调用进度条的成员函数SetPos()可以更新控件的当前显示。一般在设置范围后就立即设置其初始值设置步长:即每次进度条变化的值,可以用SetStep()设置;m_Progress.SetRange(0,100); m_Progress.SetPos(0); m_Progress.SetStep(10);,103,第四章 MFC编程基础,4.1 开发环境4.2 SDI相关知识4.3 鼠标与键盘4.4 GDI相关知识4.5 位图及其加载,4.6 对话框4.7 控件4.8 菜单4.9 集合类4.10 程序示例,104,菜单是用户界面的组成部分。在 MFC 中,CMenu类封装了Windows的菜单功能,它提供了多种方法用于创建、修改、合并菜单。菜单为用户同Windows应用程序间的交互提供了主要的方法,使得用户可以快速驾驭高层的用户界面结构。,4.8 菜单,105,添加菜单资源,106,给菜单项添加命令函数,107,添加命令用户接口处理函数,108,第四章 MFC编程基础,4.1 开发环境4.2 SDI相关知识4.3 鼠标与键盘4.4 GDI相关知识4.5 位图及其加载,4.6 对话框4.7 控件4.8 菜单4.9 集合类4.10 程序示例,109,MFC提供集合类(Collect)专门负责数据对象的存储和管理,MFC的集合类分为三类,分别用于处理三类不同性质的数据结构: 表 (List,类似于数据结构的双链表) 数组(Array) 映射(Map,具有类似字典的功能).,4.9 集合类,4.9.1 表,双向链表类(CList),CList也是MFC中的一个集合类它的内部实现机制是一个双向链表可以用来存储有序的、可重复值的元素(节点)每个节点对应一个POSTION类型的迭代器,POSITION是MFC为专门为标识集合类中的数据位置而设置的数据结构可以通过POSITION类型的迭代器进行节点的遍历、插入、删除等操作,111,template class CList : public CObject 参数TYPE指明列表中存储的数据类型,参数ARG_TYPE指明引用列表元素时使用的数据类型。,1. CList列表类的定义,4.9.1 表,2有关属性和状态的函数(1)int GetCount() const; 返回列表中节点总数。(2)BOOL IsEmpty( ) const; 判断列表是否为空,即不包含任何元素。如果为空,返回TRUE,否则,返回FALSE。,4.9.1 表,3获得表头和表尾函数(1) TYPE GetHead( ) const; TYPE 获得表尾,4.9.1 表,4遍历列表元素(1) POSITION GetHeadPosition( ) const; 获得列表表头元素的位置(2) TYPE 取得下一个节点的位置,并返回改变前的节点数值,4.9.1 表,4遍历列表元素(3) POSITION GetTailPosition( ) const; 获得列表表尾元素的位置(4) TYPE 取得上一个节点的位置,并返回改变前的节点数值,4.9.1 表,5访问和操作列表元素(1)TYPE 函数设置指定位置处(由参数pos表明)的列表元素的值。,4.9.1 表,6增加删除元素操作(1)POSITION AddHead( ARG_TYPE newElement ); void AddHead( CList* pNewList ); 在头部添加一个新的节点,(2)POSITION AddTail( ARG_TYPE newElement ); void AddTail( CList* pNewList ); 在尾部添加一个新的节点,4.9.1 表,6增加删除元素操作(3)void RemoveAt( POSITION position ); 删除指定位置删除一个节点(4)void RemoveAll( ); 清空链表中所有接点并使Count归零,4.9.1 表,6增加删除元素操作(5)POSITION InsertBefore( POSITION position, ARG_TYPE newElement ); 在指定位置前添加一个节点(6)POSITION InsertAfter( POSITION position, ARG_TYPE newElement ); 在指定位置后添加一个节点,4.9.1 表,7查询操作(1)POSITION Find( ARG_TYPE searchValue, POSITION startAfter = NULL) const; 内部遍历查找指定数值,返回节点所在的位置。(2)POSITION FindIndex( int nIndex ) const; 内部循环找到指定索引的节点位置。,121,8. CList的算法特点,即使数据元素非常多单个数据元素也很大,执行 Insert/Add/Remove 的速度都很快如果要找到某个元素只有遍历整个链表List 的使用比较繁琐,特别为小尺寸数据设计List 更是得不偿失的。,4.9.2 数组,1. CArray的定义template class CArray:public CObjectTYPE:指明数组中存储的数据类型ARG_TYPE:指明引用数组元素时使用的数据类型,通常为TYPE类型的引用。,4.9.2 数组,2有关属性的函数(1)int GetSize( ) const; 用于返回数组中元素的个数(2)void SetSize( int nNewSize, int nGrowBy = -1 ); 设置空的或现存数组的大小(3)int GetUpperBound( ) const; 用于返回当前数组对象可访问元素的索引上限,4.9.2 数组,3访问数组元素(1)TYPE GetAt( int nIndex ) const; 返回指定索引位置的数组元素值。(2)void SetAt( int nIndex, ARG_TYPE newElement ); 函数设置指定元素的值。,4.9.2 数组,(3)TYPE 返回指向数组元素的指针。,4.9.2 数组,4增加、删除元素的有关操作(1)int Add( ARG_TYPE newElement ); 向数组尾部增加一个新的数组元素。(2)int Append( const CArray 将源数组src中的所有元素插入到当前数组的最后。,4.9.2 数组,(3)void Copy( const CArray 第一个函数将在数组的指定位置插入一个数组元素或该元素值的多个拷贝。 第二个函数在数组的指定位置插入另一个数组中的元素。,4.9.2 数组,(5)void RemoveAt( int nIndex, int nCount = 1 ); 删除数组中从指定位置开始的一个或多个元素。(6)void RemoveAll( ); 删除数组中的所有元素。,129,CArray的算法特点,Array采用队列方式存储数据,其内部数据元素是以物理方式顺序排列的检索、顺序执行GetAt()等函数的速度是相当快的每次队列长度变化后,都要重新申请内存、拷贝内存、释放内存 InsertAt/Add/RemoveAt()的速度都很慢 在大量使用添加数据前,使用SetSize预设置空间可以提高效率频繁使用InsertAt/SetAt/RemoveAt等,应该考虑使用CList来代替,130,综合应用,在前面各节知识的基础上,本节给出一个综合应用实例功能:当鼠标左键按下后,拖动鼠标可以在视图上画出一系列点来,鼠标抬起则停止;可以利用一个菜单来设置线的颜色和粗细,131,存储点,用一个链表来存储点,并且把链表放到文档类文件ZongHeDoc.h中 public: CList m_PointList;,132,记录并显示点数据,133,显示链表中的点,134,设置点的颜色,新建一个对话框,用于用户指定自己想要的点的颜色值完成对话框后,双击对话框,会弹出一个如下的一个对话框,提示你是否要为这个新建的对话框资源创建一个新类,135,设置点的颜色,136,点击OK,并给新类取个: CRGBDlg打开对话框,点击ClassWizard,给三个编辑框映射变量:,设置点的颜色,137,建立触发对话框的菜单,138,添加处理代码,139,结 果,1. Visual C+的项目工作区由哪三个面板组成?2. 简述文档和视图的关系,并举例说明。3. 什么是GDI?4. 简述画笔的使用方法。5. 简述位图的显示步骤。,思考题,