读后感:
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锚点