下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 VC画图不闪烁的方法

VC画图不闪烁的方法.pdf

VC画图不闪烁的方法

。CYSTE,M
2011-11-25 0人阅读 举报 0 0 暂无简介

简介:本文档为《VC画图不闪烁的方法pdf》,可适用于IT/计算机领域

VC画图不闪烁的方法在VC中画图不闪可以使用内存画图然后将图片拷贝到设备上但结果是加快图像显示速度但还是很闪显示图形如何避免闪烁如何提高显示效率而且多数人认为MFC的绘图函数效率很低总是想寻求其它的解决方案。MFC的绘图效率的确不高但也不差而且它的绘图函数使用非常简单只要使用方法得当再加上一些技巧用MFC可以得到效率很高的绘图程序。、显示的图形为什么会闪烁?我们的绘图过程大多放在OnDraw或者OnPaint函数中OnDraw在进行屏幕显示时是由OnPaint进行调用的。当窗口由于任何原因需要重绘时总是先用背景色将显示区清除然后才调用OnPaint而背景色往往与绘图内容反差很大这样在短时间内背景色与显示图形的交替出现使得显示窗口看起来在闪。如果将背景刷设置成这样无论怎样重绘图形都不会闪了。当然这样做会使得窗口的显示乱成一团因为重绘时没有背景色对原来绘制的图形进行清除而又叠加上了新的图形。有的人会说闪烁是因为绘图的速度太慢或者显示的图形太复杂造成的其实这样说并不对绘图的显示速度对闪烁的影响不是根本性的。例如在OnDraw(CDC*pDC)中这样写:pDC>MoveTo(,)pDC>LineTo(,)这个绘图过程应该是非常简单、非常快了吧但是拉动窗口变化时还是会看见闪烁。其实从道理上讲画图的过程越复杂越慢闪烁应该越少因为绘图用的时间与用背景清除屏幕所花的时间的比例越大人对闪烁的感觉会越不明显。比如:清楚屏幕时间为s绘图时间也是为s这样在s内的连续重画中就要闪烁次如果清除屏幕时间为s不变而绘图时间为s这样s内的连续重画只会闪烁一次。这个也可以试验在OnDraw(CDC*pDC)中这样写:for(inti=i<i){pDC>MoveTo(,i)pDC>LineTo(,i)}呵呵程序有点变态但是能说明问题。说到这里可能又有人要说了为什么一个简单图形看起来没有复杂图形那么闪呢?这是因为复杂图形占的面积大重画时造成的反差比较大所以感觉上要闪得厉害一些但是闪烁频率要低。那为什么动画的重画频率高而看起来却不闪?这里我就要再次强调了闪烁是什么?闪烁就是反差反差越大闪烁越厉害。因为动画的连续两个帧之间的差异很小所以看起来不闪。如果不信可以在动画的每一帧中间加一张纯白的帧不闪才怪呢。、如何避免闪烁在知道图形显示闪烁的原因之后对症下药就好办了。首先当然是去掉MFC提供的背景绘制过程了。实现的方法很多*可以在窗口形成时给窗口的注册类的背景刷付*也可以在形成以后修改背景staticCBrushbrush(RGB(,,))SetClassLong(this>mhWnd,GCLHBRBACKGROUND,(LONG)(HBRUSH)brush)*要简单也可在view类重载OnEraseBkgnd(CDC*pDC)直接返回TRUE这样背景没有了结果图形显示的确不闪了但是显示也象前面所说的一样变得一团乱。怎么办?这就要用到双缓存的方法了。双缓冲就是除了在屏幕上有图形进行显示以外在内存中也有图形在绘制。我们可以把要显示的图形先在内存中绘制好然后再一次性的将内存中的图形按照一个点一个点地覆盖到屏幕上去(这个过程非常快因为是非常规整的内存拷贝)。这样在内存中绘图时随便用什么反差大的背景色进行清除都不会闪因为看不见。当贴到屏幕上时因为内存中最终的图形与屏幕显示图形差别很小(如果没有运动当然就没有差别)这样看起来就不会闪。、如何实现双缓冲首先给出实现的程序然后再解释同样是在OnDraw(CDC*pDC)中:CDCMemDC首先定义一个显示设备对象CBitmapMemBitmap定义一个位图对象随后建立与屏幕显示兼容的内存显示设备MemDCCreateCompatibleDC()这时还不能绘图因为没有地方画^^下面建立一个与屏幕显示兼容的位图至于位图的大小嘛可以用窗口的大小MemBitmapCreateCompatibleBitmap(pDC,nWidth,nHeight)将位图选入到内存显示设备中只有选入了位图的内存显示设备才有地方绘图画到指定的位图上CBitmap*pOldBit=MemDCSelectObject(MemBitmap)先用背景色将位图清除干净这里我用的是白色作为背景你也可以用自己应该用的颜色MemDCFillSolidRect(,,nWidth,nHeight,RGB(,,))绘图MemDCMoveTo(……)MemDCLineTo(……)将内存中的图拷贝到屏幕上进行显示pDC>BitBlt(,,nWidth,nHeight,MemDC,,,SRCCOPY)绘图完成后的清理MemBitmapDeleteObject()MemDCDeleteDC()上面的注释应该很详尽了废话就不多说了。、如何提高绘图的效率我主要做的是电力系统的网络图形的CAD软件在一个窗口中往往要显示成千上万个电力元件而每个元件又是由点、线、圆等基本图形构成。如果真要在一次重绘过程重画这么多元件可想而知这个过程是非常漫长的。如果加上了图形的浏览功能鼠标拖动图形滚动时需要进行大量的重绘速度会慢得让用户将无法忍受。怎么办?只有再研究研究MFC的绘图过程了。实际上在OnDraw(CDC*pDC)中绘制的图并不是所有都显示了的例如:你在OnDraw中画了两个矩形在一次重绘中虽然两个矩形的绘制函数都有执行但是很有可能只有一个显示了这是因为MFC本身为了提高重绘的效率设置了裁剪区。裁剪区的作用就是:只有在这个区内的绘图过程才会真正有效在区外的是无效的即使在区外执行了绘图函数也是不会显示的。因为多数情况下窗口重绘的产生大多是因为窗口部分被遮挡或者窗口有滚动发生改变的区域并不是整个图形而只有一小部分这一部分需要改变的就是pDC中的裁剪区了。因为显示(往内存或者显存都叫显示)比绘图过程的计算要费时得多有了裁剪区后显示的就只是应该显示的部分大大提高了显示效率。但是这个裁剪区是MFC设置的它已经为我们提高了显示效率在进行复杂图形的绘制时如何进一步提高效率呢?那就只有去掉在裁剪区外的绘图过程了。可以先用pDC>GetClipBox()得到裁剪区然后在绘图时判断你的图形是否在这个区内如果在就画不在就不画。如果你的绘图过程不复杂这样做可能对你的绘图效率不会有提高。版主点评:本文系统地阐述了防止图形闪烁的方式其实归根结底防止闪烁的最终办法就是最好只重画改变的部分决不能先用背景色擦除全部再画上来

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/3

VC画图不闪烁的方法

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利