Win32窗口所有者与窗口父级?

在Win32编程中,窗口的父窗口和窗口的所有者有什么区别? 我想我已经想通了,然后我碰到这个代码:

SetWindowLong(handle, GWL_HWNDPARENT, foo); 

这实际上设置了窗口的所有者,而不是父级 – 尽pipe使用了GWL_HWNDPARENT。 父母/所有者的条款是可以互换的,还是实际上有区别?

所有者是窗口*负责控制或对话(例如,负责创build/销毁窗口)。

Parent是窗口链中控件或对话框的下一个高级窗口,但实际上并不负责(不一定关心其生命周期等)。 窗户的父母也可以是其所有者。

*窗口与窗口:窗口是显示在屏幕上的实际窗口; 窗口是具有HWND的任何对象(包括button,面板等)。

所有权是两个顶级窗口之间的关系,而Parent是顶级和WS_CHILD或WS_CHILD和另一个WS_CHILD之间的关系。

一个button的父母是它所在的窗体,而一个消息框是由显示它的窗体所拥有的。

从Microsoft Win32 Window Hierarchy and Styles中阅读这篇文章,可以更清楚地了解所有权,Parenting,ZOrder,SetWindowLong,GetWindow以及用于创build窗口关系的Win32 API的所有其他恶意位。

编辑:看起来像微软拿下的内容,这里是所有权/育儿的另一个合理的总结 。

Raymond Chen写了一篇关于“一个窗口可以有一个父母或一个拥有者,但不能同时拥有”的文章 。

在msdn上完全解释

陈的博客是一个阅读。 对我来说关键是WS_CHILD风格必须在子窗口上使用。 您可以尝试创build一个子窗口,并将父窗口句柄传递给CreateWindow(),但是如果您没有设置WS_CHILD样式,则两个窗口将拥有所有者关系,而不是父/子关系。

Interesting Posts