窗口Z-Order顺序,组件tab-oder顺序,WS_CLIPCHILDREN/WS_CLIPSIBLINGS的再理解

刚看了 http://www.cnblogs.com/helloj2ee/archive/2009/05/29/1491822.html上" 关于WS_CLIPCHILDREN和WS_CLIPSIBLINGS的理解(个人认为还是相当全面的)" ,写的真是不错!但是也不能保证他写的都对,我下面以我自己的理解写的读后感,有参考他,还有M$自己的解释,虽然不一定都对,但是不理解的我也得先找个理由解释解释,否则心里不踏实。

读后感:

Z-Order:

windows窗口的排列顺序使用的是称之为Z序的排列方式Z-Order。屏幕一般以x轴y轴来表示位置,而以z轴来表示前后位置,x轴从左指向右,y轴从上指向下,z轴从屏幕内指向外。默认Z-Order的值越大,在屏幕上显示时会越靠上放。系统维护了一个z序列表来管理所有窗口的显示。

当打开一个窗口时,系统会将它显示到所有窗口的上面(不管z-order值的大小,唯一例外就是拥有top-most的窗口),所以我们能看到打开的窗口。当用户激活另外的窗口时,系统会改变失去和获得焦点的两个窗口的z-oder值,该值当然与z序列表同步。所以我们又能看到获得焦点的那个窗口把失去焦点的那个窗口盖住。在程序中可以调用BringWindowToTop,SetWindowPos 和 DeferWindowPos动态改变窗口的z-order值。

特别的,子窗口与父窗口的z-order值是一样的(我感觉是这样理解),比如拿对话框来说,它与其内的子控件的z-oder值是一样的,这样能保证对话框显示时子控件也跟着显示出来,它们其实是绑到一块啦。而子控件之间就依tab-order区分,tab-order值大的控件同位置上会覆盖值小的控件(除非加了WS_CLIPSIBLINGS样式),而作为对话框这个组件容器来讲默认它会覆盖其内的所有子组件(除非加了WS_CLIPCHILDREN样式),就好像它的tab-order值比任何其内的自组件都大!

WS_CLIPCHILDREN、WS_CLIPSIBLINGS:

虽然区分开父窗口和子窗口,但是子窗口其实就是画在了父窗口客户区上(你也可以理解为重叠了),因为默认父窗口总是覆盖了子窗口,所以重叠部分父窗口会先帮忙绘制,然后子窗口自己再绘制。如果窗口具有WS_CLIPCHILDREN样式,那意味着父窗口不帮忙画了,只子窗口自己绘制那个重叠区。它那个“图 3‑3 效果图”之所以会显示成那样是因为,当对话框窗口获得焦点时,因为它具有WS_CLIPCHILDREN样式,所以static控件它自己负责画自己,但是如果整个static的客户区它并不是都在画(它代码中是这样了,只画了客户区的4个边,还就是些了一个hello字),那么它自己也没画到的地方就没人画,所以只能透明了,于是我们就看到了对话框下面的窗口客户区上的内容。如果static控件负责到底把自己的客户区画满,也就没有透明这个问题了。子控件间的覆盖也是同样的道理。所以WS_CLIPCHILDREN、WS_CLIPSIBLINGS这两个样式道理是一样啦,只不过作用对象不同(父子间还是兄弟间)。

参考:http://msdn.microsoft.com/en-us/library/ms632599(v=vs.85).aspx之#Clipping锚点和#zorder锚点

你可能感兴趣的:(windows)