顶级(top-level window)窗口,被拥有窗口(owned window),子窗口(child window) 与WS_POPUP,WS_CHILD深入浅出

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必为有效的窗口句柄

おすすめ

転載: blog.csdn.net/qq_41607336/article/details/121171465