曲径通幽论坛

标题: 对窗口样式 WS_CLIPSIBLINGS 的解析 [打印本页]

作者: beyes    时间: 2012-1-29 16:22
标题: 对窗口样式 WS_CLIPSIBLINGS 的解析
对于窗口样式 WS_CLIPSIBLINGS 在 MSDN 里是这么解释的:
Clips child windows relative to each other; that is, when a particular child window receives a WM_PAINT message, the WS_CLIPSIBLINGS style clips all other overlapping child windows out of the region of the child window to be updated. If WS_CLIPSIBLINGS is not specified and child windows overlap, it is possible, when drawing within the client area of a child window, to draw within the client area of a neighboring child window.
翻译过来就是:
对相关的子窗口进行裁剪是指,当一个特定的子窗口收到一个 WM_PAINT 消息时,如果该子窗口具有 WS_CLIPSIBLINGS  样式属性,那么它会裁剪掉所有其它与之发生重叠的子窗口的那些要被更新的部分。如果没有指定 WS_CLIPSIBLINGS  样式属性,那么可能的情况是,当在一个子窗口的客户区绘图时,那么也会绘到相邻子窗口的客户区里。

下面假设有两个具有可拖拽边框子窗口(A, B)同落在一个父窗口中,如下图所示:
[attach]166[/attach]
其中 A 窗口具有 WS_CLIPSIBLINGS  样式属性,B 窗口可有可无。

接着,拖动 A 窗口,使之和 B 窗口重叠,如下图所示:
[attach]167[/attach]

由于 A 窗口是一个树形控件,点击节点可以展开,现在尝试展开:
[attach]168[/attach]
效果非常好,A 窗口的展开并没有影响到 B 窗口中的内容,这样看上去,似乎 A 窗口中被重叠的那部分已经被裁剪掉了。

但是,如果在程序中去掉 A 窗口的 WS_CLIPSIBLINGS 样式属性,再做上面同样的步骤,会看到:
[attach]169[/attach]
再看上图,效果明显差了。因为在我们展开 A 窗口的树时,实际上是在 A 窗口的客户区绘图,而 A 窗口此时又没有设置 WS_CLIPSIBLINGS 属性,那么它就会将“图”绘到相邻的子窗口的客户区里,这里的相邻子窗口就是 B 。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2