下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实践+测试:onpaint和ondraw新建了一个当文档的vc工程,在ondraw中添加了如下代码。void cmyview:ondraw(cdc* pdc)cmydoc* pdoc = getdocument();assert_valid(pdoc);/ todo: add draw code for native data herepdc-textout(100,100,ondraw);执行,结果在(100,100)处出现了ondraw字样。在vc安装目录/vc98/mfc/src,找到viewcore.cpp,按下ctrl+f,输入onpaint,调出如下代码:void cview:on
2、paint()/ standard paint routinecpaintdc dc(this);onpreparedc(&dc);ondraw(&dc);onpaint是cwnd的成员函数,而ondraw则是cview的虚函数。由于我没有重定义onpaint函数,所以默认执行cview:onpaint()函数,当执行到ondraw(&dc);时,由于它是虚函数,所以实际执行的是cmyview:ondraw函数,所以出现了如上结果。为cmyview添加wn_paint消息,onpaint函数如下:void cmyview:onpaint() cpaintdc dc(this); / devic
3、e context for painting/ todo: add your message handler code here/ do not call cview:onpaint() for painting messages执行,没有出现任何反应,原因是void cmyview重写了onpaint函数,而void cmyview:onpaint() 函数里边没有任何代码,所以没有反应。修改void cmyview:onpaint() 如下:void cmyview:onpaint() cpaintdc dc(this); / device context for paintingondr
4、aw(&dc);执行,结果在(100,100)处出现了ondraw字样。注意:a.在处理wm_paint消息时,只能用beginpaint和endpaint.b.cpaintdc对象在构造时调用cwnd:beginpaint,在析构的时候调用cwnd:endpaint,刚好符合a.c.在客户区绘图时,要用getdc和releasedc.d.cclientdc对象在构造时调用getdc,在析构时调用releasedc,刚好符合c.by xin.jin*其他人如何看:以下为转帖:*onpaint()是当视类窗口需要在屏幕上输出时被调用,负责完成窗口的屏幕输出显示工作;onprint()是当打印一页
5、时被调用,负责完成向某页打印纸上打印。这两个函数的缺省实现中包含了对ondraw(cdc *pdc)的调用ondraw是cview类的一个虚成员函数,每当视窗需要被重新绘制时,系统都要调用ondraw函数,当用户改变了窗口尺寸,或当窗口恢复了先前被覆盖的部分或当应用程序改变了窗口数据时,窗口都需要被重新绘制。通过重载此函数,用户程序随ondraw一起调用,确保图形在窗口的显示。/以下为转贴:ondraw()和onpaint()兄弟经常有朋友问雷神这样的问题:我在视图画的图象或者文字,当窗口改变后为什么不见了?ondraw()和onpaint()两个都是解决上面的问题,有什么不同?雷神在这里一并
6、解答一下吧。ondraw()和onpaint()好象兄弟俩,因为它们的工作类似。至于不见了的问题简单,因为当你的窗口改变后,会产生无效区域,这个无效的区域需要重画。一般windows回发送两个消息wm_paint(通知客户区有变化)和wm_ncpaint(通知非客户区有变化)。非客户区的重画系统自己搞定了,而客户区的重画需要我们自己来完成。这就需要ondraw()或onpaint()来重画窗口。ondraw()和onpaint()有什么区别呢?首先:我们先要明确cview类派生自cwnd类。而onpaint()是cwnd的类成员,同时负责响应wm_paint消息。ondraw()是cview的
7、成员函数,并且没有响应消息的功能。这就是为什么你用vc成的程序代码时,在视图类只有ondraw没有onpaint的原因。其次:我们在第每天跟我学mfc3的开始部分已经说到了。要想在屏幕上绘图或显示图形,首先需要建立设备环境dc。其实dc是一个数据结构,它包含输出设备(不单指你17寸的纯屏显示器,还包括打印机之类的输出设备)的绘图属性的描述。mfc提供了cpaintdc类和cwindwodc类来实时的响应,而cpaintdc支持重画。当视图变得无效时(包括大小的改变,移动,被遮盖等等),windows 将 wm_paint 消息发送给它。该视图的 onpaint 处理函数通过创建 cpaintd
8、c 类的dc对象来响应该消息并调用视图的 ondraw 成员函数。通常我们不必编写重写的 onpaint 处理成员函数。/cview默认的标准的重画函数void cview:onpaint()cpaintdc dc(this);onprepardc(&dc);ondraw(&dc); /调用了ondraw既然onpaint最后也要调用ondraw,因此我们一般会在ondraw函数中进行绘制。下面是一个典型的程序/视图中的绘图代码首先检索指向文档的指针,然后通过dc进行绘图调用。void cmyview:ondraw( cdc* pdc )cmydoc* pdoc = getdocument()
9、;cstring s = pdoc-getdata(); / returns a cstringcrect rect;getclientrect( &rect );pdc-settextalign( ta_line | ta_center );pdc-textout( rect.right / 2, rect.bottom / 2, s, s.getlength() );最后:现在大家明白这哥俩之间的关系了吧。因此我们一般用onpaint维护窗口的客户区(例如我们的窗口客户区加一个背景图片),用ondraw维护视图的客户区(例如我们通过鼠标在视图中画图)。当然你也可以不按照上面规律来,只要达到
10、目的并且没有问题,怎么干都成。补充:我们还可以利用invalidate(),validatergn(),validaterect()函数强制的重画窗口,具体的请参考msdn吧。/在mfc程序设计中,按照传统的设计,如果处理wm_paint消息,一般会派生一个onpaint函数,映射到wm_paint消息上进行绘图处理。但是很多程序中并没有出现onpaint,一个ondraw函数做了更多的绘图操作。而在消息映射的列表中,也没有见到wm_paint到ondraw的映射。实际上,ondraw不是onpaint的映射,出现ondraw,是为了实现各种不同的设备上的绘图一致性。首先,读者需要明白的是,w
11、m_paint消息是为了绘制屏幕而出现的,因此,在onpaint中,我们只能存取屏幕dc,进行绘制,常见的代码是:void mywnd:onpaint()cpaintdc dc(this);/draw code here这里的cpaintdc的构造函数会自动调用beginpaint,获得一个屏幕dc,并附加在dc对象上。当dc对象析构时,系统自动调用endpaint并使invalidated rectangle变成validated状态,从而结束绘制。(注意,重复创建cpaintdc实例会失败也因为如此)如果我们在onpaint中绘制,那么在打印机上绘制我们就需要再写一个onprint函数,重新绘制。这样,程序设计者就需要维护两套代码。为了简化操作,mfc框架把大部分绘制操作都放在ondraw中,onpaint和onprint只构造相应的dc,然
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学校教职工职称评聘管理办法
- 计算机类就业前景与机遇
- 2026年二建《市政公用工程管理与实务》模拟试题(附答案)
- 嘉兴市嘉善县公安辅警招聘知识考试题(含答案)
- 2026年医疗机构环境表面清洁与消毒管理规范试卷含答案
- 2026年共青团入团考试题库附答案
- 湘乡营销推广策略方案(3篇)
- 现捞开店营销方案(3篇)
- 硝苯地平药品营销方案(3篇)
- 窑洞防潮施工方案范本(3篇)
- 2025年江苏省无锡市梁溪区侨谊教育集团小升初数学招生试卷(含答案解析)
- 行政人事自我介绍
- 博雷顿产品介绍
- 四川水电集团招聘岗位综合能力测试客观题题库
- 支气管哮喘急性发作的紧急救护技巧
- 煤矿职业病危害培训课件
- 【耳鼻喉9版】绪论和耳科学第七章 中耳炎性疾病
- 创伤性肾破裂的护理课件
- 安装断桥窗合同范本
- 水利工程维修养护费用标准
- 智能叉车安全管理与预警系统
评论
0/150
提交评论