CreateWindow
在介绍众多概念前先看一下创建窗口的函数,如下所示:
当创建该窗口的hWndParent为有效的窗口句柄时,代表他被拥有了,这里我很想吐槽微软,为什么名字起的让人感觉他们可能是母子窗。后来看到文档里如下一段描述才恍然大悟:
hWndParent是母窗口或拥有者窗口 的句柄,该函数创建子窗口或被拥有者窗口,但该参数对于WS_POPUP风格的窗口是可选的,看来这个函数创建的窗口,有可能是子窗口,也有可能是被拥有窗口,更有可能俩者都不是,也就是下面所谓的top-level window(当然top-level window也可以被拥有,毕竟对WS_POPUP来说,该参数可选意思就是能有拥有者也能没有),那什么情况下是所谓的子窗口(child window),什么情况下又是所谓的被拥有窗口(owned window),什么情况下又是所谓的顶级窗口(top-level window)?请看下面介绍。
被拥有窗口(owned window)
当hWndParent代表的是有效的句柄时。
子窗口(child window)
当拥有WS_CHILD该风格时,且hWndParent代表的是有效的句柄时。
顶级窗口(top-level window)
不具备WS_CHILD。
总结
顶级窗口可被拥有,也可不被拥有,也就是hWndParent可以为0,也可以是别的窗口句柄。但不能拥有WS_CHIDL。
(1)它可以显示在屏幕任何位置。
子窗口必被拥有,它的hWndParent不能为0,必有WS_CHILD。
(1)他必然显示在父窗口的坐标体系里。并且只能显示在客户端。
(2)他的移动伴随着父窗口的移动而移动。
(3)当父窗口销毁时,他也跟着被销毁。
被拥有窗口不一定是子窗口,hWndParent为别的有效窗口句柄,但有没有WS_CHILD都可以。
(1)当父窗口不显示时,他也跟着不显示。
(2)永远显示在拥有它的窗口的前面。
(3)当父窗口销毁时,他也跟着被销毁。
例子
俩个top-level window并且都没被拥有
绿框处俩个图标,彼此的显示与否不影响对方。
两个top-level window 但其中一个是另一个的拥有窗口
看下图绿框,只有一个图标,并且没法实现一个显示,另一个不显示,而且被拥有窗口永远显示在拥有窗口前面。
一个top-level window 一个child window
如下图,子窗口必须有WS_CHILD,他只能显示在父窗口坐标体系,并且点击它,他也不能处于激活状态。而是它的父窗口被激活。看子窗口的标题栏始终灰色。当然你若是吧子窗口设置成无边框风格,那他也不能在父窗口里移动了。
精简总结
顶级窗口必不能有WS_CHILD
子窗口必有WS_CHILD
被拥有窗口hWndParent必为有效的窗口句柄