窗口中图形的保存与重绘_第1页
窗口中图形的保存与重绘_第2页
窗口中图形的保存与重绘_第3页
窗口中图形的保存与重绘_第4页
窗口中图形的保存与重绘_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

1、窗口中图形的保存和重绘窗口中图形的保存和重绘窗口重绘时,调用窗口重绘时,调用OnDrawOnDraw函数的机制函数的机制 窗口重绘时会发送窗口重绘时会发送WM_PAINTWM_PAINT消息,消息,OnDrawOnDraw函数并不是函数并不是WM_PAINTWM_PAINT消息响应函数,那么为什么窗口重绘时它会被调消息响应函数,那么为什么窗口重绘时它会被调用呢?用呢? 分析基类分析基类CViewCView中响应中响应WM_PAINTWM_PAINT的消息响应函数的消息响应函数 void CView:OnPaint() / standard paint routineCPaintDC dc(th

2、is);OnPrepareDC(&dc);OnDraw(&dc); 窗口重绘时,调用窗口重绘时,调用OnDrawOnDraw函数的机制函数的机制 是因为当窗口重绘时,会发送是因为当窗口重绘时,会发送WM_PAINTWM_PAINT消息,而我们消息,而我们CMiniDrawViewCMiniDrawView类中没处理这个消息,会回到基类的消息类中没处理这个消息,会回到基类的消息处理函数处理函数OnPaintOnPaint中,在这个函数中调用中,在这个函数中调用OnDrawOnDraw函数。给函数。给我们的感觉就好像是我们的感觉就好像是OnDrawOnDraw函数专门用来负责重绘窗口的。函数专门用

3、来负责重绘窗口的。跟在跟在SDKSDK编程中讲过的窗口重绘过程是一致的,只是将重编程中讲过的窗口重绘过程是一致的,只是将重绘的过程封装成几个函数了,在绘的过程封装成几个函数了,在OnPaintOnPaint中调用中调用OnDrawOnDraw。这个函数的目的是利用这个函数给程序员提供一种方便,这个函数的目的是利用这个函数给程序员提供一种方便,可以在这进行图形的绘制。可以在这进行图形的绘制。 当窗口尺寸发生变化时,会引起窗口的重绘,发送当窗口尺寸发生变化时,会引起窗口的重绘,发送WM_PAINTWM_PAINT消息。首先是擦除窗口背景,然后引起重绘。消息。首先是擦除窗口背景,然后引起重绘。 如果

4、要让图形始终在窗口中出现,就需要将绘制的图如果要让图形始终在窗口中出现,就需要将绘制的图形保存起来。当窗口尺寸发生变化时,再将这个图形形保存起来。当窗口尺寸发生变化时,再将这个图形在窗口中绘制出来。在窗口中输出图形,可以在在窗口中绘制出来。在窗口中输出图形,可以在OnDrawOnDraw函数中实现。函数中实现。因为窗口重绘时,会调用因为窗口重绘时,会调用OnDrawOnDraw函数。函数。那如何保存图形呢?那如何保存图形呢? 在在C+C+中,结构体就是一个类。中,结构体就是一个类。直线的要素是起点和终点。直线的要素是起点和终点。所以可以用一个类的对象来保存图形的两要所以可以用一个类的对象来保存

5、图形的两要素,这也符合面向对象的程序设计的特点。素,这也符合面向对象的程序设计的特点。利用菜单利用菜单InsertInsert插入一个新的类,名字叫插入一个新的类,名字叫CLineCLine,类的,类的类型是类型是GenericGeneric类而不是类而不是MFCMFC类。类。 在类中增加在类中增加2 2个成员变量,设为共有的。个成员变量,设为共有的。 CPoint m_ptOriginCPoint m_ptOrigin,m_ptEnd;m_ptEnd;构造一个构造一个CLineCLine的对象就可以保存直线的的对象就可以保存直线的2 2要素,提供要素,提供带参数的构造函数。带参数的构造函数。

6、CLine:CLine(CPoint m_ptOrigin, CPoint m_ptEnd)CLine:CLine(CPoint m_ptOrigin, CPoint m_ptEnd) this-m_ptOrigin=m_ptOrigin;this-m_ptOrigin=m_ptOrigin;this-m_ptEnd=m_ptEnd;this-m_ptEnd=m_ptEnd; 用什么来保存这些直线呢?用什么来保存这些直线呢?数组?数组? 链表?链表?集合类集合类CPtrArray 固定大小固定大小操作复杂操作复杂1. 简单数组集合类的构造及元素的添加简单数组集合类的构造及元素的添加 对简单数组

7、集合类构造的方法都是一样的,均是对简单数组集合类构造的方法都是一样的,均是使用各自的构造函数,它们的原型如下:使用各自的构造函数,它们的原型如下: CByteArray CByteArray( ); CDWordArray CDWordArray( ); CObArray CObArray( ); CPtrArray CPtrArray( ); CStringArray CStringArray( ); CUIntArray CUIntArray( ); CWordArray CWordArray( ); 使用简单数组集合类2. 访问简单数组集合类的元素在在MFC中,既可以使用中,既可以使用G

8、etAt函数,也可使用函数,也可使用“ ”操作符:操作符: / CPtrArray:operator 示例示例 CPtrArray array; CAge* pa; / CAge是一个用户类是一个用户类 array.Add( new CAge( 21 ) ); / 添加一个元素添加一个元素 array.Add( new CAge( 40 ) ); / 再添加一个元素再添加一个元素 pa = (CAge*)array0; / 获取元素获取元素0 ASSERT( *pa = CAge( 21 ) ); array0 = new CAge( 30 ); / 替换元素替换元素0; ASSERT( *(

9、CAge*) array0 = CAge( 30 ) ); 使用简单数组集合类2. 访问简单数组集合类的元素在在MFC中,既可以使用中,既可以使用GetAt函数,也可使用函数,也可使用“ ”操作符:操作符: / CPtrArray:GetAt示例示例 CPtrArray array; array.Add( new CAge( 21 ) ); / 元素元素 0 array.Add( new CAge( 40 ) ); / 元素元素 1 ASSERT( *(CAge*) array.GetAt( 0 ) = CAge( 21 ) ); 使用简单数组集合类3. 删除简单数组集合类的元素(1) 使用函

10、数使用函数GetSize和整数下标值访问简单数组集合和整数下标值访问简单数组集合类中的元素。类中的元素。(2) 若对象元素是在堆内存中创建的,则使用若对象元素是在堆内存中创建的,则使用delete操操作符删除每一个对象元素。作符删除每一个对象元素。(3) 调用函数调用函数RemoveAll删除简单数组集合类中的所有删除简单数组集合类中的所有元素。元素。使用简单数组集合类CPtrArray array;CAge* pa1;CAge* pa2;array.Add( pa1 = new CAge( 21 ) ); array.Add( pa2 = new CAge( 40 ) ); ASSERT(

11、array.GetSize() = 2 );for (int i=0;i array.GetSize() ;i+) delete array.GetAt(i);array.RemoveAll(); 下面代码过程是一个下面代码过程是一个CPtrArray的删除示例:的删除示例: 利用利用CPtrArrayCPtrArray去存储去存储CLineCLine对象的地址对象的地址 (1 1)在视图类中定义变量)在视图类中定义变量CPtrArray m_ptArray;(2 2)在)在OnLButtonUpOnLButtonUp中中 CLine line(m_ptOrigin,point); m_ptA

12、rray.Add(&line);(3)在)在OnDraw中,将中,将m_ptArray中保存的图形取出来重画中保存的图形取出来重画int nCount=m_ptArray.GetSize ();for(int i=0;iMoveTo (CLine *)m_ptArray.GetAt (i)-m_ptOrigin);pDC-LineTo (CLine *)m_ptArray.GetAt (i)-m_ptEnd);当窗口尺寸发生变化时,当窗口尺寸发生变化时,图形没有在窗口中再次出现图形没有在窗口中再次出现 ?在OnLButtonUp函数中函数中0088:4400CLine line();CLine的对象在栈中的内存0088:4400CPtrArray m_ptrArray;m_ptrArray.Add(&line)CLine的对象发生析构,内存被回收。如何解决这个问题呢?如何解决这个问题呢?在在OnLBut

温馨提示

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

评论

0/150

提交评论