再议WS_CLIPSIBLINGS

来源:互联网 发布:安卓版视频转换软件 编辑:程序博客网 时间:2024/05/16 08:27

近来为了解决一个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代码估计都经过无数蹂躏了.这应当设计应该是经过反复设计和测试的.

 

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

原创粉丝点击