版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、窗口中图形的保存和重绘窗口中图形的保存和重绘 窗口重绘时会发送窗口重绘时会发送WM_PAINTWM_PAINT消息,消息,OnDrawOnDraw函数并不是函数并不是WM_PAINTWM_PAINT消息响应函数,那么为什么窗口重绘时它会被调消息响应函数,那么为什么窗口重绘时它会被调用呢?用呢? 分析基类分析基类CViewCView中响应中响应WM_PAINTWM_PAINT的消息响应函数的消息响应函数 void CView:OnPaint() / standard paint routineCPaintDC dc(this);OnPrepareDC(&dc);OnDraw(&d
2、c); 窗口重绘时,调用窗口重绘时,调用ONDRAWONDRAW函数的机制函数的机制 是因为当窗口重绘时,会发送是因为当窗口重绘时,会发送WM_PAINTWM_PAINT消息,而我们消息,而我们CMiniDrawViewCMiniDrawView类中没处理这个消息,会回到基类的消息处类中没处理这个消息,会回到基类的消息处理函数理函数OnPaintOnPaint中,在这个函数中调用中,在这个函数中调用OnDrawOnDraw函数。给我们函数。给我们的感觉就好像是的感觉就好像是OnDrawOnDraw函数专门用来负责重绘窗口的。跟函数专门用来负责重绘窗口的。跟在在SDKSDK编程中讲过的窗口重绘过
3、程是一致的,只是将重绘的编程中讲过的窗口重绘过程是一致的,只是将重绘的过程封装成几个函数了,在过程封装成几个函数了,在OnPaintOnPaint中调用中调用OnDrawOnDraw。这个函。这个函数的目的是利用这个函数给程序员提供一种方便,可以在数的目的是利用这个函数给程序员提供一种方便,可以在这进行图形的绘制。这进行图形的绘制。窗口重绘时,调用窗口重绘时,调用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中,既可以使
8、用中,既可以使用GetAt函数,也可使用函数,也可使用“ ”操作符:操作符: / 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; A
9、SSERT( *(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. 删除简单数组集合类的元素使用简单数组集
10、合类(1) 使用函数使用函数GetSize和整数下标值访问简单数组集合和整数下标值访问简单数组集合类中的元素。类中的元素。(2) 若对象元素是在堆内存中创建的,则使用若对象元素是在堆内存中创建的,则使用delete操操作符删除每一个对象元素。作符删除每一个对象元素。(3) 调用函数调用函数RemoveAll删除简单数组集合类中的所有删除简单数组集合类中的所有元素。元素。使用简单数组集合类CPtrArray array;CAge* pa1;CAge* pa2;array.Add( pa1 = new CAge( 21 ) ); array.Add( pa2 = new CAge( 40 ) );
11、 ASSERT( 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,poin
12、t); m_ptArray.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);当窗口尺寸发生变化时,当窗口尺寸发生变化时,图形没有在窗口中再次出现图形没有在窗口中再次出现 ?在ONLBUTTONUONLBUTTONUP P函数中函数中0088:4400CLine line();CLine的对象在栈中的内存0088:4400CPtrArray m_ptrArray;m_ptrArray.Add(&line)CLine的对象发生析构,内存被回收。如何解决这个问题呢?如何解决这个问题呢?在在ONLBUTTONUONLBUT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国医学科学院医学备考题库研究所2026年公开招聘工作人员备考题库及答案详解参考
- 中信证券股份有限公司沈阳市府大路证券营业部2026年校园招聘备考题库完整参考答案详解
- 2026年贵州德润环保产业有限公司社会招聘备考题库及1套参考答案详解
- 珠海中山大学附属第二小学2025年民乐校队教师招聘备考题库及一套答案详解
- 初中体育立定跳远动作的左右腿发力差异分析课题报告教学研究课题报告
- 2026年漯河市城乡一体化示范区事业单位人才引进备考题库参考答案详解
- 2026年贵州飞龙雨实业集团招聘备考题库及一套参考答案详解
- 2025年区块链跨境电商供应链金融的区块链技术成熟度报告
- 同城配送合同范本协议书
- 信息安全意识建设服务条款协议
- 2026中国石油大学(北京)非教师岗位招聘24人笔试模拟试题及答案解析
- 2025年监理工程师考试案例分析(土木建筑)真题答案(完整版)
- 2025下半年贵州遵义市市直事业单位选调56人考试备考题库及答案解析
- 2025 新能源电力交易实战指南
- 教科版(2024)二年级科学上册期末综合质量调研卷(含答案)
- 2025年武汉市教师招聘笔试参考试题及答案解析
- 2025年沈阳华晨专用车有限公司公开招聘考试笔试参考题库及答案解析
- 2025年国家统计局齐齐哈尔调查队公开招聘公益性岗位5人笔试考试备考题库及答案解析
- 包装班组年终总结
- 专升本旅游管理专业2025年旅游学概论试卷(含答案)
- 南阳市劳务合同范本
评论
0/150
提交评论