bitblt()截屏出现问题

谭海燕 2010-03-23 10:42:51
本来想实现动态画面,就是在屏幕上,画面不停的从右往左滚动(连续的滚动)。

我使用的SetTimer(),定时刷屏,绘制新的点和曲线。

每次重新画,也不是全部重绘,我每次都是将之前的屏幕画面通过 Bitblt()拷贝到内存,然后,在内存中,把新增点画上去,

然后再bitblt到屏幕。这样,动态画面,效果达到了。


但是,如我在动态画面显示过程中,我点开工具栏或者其他的东西出现在屏幕上之后,竟然把这些东西也截取到屏幕上去了。但不是截取全部,只是截取了部分东西。


不知道各位有没有好的解决办法。


谢谢了,先
...全文
768 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
谭海燕 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 zxdyu2009 的回复:]
···
[/Quote]

我两个帖子一起结贴啊,你别见怪哈,我在那个帖子里面给你分
谭海燕 2010-03-23
  • 打赏
  • 举报
回复
我试试。谢谢
zxdyu2009 2010-03-23
  • 打赏
  • 举报
回复
绘制代码在OnPaint或者OnDraw里,在OnTimer里加上Invalidate,来使画面刷新。
zxdyu2009 2010-03-23
  • 打赏
  • 举报
回复
你把OnTimer中的绘制代码放在OnPaint函数里
不然就是这样的,你想啊,每次你移动一个东西到你的画面上,画面就会触发了重绘的消息了,就会走到OnPaint里。
谭海燕 2010-03-23
  • 打赏
  • 举报
回复
代码比较多。

但是大致就是这样的框架


onTimer()
{
CDC memDC
mem.Bitblt(0, 0, width, height, pDC, x,y);//这里实现将当前屏幕拷贝到位图中

然后会membitmap进行操作,包括添加新的点,等等

pDC->Bitblt()//这里就实现了吧内存位图贴到屏幕,这样,显示的就是动态效果


}

动态效果是初来了,如果你鼠标什么也不点,图像就是动态的,也没问题。如果你此时点击工具栏的东西,因为工具栏的东西一般都是下拉菜单,这个时候,这个时候,他也把下来菜单截取了。

奇怪的是,没有截取全部的下拉菜单的全部内容,只是一个有3个像素差不多的边。

这样,屏幕动态的时候,那个边也上去了。
谭海燕 2010-03-23
  • 打赏
  • 举报
回复
汗,每次这个问题大家都感觉看不懂:

问题是这样的。我要实现动态画面,就像一条绳子一样,是源源不断的从右往左跑的,,所以,屏幕右边

总是新出现的点,为了不至于每次刷屏的时候都把所有的点重绘,于是我使用了bitblt来先把当前的屏幕的画

面拷贝到内存bmp图中,然后在内存对这个bmp图进行操作,把新的点加上去。下次刷屏的贴到屏幕,这样,就

实现了动态的显示,而且是连续的。但是,比如我点击工具栏的 Edit,这是会出现下拉菜单,当时同时,

bitble也在抓取屏幕上的图像。这样,下次贴上去的时候,下拉菜单也被截取上去了。


我没有在onpaint中绘图。

而是使用了SetTimer()定时,我设置的是500ms,在onTimer()中实现我上述的代码。


不知道如何处理这个问题

fandh 2010-03-23
  • 打赏
  • 举报
回复
建议贴代码!
我怀疑,你其它的东西正在显示或者隐藏的时候,截屏的!
你可以看一下其它的软件,截屏的时候,先最小化!
zxdyu2009 2010-03-23
  • 打赏
  • 举报
回复
你的绘制代码是在OnPaint里吗?要是的话,会重新刷新掉的啊
rageliu 2010-03-23
  • 打赏
  • 举报
回复
哎,居然没看明白问题
谭海燕 2010-03-23
  • 打赏
  • 举报
回复
恩。好的。我代码实际的去试试。


如果有那种抓图的方法,只抓取画面,不抓取打开的窗口,比如菜单之内的,就更好了。

呵呵


感谢各位。我先试试
VC_ZSY 2010-03-23
  • 打赏
  • 举报
回复
如果错误也好办啊,你就把那个点画成纵坐标是0就可以了,不是很好吗,界面更加友好了一点了
VC_ZSY 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 feiyinzilgd 的回复:]

引用 33 楼 vc_zsy 的回复:
引用 30 楼 feiyinzilgd 的回复:

引用 29 楼 vc_zsy 的回复:
这个是你算法的问题吧,好好研究研究·说实话呢我没看懂你的描述··哈哈··




说白了,就是这个问题:最左边的那个点,是最旧的点,新的点到来,这个最旧的点应该在动态数组中删除。

但是这个最旧的点删除的时候,跟他相连的线就没了。但是屏幕向左推……
[/Quote]
应该不会报错的,随便你怎么画,API都帮你处理好了!
rzsheng 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 feiyinzilgd 的回复:]
引用 7 楼 zxdyu2009 的回复:
绘制代码在OnPaint或者OnDraw里,在OnTimer里加上Invalidate,来使画面刷新。


绘制的函数在 onDraw()中调用,然后 onTimer()中调用 Invalidate() updateWindow(),

结果闪屏。
[/Quote]

使用双缓冲可以避免闪屏
zxdyu2009 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 feiyinzilgd 的回复:]

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


哦?那你的画面实时曲线点多不多?双缓冲,效果如何?对现实有没有影响?

关于上述的问题,我已经想好了解决的算……
[/Quote]
我这个是在WINDOWS上组态好画面,把画面数据存起来,下载到下面,运行解析出来 ,在WINDOWS上组态的时候可以拖放N个实时曲线控件,每个实时曲线控件可以画四条曲线。曲线多了会不会影响速度,我要试试,目前我一般只放一个曲线控件在一幅画面里,但我的每个画面不仅是曲线,还有其它的复杂园元。我先试试拖几个看看,等等,要下班了。
谭海燕 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 vc_zsy 的回复:]
引用 30 楼 feiyinzilgd 的回复:

引用 29 楼 vc_zsy 的回复:
这个是你算法的问题吧,好好研究研究·说实话呢我没看懂你的描述··哈哈··




说白了,就是这个问题:最左边的那个点,是最旧的点,新的点到来,这个最旧的点应该在动态数组中删除。

但是这个最旧的点删除的时候,跟他相连的线就没了。但是屏幕向左推动的距离要小于 这个最旧 点和倒数第

……
[/Quote]

perfect!!

完美。

呵呵,画出屏幕之外的是偶,会不会报错?越界或者是其他的

根据逻辑坐标 最上角是(0,0),为了实现这个效果,我曲线要从右往左画,画出屏幕范围,坐标是负数,

会不会报错或者越界之内的?

行,我先去试试。哎呀。。。


完美的解决方法。

VC_ZSY 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 feiyinzilgd 的回复:]

引用 29 楼 vc_zsy 的回复:
这个是你算法的问题吧,好好研究研究·说实话呢我没看懂你的描述··哈哈··




说白了,就是这个问题:最左边的那个点,是最旧的点,新的点到来,这个最旧的点应该在动态数组中删除。

但是这个最旧的点删除的时候,跟他相连的线就没了。但是屏幕向左推动的距离要小于 这个最旧 点和倒数第

二旧的点的距离,导致倒数第二个点成为最旧的点的时候,……
[/Quote]
早点这么描述就好了,好办,你做一个判断,当添加新的节点的时候,判断要删除的节点所连接的节点是否在最左边,如果不在,说明还要画线,你就不要删除这个节点了,继续这么话,如果话在窗口外的点是不会显示的,这样那条线还在!
谭海燕 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 zxdyu2009 的回复:]
我现在也WINCE,每个画面有实时曲线,还有很多其它的图元,曲线的数据来源于网络是的组播数据。
你不是定时来触发刷新的吗?那应该每两个点之间的时间应该相同啊。每隔一段相同的时间把数据采上来,再绘制,每两个点之间的时间差相同。
[/Quote]

哦?那你的画面实时曲线点多不多?双缓冲,效果如何?对现实有没有影响?

关于上述的问题,我已经想好了解决的算法,然后,就是看会不会影响显示效果,就是我说的那个

每次所有点重新内存中画会不会慢的问题。

呵呵
zxdyu2009 2010-03-23
  • 打赏
  • 举报
回复
我现在也WINCE,每个画面有实时曲线,还有很多其它的图元,曲线的数据来源于网络是的组播数据。
你不是定时来触发刷新的吗?那应该每两个点之间的时间应该相同啊。每隔一段相同的时间把数据采上来,再绘制,每两个点之间的时间差相同。
谭海燕 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 vc_zsy 的回复:]
这个是你算法的问题吧,好好研究研究·说实话呢我没看懂你的描述··哈哈··
[/Quote]



说白了,就是这个问题:最左边的那个点,是最旧的点,新的点到来,这个最旧的点应该在动态数组中删除。

但是这个最旧的点删除的时候,跟他相连的线就没了。但是屏幕向左推动的距离要小于 这个最旧 点和倒数第

二旧的点的距离,导致倒数第二个点成为最旧的点的时候,实际上,他还没能到达屏幕的最左边,那么,这个

之间就有了空白,没有曲线
VC_ZSY 2010-03-23
  • 打赏
  • 举报
回复
这个是你算法的问题吧,好好研究研究·说实话呢我没看懂你的描述··哈哈··
加载更多回复(20)

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧