本来想实现动态画面,就是在屏幕上,画面不停的从右往左滚动(连续的滚动)。我使用的SetTimer(),定时刷屏,绘制新的点和曲线。每次重新画,也不是全部重绘,我每次都是将之前的屏幕画面通过 Bitblt()拷贝到内存,然后,在内存中,把新增点画上去,然后再bitblt到屏幕。这样,动态画面,效果达到了。
但是,如我在动态画面显示过程中,我点开工具栏或者其他的东西出现在屏幕上之后,竟然把这些东西也截取到屏幕上去了。但不是截取全部,只是截取了部分东西。
不知道各位有没有好的解决办法。
谢谢了,先

解决方案 »

  1.   

    你的绘制代码是在OnPaint里吗?要是的话,会重新刷新掉的啊
      

  2.   

    汗,每次这个问题大家都感觉看不懂:问题是这样的。我要实现动态画面,就像一条绳子一样,是源源不断的从右往左跑的,,所以,屏幕右边总是新出现的点,为了不至于每次刷屏的时候都把所有的点重绘,于是我使用了bitblt来先把当前的屏幕的画面拷贝到内存bmp图中,然后在内存对这个bmp图进行操作,把新的点加上去。下次刷屏的贴到屏幕,这样,就实现了动态的显示,而且是连续的。但是,比如我点击工具栏的  Edit,这是会出现下拉菜单,当时同时,bitble也在抓取屏幕上的图像。这样,下次贴上去的时候,下拉菜单也被截取上去了。
    我没有在onpaint中绘图。而是使用了SetTimer()定时,我设置的是500ms,在onTimer()中实现我上述的代码。
    不知道如何处理这个问题
      

  3.   

    代码比较多。但是大致就是这样的框架
    onTimer()
    {
          CDC memDC
          mem.Bitblt(0, 0, width, height, pDC, x,y);//这里实现将当前屏幕拷贝到位图中       然后会membitmap进行操作,包括添加新的点,等等       pDC->Bitblt()//这里就实现了吧内存位图贴到屏幕,这样,显示的就是动态效果
    }动态效果是初来了,如果你鼠标什么也不点,图像就是动态的,也没问题。如果你此时点击工具栏的东西,因为工具栏的东西一般都是下拉菜单,这个时候,这个时候,他也把下来菜单截取了。奇怪的是,没有截取全部的下拉菜单的全部内容,只是一个有3个像素差不多的边。这样,屏幕动态的时候,那个边也上去了。
      

  4.   

    你把OnTimer中的绘制代码放在OnPaint函数里
    不然就是这样的,你想啊,每次你移动一个东西到你的画面上,画面就会触发了重绘的消息了,就会走到OnPaint里。
      

  5.   

    绘制代码在OnPaint或者OnDraw里,在OnTimer里加上Invalidate,来使画面刷新。
      

  6.   


    绘制的函数在 onDraw()中调用,然后 onTimer()中调用 Invalidate() updateWindow(),结果闪屏。
      

  7.   


    其实我就是用的双缓冲。只不过我双缓冲,内存绘图的时候,是用bitblt截取上一次屏幕显示的内容,然后增加新的点和线条。然后内存绘图好了之后,再次使用bitblt贴到屏幕上去。这样做,动态绘图的效果我达到 了,而且效果也出来了。只是如果程序运行过程中,你打开菜单栏,下拉菜单出来的时候,下拉菜单会影响显示。不知道怎么解决。
    本来想利用双缓冲,内存中,每次都把所有的点重新绘制一遍,但是我的图像上,至少有10条动态曲线,这样的话,内存中一条一条的绘制好了之后,在贴到屏幕上,我怕会影响的显示速度,因为我这边需要100ms刷新一次数据。于是采用了截图的方法来实现,每次只需要画新的点。但是,比如此时屏幕有菜单点击了,会影响显示。
      

  8.   

    在VIEW类中添加ON_ERASEBKGND消息

    return TRUE;//屏蔽窗口自身的背景刷新,避免闪烁
    替换这个:
    return CWnd::OnEraseBkgnd(pDC);
      

  9.   

    LS的方法没有效果,虽然不闪了,但是我的动态效果没了。本来我的图像是从右向左推动的,结果,放在ondraw()中,推不动了。
      

  10.   

    你是不是OnPaint 和OnDraw都 有?
    要是的话把OnPaint删掉。
      

  11.   


    这么给你具体的描述一下:双缓冲:因为我的每次新增加的点都是在屏幕的最右边,那么,为了动态的显示出来,我必须是当前屏幕上的画面向左推动几个像素,这里我设置的是5个像素,这样,最左边的5个像素的图像就退出了屏幕。我是这样实现向左推动的:第一次使用bitblt,将当前屏幕上的图片截取到内存中,截取的时候,左边x方向上,少截取5个像素那么,在内存中的bitmap,右边就多出了5个像素了,新增的点都在最右边的,所以,内存重的bitmap上如此,以实现了动态向左推动的画面。正如我所说,如果你打开菜单,或者什么,挡住部分不管挡住多少,总会有5个像素点,显示的下拉菜单的东西,但是不是全部,因为只有5个像素,我如果设置,每次移动10个像素,那么菜单挡住后,就会有10个像素显示的是菜单的内容。跟时间没关系,我把刷新时间调大,还是会有上诉的问题。
      

  12.   

    我也觉得不要拷屏了,直接在内存中绘制好了,再bitblt上去,
    你拿出一块内存区来存放的数据,当新数据到来的时候,把最前面的数据移出,新的数据进去,数据的替换肯定很快了,再用这些数据绘制,应该不会有很长时间吧,除非是用在嵌入式。
      

  13.   

    你bitblt也是要时间的。这个时间和你计算数据替换来说,应该是计算速度快吧,毕竟计算与显示 ,还是显示速度慢
      

  14.   

    你的100ms说白了就是两个最小定时值的2倍,一般的定时器的处理间隔是50ms左右哦··
      

  15.   


    LS正解,我使用的就是 wince 5.0LS的方法,我一直想实现,只是最终还有一个忧虑:按照这种方式,最右边的那个点,比较好说,因为他一直就是在最右边,但是最左边的那个点就麻烦了。理论上,新增的点到来时,把最左边的那个店去掉。但是不知道你有没有考虑这个问题——————————————————————————
       B ·     ·        ·        ·            E·|
    ·                                               |
    A                                                |
                                                     |
                                                     |
                                                     |
    ———————————————————————— —上述图表示屏幕。我用这些点连接起来,成了一条曲线,A和B之间X轴向相对距离是5个像素。此时,新到一个点,他跟E点距离是2个像素,那么,正常思维,新增点到来,那么上次的点A就应该去掉。然后重新画,这个时候,B点实际上还未到达最左边,但是A点已经删掉了,此时,B跟屏幕嘴边应该是会有3个像素的空白区,没有曲线。
      

  16.   

    我现在也WINCE,每个画面有实时曲线,还有很多其它的图元,曲线的数据来源于网络是的组播数据。
    你不是定时来触发刷新的吗?那应该每两个点之间的时间应该相同啊。每隔一段相同的时间把数据采上来,再绘制,每两个点之间的时间差相同。
      

  17.   


    perfect!!完美。呵呵,画出屏幕之外的是偶,会不会报错?越界或者是其他的根据逻辑坐标  最上角是(0,0),为了实现这个效果,我曲线要从右往左画,画出屏幕范围,坐标是负数,会不会报错或者越界之内的?行,我先去试试。哎呀
    完美的解决方法。
      

  18.   

    我这个是在WINDOWS上组态好画面,把画面数据存起来,下载到下面,运行解析出来 ,在WINDOWS上组态的时候可以拖放N个实时曲线控件,每个实时曲线控件可以画四条曲线。曲线多了会不会影响速度,我要试试,目前我一般只放一个曲线控件在一幅画面里,但我的每个画面不仅是曲线,还有其它的复杂园元。我先试试拖几个看看,等等,要下班了。
      

  19.   

    应该不会报错的,随便你怎么画,API都帮你处理好了!