近来为了解决一个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代码估计都经过无数蹂躏了.这应当设计应该是经过反复设计和测试的.
写的有点乱,不知道你看明白没有