被遮挡和最小化之后,MFC程序的重绘是不一样的吗?

秀小川 2012-08-15 12:01:28
我现在有一个程序是用双缓冲绘图,我发现当我将程序最小化之后CPU的占有率有明显的降低!但是被别的程序遮挡以后没有发现CPU的使用率有明显下降!
我想请教下,这两种情况重绘不一样吗?
...全文
259 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
abc1010678455 2012-11-05
  • 打赏
  • 举报
回复
你好,我也是用这种方法显示图片的,为什么我最小化后图片就消失了呢???能不能帮帮我,先谢谢啦!!
秀小川 2012-08-17
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

引用 16 楼 的回复:

引用 15 楼 的回复:

程序最小化后根本不会响应WM_PAINT,CPU使用自然下降

不响应WM_PAINT,我双缓冲还是要在内存DC里面作图吧?

这得看你的双缓冲作图是不是写在OnPaint里的啊
[/Quote]
我不是在我的OnPaint()里面做图的,我是在我的一个MyDraw()函数里面做图,然后定时器定时,时间到了直接调用的MyDraw()函数!@ 而不是invalidate();!
这样也会和WM_PAINT有关系吗?
秀小川 2012-08-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

就是说你反正是不停的定时的BitBlt?

那可能操作系统在窗口最小化时,对BitBlt的调用直接返回了吧。
[/Quote]
也就是BitBlt这个函数的原因?
Eleven 2012-08-16
  • 打赏
  • 举报
回复
你最小化以后,系统应该不会给你的应用程序发送WM_PAINT消息吧
wocow3 2012-08-16
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

引用 15 楼 的回复:

程序最小化后根本不会响应WM_PAINT,CPU使用自然下降

不响应WM_PAINT,我双缓冲还是要在内存DC里面作图吧?
[/Quote]
这得看你的双缓冲作图是不是写在OnPaint里的啊
秀小川 2012-08-16
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

程序最小化后根本不会响应WM_PAINT,CPU使用自然下降
[/Quote]
不响应WM_PAINT,我双缓冲还是要在内存DC里面作图吧?
youngwolf 2012-08-16
  • 打赏
  • 举报
回复
就是说你反正是不停的定时的BitBlt?

那可能操作系统在窗口最小化时,对BitBlt的调用直接返回了吧。
wocow3 2012-08-16
  • 打赏
  • 举报
回复
程序最小化后根本不会响应WM_PAINT,CPU使用自然下降
yingzijuntuan 2012-08-16
  • 打赏
  • 举报
回复
路过。。。。对什么时候发出重绘消息还是比较迷糊呢!!!
秀小川 2012-08-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

你自己刷新是调用invalidate之类吧?
如果你处于最小化状态,系统根本不真正执行刷新操作,只是做个记录。
但如果不是最小化状态,而是被遮挡状态,不知道系统能否判断出来,我估计能不能,但不一定会这样做,因为还要排除没有遮挡完全的情况,效率不高。
你可以播放一个电影,然后挡住它的窗口,看会怎样。
[/Quote]
我没有用Invalidate,我是先在内存DC上绘图然后直接BitBlt贴图上去的,等于是将原来的覆盖掉!
按理说我最小化之后,他应该也要执行贴图程序吧?那为什么CPU的占有率不一样?
秀小川 2012-08-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

这个我还真不确定,BitBlt的源代码是看不到的。
你可以用一个for循环来做实现,比如BitBlt一百万次。看看在如下三种情况下,所耗时间及CPU占有量:

一:窗口在顶层;
二:窗口被完全覆盖;
三:窗口最小化。
[/Quote]
我试了一下,貌似和BitBlt无关! 完全覆盖和在顶层是一样的结果,最小化之后CPU占有率基本为0!
因为我用的是双缓冲绘图,我想会不会因为最小化以后没有DC了,所以就不存在内存DC作图了!所以CPU占有率低了!
貌似我这个程序中BitBlt贴图并不会很耗费CPU,主要全BitBlt贴图前在内存中绘制这幅图像很耗费CPU资源!
不知道怎么可以降低CPU的消耗!!!
youngwolf 2012-08-16
  • 打赏
  • 举报
回复
这个我还真不确定,BitBlt的源代码是看不到的。
你可以用一个for循环来做实现,比如BitBlt一百万次。看看在如下三种情况下,所耗时间及CPU占有量:

一:窗口在顶层;
二:窗口被完全覆盖;
三:窗口最小化。
youngwolf 2012-08-15
  • 打赏
  • 举报
回复
你自己刷新是调用invalidate之类吧?
如果你处于最小化状态,系统根本不真正执行刷新操作,只是做个记录。
但如果不是最小化状态,而是被遮挡状态,不知道系统能否判断出来,我估计能不能,但不一定会这样做,因为还要排除没有遮挡完全的情况,效率不高。
你可以播放一个电影,然后挡住它的窗口,看会怎样。
秀小川 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

是你自己一直在刷新窗口吧?
[/Quote]
嗯! 我是一秒刷新一次! 不过这样为什么遮盖和最小化的结果不一样?
youngwolf 2012-08-15
  • 打赏
  • 举报
回复
是你自己一直在刷新窗口吧?
秀小川 2012-08-15
  • 打赏
  • 举报
回复
我就是将我的浏览器全屏显示,将我的程序遮盖起来! 按理说没有任何显示,也没有什么透明窗体!怎么会有部分在显示?
henry.x 2012-08-15
  • 打赏
  • 举报
回复
楼上 正解 !
grf9527 2012-08-15
  • 打赏
  • 举报
回复

最小化就不可能显示。
被遮挡有可能显示,所以cpu消耗不一样
傻X 2012-08-15
  • 打赏
  • 举报
回复
对了,还有你说的完全遮挡,这个也是需要重绘的。
因为,你知道有个东西叫做透明窗体
傻X 2012-08-15
  • 打赏
  • 举报
回复
当然不一样了。
前者最小化,虽然你画的时候用的是控件所在HDC,但是HDC最终还是由屏幕的HDC来绘制。最小话之后等于说控件所在HDC不起作用了,不干活了。

后者,你虽然遮挡,但是任然有部分在屏幕显示,还是要调用屏幕的HDC来达到部分显示的目的。当然要重绘了。还是干原来的活,没少过。

CPU比例有差别了

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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