Windows 桌面多个窗口的绘制问题

  1. 当桌面有多个应用程序窗口时,此时有仅有一个是活动窗口,其余的窗口是非激活的。认识这点是很重要的。

  2. 当一个窗口从激活态变为非激活态时会引起窗口的重绘;从非激活态变为激活态时也会引起窗口的重绘。

  3. 当一个窗口覆盖住另一个窗口时,如果把上层窗口移动走后露出底层窗口时,不会引起底层窗口的重绘,Windows也不会向底层窗口进程发送消息。

  4. 当一个激活态的窗口在桌面移动时(鼠标左键按住标题栏拖动),一般不会引起窗口客户区的重绘,但Windows会不断给窗口进程发送消息。如上所述,其他窗口进程也不会有重绘发生。

  5. 当一个窗口以非激活态显示在桌面时,当鼠标滑过该窗口时(未点击),Windows会正常把相关消息发送给窗口进程,窗口进程也能够正常进行消息的处理。

  6. 当鼠标移动到任务栏进程图标时,Windows会向应用程序发送消息,但窗口客户区一般不会发生重绘,除非是点击后程序状态发生改变,比如由激活态到最小化、非激活态到激活态等,会导致窗口发生重绘。

  这里引出一个问题,如果有多个窗口堆叠在桌面,其中仅有一个是激活态窗口,一般激活的窗口是最顶层的,当移动一个或者几个窗口时,Windows是怎么保证桌面是正确显示的呢?要知道移动一个窗口是不会引起被其覆盖的窗口的重绘事件的,但是被覆盖的窗口们依旧能够正确的显示,那么猜测Windows应该是维护了被覆盖窗口的像素映射了。首先,窗口或者桌面的改变、显示和消失肯定要与底层的显示设备通信,要确保底层像素的实时更新。那么Windows至少需要对所有的顶层的显示的窗口进行追踪和层次管理,当然最最顶层的还有对鼠标光标的绘制。一个可能的办法是对显示的顶层的所有窗口均维护一个窗口像素映射和叠置顺序的列表,当一个窗口变为激活态时,由于会重绘,可以从表中删除,当变为非激活态时,将像素映射加入表中,但是此方法随着显示的窗口越多就会消耗越多的内存。至于Windows内部究竟是如何控制绘制的,笔者也未能探究其实现原理。希望有大神答疑解惑!

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值