最近编程遇到了难题绘制实时曲线,容易闪烁,还有就是速

上传人:ldj****22 文档编号:39815045 上传时间:2018-05-20 格式:DOC 页数:6 大小:53KB
返回 下载 相关 举报
最近编程遇到了难题绘制实时曲线,容易闪烁,还有就是速_第1页
第1页 / 共6页
最近编程遇到了难题绘制实时曲线,容易闪烁,还有就是速_第2页
第2页 / 共6页
最近编程遇到了难题绘制实时曲线,容易闪烁,还有就是速_第3页
第3页 / 共6页
最近编程遇到了难题绘制实时曲线,容易闪烁,还有就是速_第4页
第4页 / 共6页
最近编程遇到了难题绘制实时曲线,容易闪烁,还有就是速_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《最近编程遇到了难题绘制实时曲线,容易闪烁,还有就是速》由会员分享,可在线阅读,更多相关《最近编程遇到了难题绘制实时曲线,容易闪烁,还有就是速(6页珍藏版)》请在金锄头文库上搜索。

1、最近编程遇到了难题:绘制实时曲线,容易闪烁,还有就是速度不是太快。跟不上数据的变化速度。不知最近编程遇到了难题:绘制实时曲线,容易闪烁,还有就是速度不是太快。跟不上数据的变化速度。不知用用 VC 如何进行快速擦点和画点?如何进行快速擦点和画点?楼主楼主 enthusiasm1979(漾影)2005-02-27 09:55:56 在 VC/MFC / 图形处理/算法 提问最近编程遇到了难题:绘制实时曲线,容易闪烁,还有就是速度不是太快。跟不上数据的变化速度。不知用 VC 如何进行快速擦点和画点? 问题点数:0、回复次数:29 Top 1 楼楼 EnochShen(小疯子:真的好菜知耻而后勇!)回

2、复于 2005-02-27 11:16:12 得分 0 http:/ 主 题: 怎样做出 windows 那种无闪烁画图? 作 者: 7894561234 () 描述: 我知道在内存中做 然后贴上去 但那样还是很闪 回复人: windows_editor(等咱有钱了,每天早上喝两大碗豆浆) 显示图形如何避免闪烁 显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题。而且多数人认为 MFC 的绘图函数效率很低,总是想寻求其它的解决方案。MFC 的绘图效率的确不高但也不差,而且它的绘图函数使用非常简单,只要使用方法得当,再加上一些技巧,用 MFC 可以得到效率很高的绘图程序。我想就我长期(呵呵

3、当然也只有 2 年多)使用 MFC 绘图的经验谈谈 我的一些观点。 1、显示的图形为什么会闪烁? 我们的绘图过程大多放在 OnDraw 或者 OnPaint 函数中,OnDraw 在进行屏幕显示时是由 OnPaint 进行调用的。当窗口由于任何原因需要重绘时,总是先用背景色将显示区清除,然后才调用 OnPaint,而背景色往往与绘图内容反差很大,这样在短时间内背景色与显示图形的交替出现,使得显示窗口看起来在闪。如果将背景刷设置成 NULL,这样无论怎样重绘图形都不会闪了。 当然,这样做会使得窗口的显示乱成一团,因为重绘时没有背景色对原来绘制的图形进行清除,而又叠加上了新的图形。 有的人会说,闪

4、烁是因为绘图的速度太慢或者显示的图形太复杂造成的,其实这样说并不对,绘图的显示速度对闪烁的影响不是根本性的。例如在 OnDraw(CDC *pDC)中这样写: pDC-MoveTo(0,0); pDC-LineTo(100,100); 这个绘图过程应该是非常简单、非常快了吧,但是拉动窗口变化时还是会看见闪烁。其实从道理上讲,画图的过程越复杂越慢闪烁应该越少,因为绘图用的时间与用背景清除屏幕所花的时间的比例越大人对闪烁的感觉会越不明显。比如:清楚屏幕时间为 1s 绘图时间也是为 1s,这样在 10s 内的连续重画中就要闪烁 5 次;如果清楚屏幕时间为 1s 不变,而绘图时间为 9s,这样 10s

5、 内的连续重画只会闪烁一次。这个也可以试验,在 OnDraw(CDC *pDC)中这样写: for(int i=0;iMoveTo(0,i); pDC-LineTo(1000,i); 呵呵,程序有点变态,但是能说明问题。 说到这里可能又有人要说了,为什么一个简单图形看起来没有复杂图形那么闪呢?这是因为复杂图形占的面积大,重画时造成的反差比较大,所以感觉上要闪得厉害一些,但是闪烁频率要低。 那为什么动画的重画频率高,而看起来却不闪?这里,我就要再次强调了,闪烁是什么?闪烁就是反差,反差越大,闪烁越厉害。因为动画的连续两个帧之间的差异很小所以看起来不闪。如果不信,可以在动画的每一帧中间加一张纯白的

6、帧,不闪才怪呢。 2、如何避免闪烁 在知道图形显示闪烁的原因之后,对症下药就好办了。首先当然是去掉 MFC 提供的背景绘制过程了。实现的方法很多, * 可以在窗口形成时给窗口的注册类的背景刷付 NULL * 也可以在形成以后修改背景 static CBrush brush(RGB(255,0,0); SetClassLong(this-m_hWnd,GCL_HBRBACKGROUND,(LONG)(HBRUSH)brush); * 要简单也可以重载 OnEraseBkgnd(CDC* pDC)直接返回 TRUE 这样背景没有了,结果图形显示的确不闪了,但是显示也象前面所说的一样,变得一团乱。怎

7、么办?这就要用到双缓存的方法了。双缓冲就是除了在屏幕上有图形进行显示以外,在内存中也有图形在绘制。我们可以把要显示的图形先在内存中绘制好,然后再一次性的将内存中的图形按照一个点一个点地覆盖到屏幕上去(这个过程非常快,因为是非常规整的内存拷贝)。这样在内存中绘图时,随便用什么反差大的背景色进行清除都不会闪,因为看不见。当贴到屏幕上时,因为内存中最终的图形与屏幕显示图形差别很小(如果没有运动,当然就没有差别),这样看起来就不会闪。 3、如何实现双缓冲 首先给出实现的程序,然后再解释,同样是在 OnDraw(CDC *pDC)中: CDC MemDC; /首先定义一个显示设备对象 CBitmap M

8、emBitmap;/定义一个位图对象 /随后建立与屏幕显示兼容的内存显示设备 MemDC.CreateCompatibleDC(NULL); /这时还不能绘图,因为没有地方画 _ /下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小 MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); /将位图选入到内存显示设备中 /只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上 CBitmap *pOldBit=MemDC.SelectObject( /先用背景色将位图清除干净,这里我用的是白色作为背景 /你也可以用自己应该

9、用的颜色 MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255); /绘图 MemDC.MoveTo(); MemDC.LineTo(); /将内存中的图拷贝到屏幕上进行显示 pDC-BitBlt(0,0,nWidth,nHeight, /绘图完成后的清理 MemBitmap.DeleteObject(); MemDC.DeleteDC(); 上面的注释应该很详尽了,废话就不多说了。 4、如何提高绘图的效率 我主要做的是电力系统的网络图形的 CAD 软件,在一个窗口中往往要显示成千上万个电力元件,而每个元件又是由点、线、圆等基本图形构成。

10、如果真要在一次重绘过程重画这么多元件,可想而知这个过程是非常漫长的。如果加上了图形的浏览功能,鼠标拖动图形滚动时需要进行大量的重绘,速度会慢得让用户将无法忍受。怎么办?只有再研究研究 MFC 的绘图过程了。 实际上,在 OnDraw(CDC *pDC)中绘制的图并不是所有都显示了的,例如:你在 OnDraw 中画了两个矩形,在一次重绘中虽然两个矩形的绘制函数都有执行,但是很有可能只有一个显示了,这是因为MFC 本身为了提高重绘的效率设置了裁剪区。裁剪区的作用就是:只有在这个区内的绘图过程才会真正有效,在区外的是无效的,即使在区外执行了绘图函数也是不会显示的。因为多数情况下窗口重绘的产生大多是因

11、为窗口部分被遮挡或者窗口有滚动发生,改变的区域并不是整个图形而只有一小部分,这一部分需要改变的就是 pDC 中的裁剪区了。因为显示(往内存或者显存都叫显示)比绘图过程的计算要费时得多,有了裁剪区后显示的就只是应该显示的部分,大大提高了显示效率。但是这个裁剪区是 MFC 设置的,它已经为我们提高了显示效率,在进行复杂图形的绘制时如何进一步提高效率呢?那就只有去掉在裁剪区外的绘图过程了。可以先用 pDC-GetClipBox()得到裁剪区,然后在绘图时判断你的图形是否在这个区内,如果在就画,不在就不画。 如果你的绘图过程不复杂,这样做可能对你的绘图效率不会有提高。 Top2 楼楼 qrlvls(

12、空 气 )回复于 2005-02-27 11:42:28 得分 0 codeproject 上有一个 NTGraph,和 NI 的 MesureStudio 中的曲线图控件几乎一模一样,就象一个早期版本 Top3 楼楼 puhuofeie(扑火飞蛾)回复于 2005-02-28 08:24:46 得分 0 EnochShen(小疯子:真的好菜知耻而后勇!) 说得不错。 不过快速画点。用 cdc 的函数基本上可以了。 我也没有什么更快的方法。 你的采集点频率多大? Top4 楼楼 captainwh(wh)回复于 2005-02-28 09:09:44 得分 0 不会吧我也是实时绘制曲线,每秒

13、40 个数据点不会有闪烁啊 你是不是每次都把所有数据点都重绘了? 在窗口不需要刷新的情况下只画新的数据点 Top5 楼楼 zyfdanny(黄金分割点)回复于 2005-03-07 10:26:03 得分 0 mark Top6 楼楼 Featured(我握着爱情的门票静静排队)回复于 2005-03-07 15:18:42 得分 0 关于闪烁的问题,2003 年程序员合订本最后有介绍。 啊,就是小疯子贴的这张帖子。 赶紧留名,这帖子以后肯定能火。 Top7 楼楼 chijingde(AD)回复于 2005-03-08 15:54:41 得分 0 呵呵 楼上既然这么说了 俺就 mark 一下

14、Top8 楼楼 lyr311(老刘:别总在 CSDN 上逛!)回复于 2005-03-09 08:59:25 得分 0 好铁! Mark! Top9 楼楼 nlstone(天外流星)回复于 2005-03-09 17:49:40 得分 0 这么经典的问题没有 FAQ 吗? 我已经丧失了回答此类问题的勇气. Top10 楼楼 qiangv(专业顶贴,只问不答)回复于 2005-03-09 17:52:02 得分 0 mark Top11 楼楼 alanblack()回复于 2005-03-09 18:06:53 得分 0 Mark Top12 楼楼 a10002(A 万零贰)回复于 2005-0

15、3-09 23:52:28 得分 0 深刻! Top13 楼楼 ypjsp(无情冷雪)回复于 2005-04-15 05:57:57 得分 0 TO: EnochShen(小疯子:真的好菜知耻而后勇!) 好贴! 强! Top14 楼楼 inpriser(为伊消的人憔悴。)回复于 2005-04-18 16:22:13 得分 0 好!已经收藏啦 Top15 楼楼 wyu53(中心月)回复于 2005-04-25 14:09:50 得分 0 同样的问题,顶! Top16 楼楼 qrlvls( 空 气 )回复于 2005-04-25 14:39:28 得分 0 自己绘制实时曲线实在是费时费力,而且很难兼顾通用性 去 下载一个 NTGraph,几乎是 NI 公司曲线图的中期版本,堪称 perfect Top17 楼楼 kobelin1980()回复于 2005-04-25 20:03:18 得分 0 也收藏了 Top18 楼楼 Practise_Think(时代“过客”)回复于 2005-04-25 23:55:55

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号