再议WS_CLIPSIBLINGS

近来为了解决一个bug.对WS_CLIPSIBLINGS做了深入的一番研究.

先看一个奇怪的现象.

先移动static1,再移动static2后.会出现重影现象.

如图:

 

首先看一下,static1和static2的属性.发现static1和static2都没有WS_CLIPSIBLINGS属性.

如果我为static1加上WS_CLIPSIBLINGS属性之后,就好了.

如图:

 

用小沈阳的一句名言就是,这是为什么尼

 

之前曾经转载过一遍关于WS_CLIPSIBLINGS的文章.不过当时理解不够深入.

现在写了一个demo测试了一下.

现在具体解释一下WS_CLIPSIBLINGS的意思.

 

具有WS_CLIPSIBLINGS属性的子窗口,当移动子窗口时,并不会移动在其z orde之上并且与其有重叠的窗口的部分.也就是会clip掉这些区域.但是是有条件的,1比现是z order在其之上,2是有重叠部分.

不具有WS_CLIPSIBLINGS属性的子窗口,当移动子窗口的时候,处理会比较简单,不管其他窗口的z order在我之上还是之上,统统移动.

 

注意这里用的是移动,而不是重绘.这里明确一下这两个概念,移动是window会直接在内存中对数据进行位的操作.而重绘是发生WM_PAINT消息来重绘.上面所述的两种情况,移动的子窗口是都不会收到WM_PAINT消息的.

 

另外,就是关于子窗口移动时,子窗口重绘的问题.

当某子窗口A的z order在B之上时,如果移动A,且A移动到的位置与B有重叠区域.则A并不会收到WM_PAINT消息.也就是说并不会重绘.

B也不会受到WM_PAINT消息.

 

当某子窗口B的z order在A之下,且部分区域被A覆盖,这时,如果移动A,A不会收到WM_PAINT消息,而B会收到WM_PAINT消息.

 

很容易理解window为什么会这样处理,只有在需要重绘的时候才会发送WM_PAINT消息.

windows代码估计都经过无数蹂躏了.这应当设计应该是经过反复设计和测试的.

 

写的有点乱,不知道你看明白没有

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值