下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、BitBlt(双缓冲解决图象闪烁显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题。而且多数人 认为MFC 的绘图函数效率很低,总是想寻求其它的解决方案。MFC 的绘图效率的确不高但也不差,而且它的绘图函数使用非常简单,只要使 用方法得当,再加上一些技巧,用 MFC 可以得到效率很高的绘图程序。我想就我长期(呵呵当然也只有 2 年多使用 MFC 绘图的经验谈谈我的一些观 点。1、显示的图形为什么会闪烁?我们的绘图过程大多放在 On Draw或者 On Pai nt函数中,OnDraw在进行屏幕显 示时是由 On Pai nt 进行调用的。当窗口由于任何原因需要重绘时,总是先用背景色 将显
2、示区清除,然后才调用 On Pai nt,而背景色往往与绘图内容反差很大,这样在短时 间内背景色与显示图形 的交替出现,使得显示窗口看起来在闪。如果将背景刷设置成 NULL,这样无论怎样重绘图 形都不会闪了。当然,这样做会使得窗口的显示乱 成一团,因为重绘时没有背景色对原来绘 制的图形进行清除,而又叠加上了新的图 形。有的人会说,闪烁是因为绘图的速度太慢或者 显示的图形太复杂造成的,其实 这样说并不对,绘图的显示速度对闪烁的影响不是根本性的。例如在 OnDraw(CDC*pDC 中这样写:pDC-MoveTo(0,0;pDC-Li neTo(100,100;这个绘图过程应该是非常简单、非常快了
3、吧,但是拉动窗口变化时还是会看见闪烁。其实从道理上讲,画图的过程越复杂越慢闪烁应该越少,因为绘图用的时间 与用背景清除屏幕所花 的时间的比例越大人对闪烁的感觉会越不明显。比如:清楚屏幕时间为 1s 绘图时间也是为 1s 这样在 10s 内的连续重画中就要闪烁 5 次;如果清楚屏幕时间为 1s 不变,而绘图时间 为 9s,这样 10s 内的连续重画只会闪烁一次。这个也可以试验,在 OnDraw(CDC *pDC 中 这样写:for(int i=0;iMoveTo(0,i;pDC-Li neTo(1000,i;呵呵,程序有点变态,但是能说明问题。说到这里可能又有人要说了,为什么一个简单图形看起来没
4、有复杂图形那么闪 呢?这是因为复杂图形占的面积大,重画时造成的反差比较大,所以感觉上要闪得厉 害一些,但是闪烁频率要低。那为什么动画的重画频率高,而看起来却不闪?这里,我就要再次强调了,闪烁是什么?闪烁就是反差,反差越大,闪烁越厉害。因为动画 的连续两个帧之间的差异很小 所以看起来不闪。如果不信,可以在动画的每一帧中 间加一张纯白的帧,不闪才怪呢。2、如何避免闪烁在知道图形显示闪烁的原因之后,对症下药就好办了。首先当然是去掉MFC 提供的背景绘制过程了。实现的方法很多,*可以在窗口形成时给窗口的注册类的背景刷付NULL*也可以在形成以后修改背景static CBrush brush(RGB(2
5、55,0,0;SetClassLo ng(this-m_hWnd,GCL_HBRBACKGROUND,(LONG(HBRUSHbrush;要简单也可以重载 OnErASEBkgnd(CDC* pDC 直接返回 TRUE这样背景没有了,结果图形显示的确不闪了,但是显示也象前面所说的一样,变得一团舌 L。怎么办?这就要用到双缓存的方法了。双缓冲就是除了在屏幕上有图形进 行显示以外,在内存中也有图形在绘制。我们可以把要显示的图形先在内存中绘制好,然后再一次性的将 内存中的图形按照一个点一个点地覆盖到屏幕上去(这个过程非常快,因为是非常规整的内 存拷贝。这样在内存中绘图时,随便用什么反差大 的背景色进
6、行清除都不会闪,因为看不 见。当贴到屏幕上时,因为内存中最终的图 形与屏幕显示图形差别很小(如果没有运动,当然就没有差别,这样看起来就不会 闪。3、如何实现双缓冲首先给出实现的程序,然后再解释,同样是在 OnDraw(CDC *pDC 中:CDC MemDC; /首先定义一个显示设备对象CBitmap MemBITmap;/定义一个位图对象/随后建立与屏幕显示兼容的内存显示设备MemDC.CreateCompatibleDC(NULL;这时还不能绘图,因为没有地方画A_A下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小MemBitmap.CreateCompatibleBI
7、Tm ap(pDC, nWidth, nH eight;/将位图选入到内存显示设备中/只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上CBitmap *pOldBit=MemDC.SelectObject(&MemBITmap;先用背景色将位图清除干净,这里我用的是白色作为背景/你也可以用自己应该用的颜色MemDC.FillSolidRect(0,0, nWidth, nH eight,RGB(255,255,255;绘图MemDC.MoveTo( ;MemDC.LineTo(.;/将内存中的图拷贝到屏幕上进行显示pDC-BITBIt(0,0, nWidth ,nH eigh
8、t,&MemDC,0,0,SRCCOPY;绘图完成后的清理MemBIT map .DeleteObject(;MemDC.DeleteDC(;上面的注释应该很详尽了,废话就不多说了。4、如何提高绘图的效率我主要做的是电力系统的网络图形的 CAD 软件,在一个窗口中往往要显示成千 上万个电力元件,而每个元件又是由点、线、圆等基本图形构成。如果真要在一 次重绘过程重画这 么多元件,可想而知这个过程是非常漫长的。如果加上了图形的浏览功能,鼠标拖动图形滚动时需要进行大量的重绘,速度会慢得让用户将无法忍 受。怎么办?只有再研究研究 MFC 的绘图过程了。实际上,在 OnDraw(CDC *pDC
9、 中绘制的图并不是所有都显示了的,例如:你在OnDraw 中画了两个矩形,在一次重绘中虽然两个矩形的绘制函数都有执行,但是很 有可能只有一个 显示了,这是因为 MFC 本身为了提高重绘的效率设置了裁剪区。裁剪区的作用就是:只有在这个区内的绘图过程才会真正有效,在区外的是无效的,即使在区外执行了绘图函数也是 不会显示的。因为多数情况下窗口重绘的产生大 多是因为窗口部分被遮挡或者窗口有滚动发生,改变的区域并不是整个图形而只有一小部分,这一部分需要改变的就是 pDC 中的裁剪 区了。因为显示(往内存或者显 存都叫显示 比绘图过程的计算要费时得多,有了裁剪区后 显示的就只是应该显示的 部分,大大提高了显示效率。但是这个裁剪区是 MFC 设置的,它已经
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025工商行政工作计划样例
- 汽车销售个人年终工作总结与计划范文
- 开学学习计划教研学习计划
- 关于法制宣传教育的工作计划范文
- 初三英语教学新学期工作计划
- 《GMP验收办法》课件
- 2025年人事行政部工作计划
- 工伤委托律师代理合同
- 体育生自愿参加训练协议书
- 《复合材料大综述》课件
- 读书交流ppt《做最好的自己》
- 优秀的公司介绍ppt
- GB/T 8433-2013纺织品色牢度试验耐氯化水色牢度(游泳池水)
- GB/T 4208-2017外壳防护等级(IP代码)
- GB/T 10836-2021船用多功能焚烧炉
- 部编版五年级语文上册第八单元主题阅读含答案
- 结直肠癌中西医结合治疗总论
- 第23课《范进中举》课件(共27张PPT) 部编版语文九年级上册
- 宋晓峰小品《宋镖传奇》剧本台词手稿
- 高考作文专题之拟标题课件
- DB31T 634-2020 电动乘用车运行安全和维护保障技术规范
评论
0/150
提交评论