本来想实现动态画面,就是在屏幕上,画面不停的从右往左滚动(连续的滚动)。我使用的SetTimer(),定时刷屏,绘制新的点和曲线。每次重新画,也不是全部重绘,我每次都是将之前的屏幕画面通过 Bitblt()拷贝到内存,然后,在内存中,把新增点画上去,然后再bitblt到屏幕。这样,动态画面,效果达到了。
但是,如我在动态画面显示过程中,我点开工具栏或者其他的东西出现在屏幕上之后,竟然把这些东西也截取到屏幕上去了。但不是截取全部,只是截取了部分东西。
不知道各位有没有好的解决办法。
谢谢了,先
但是,如我在动态画面显示过程中,我点开工具栏或者其他的东西出现在屏幕上之后,竟然把这些东西也截取到屏幕上去了。但不是截取全部,只是截取了部分东西。
不知道各位有没有好的解决办法。
谢谢了,先
我没有在onpaint中绘图。而是使用了SetTimer()定时,我设置的是500ms,在onTimer()中实现我上述的代码。
不知道如何处理这个问题
onTimer()
{
CDC memDC
mem.Bitblt(0, 0, width, height, pDC, x,y);//这里实现将当前屏幕拷贝到位图中 然后会membitmap进行操作,包括添加新的点,等等 pDC->Bitblt()//这里就实现了吧内存位图贴到屏幕,这样,显示的就是动态效果
}动态效果是初来了,如果你鼠标什么也不点,图像就是动态的,也没问题。如果你此时点击工具栏的东西,因为工具栏的东西一般都是下拉菜单,这个时候,这个时候,他也把下来菜单截取了。奇怪的是,没有截取全部的下拉菜单的全部内容,只是一个有3个像素差不多的边。这样,屏幕动态的时候,那个边也上去了。
不然就是这样的,你想啊,每次你移动一个东西到你的画面上,画面就会触发了重绘的消息了,就会走到OnPaint里。
绘制的函数在 onDraw()中调用,然后 onTimer()中调用 Invalidate() updateWindow(),结果闪屏。
其实我就是用的双缓冲。只不过我双缓冲,内存绘图的时候,是用bitblt截取上一次屏幕显示的内容,然后增加新的点和线条。然后内存绘图好了之后,再次使用bitblt贴到屏幕上去。这样做,动态绘图的效果我达到 了,而且效果也出来了。只是如果程序运行过程中,你打开菜单栏,下拉菜单出来的时候,下拉菜单会影响显示。不知道怎么解决。
本来想利用双缓冲,内存中,每次都把所有的点重新绘制一遍,但是我的图像上,至少有10条动态曲线,这样的话,内存中一条一条的绘制好了之后,在贴到屏幕上,我怕会影响的显示速度,因为我这边需要100ms刷新一次数据。于是采用了截图的方法来实现,每次只需要画新的点。但是,比如此时屏幕有菜单点击了,会影响显示。
用
return TRUE;//屏蔽窗口自身的背景刷新,避免闪烁
替换这个:
return CWnd::OnEraseBkgnd(pDC);
要是的话把OnPaint删掉。
这么给你具体的描述一下:双缓冲:因为我的每次新增加的点都是在屏幕的最右边,那么,为了动态的显示出来,我必须是当前屏幕上的画面向左推动几个像素,这里我设置的是5个像素,这样,最左边的5个像素的图像就退出了屏幕。我是这样实现向左推动的:第一次使用bitblt,将当前屏幕上的图片截取到内存中,截取的时候,左边x方向上,少截取5个像素那么,在内存中的bitmap,右边就多出了5个像素了,新增的点都在最右边的,所以,内存重的bitmap上如此,以实现了动态向左推动的画面。正如我所说,如果你打开菜单,或者什么,挡住部分不管挡住多少,总会有5个像素点,显示的下拉菜单的东西,但是不是全部,因为只有5个像素,我如果设置,每次移动10个像素,那么菜单挡住后,就会有10个像素显示的是菜单的内容。跟时间没关系,我把刷新时间调大,还是会有上诉的问题。
你拿出一块内存区来存放的数据,当新数据到来的时候,把最前面的数据移出,新的数据进去,数据的替换肯定很快了,再用这些数据绘制,应该不会有很长时间吧,除非是用在嵌入式。
LS正解,我使用的就是 wince 5.0LS的方法,我一直想实现,只是最终还有一个忧虑:按照这种方式,最右边的那个点,比较好说,因为他一直就是在最右边,但是最左边的那个点就麻烦了。理论上,新增的点到来时,把最左边的那个店去掉。但是不知道你有没有考虑这个问题——————————————————————————
B · · · · E·|
· |
A |
|
|
|
———————————————————————— —上述图表示屏幕。我用这些点连接起来,成了一条曲线,A和B之间X轴向相对距离是5个像素。此时,新到一个点,他跟E点距离是2个像素,那么,正常思维,新增点到来,那么上次的点A就应该去掉。然后重新画,这个时候,B点实际上还未到达最左边,但是A点已经删掉了,此时,B跟屏幕嘴边应该是会有3个像素的空白区,没有曲线。
你不是定时来触发刷新的吗?那应该每两个点之间的时间应该相同啊。每隔一段相同的时间把数据采上来,再绘制,每两个点之间的时间差相同。
perfect!!完美。呵呵,画出屏幕之外的是偶,会不会报错?越界或者是其他的根据逻辑坐标 最上角是(0,0),为了实现这个效果,我曲线要从右往左画,画出屏幕范围,坐标是负数,会不会报错或者越界之内的?行,我先去试试。哎呀
完美的解决方法。