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

时间:2009-02-03 16:30:56

标签: winapi window parent owner

在Win32编程中,窗口的父窗口和窗口的所有者之间有什么区别?我以为我弄明白了,然后我遇到了这段代码:

SetWindowLong(handle, GWL_HWNDPARENT, foo);

这实际上设置了窗口的所有者,而不是父级 - 尽管使用了GWL_HWNDPARENT。父母/所有者这些术语是否可以互换,或者实际上是否存在差异?

4 个答案:

答案 0 :(得分:27)

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

按钮的父级是它所在的表单,而消息框由显示它的表单所有。

阅读Microsoft Win32 Window Hierarchy and Styles中的这篇文章,以便更清楚地了解所有权,育儿,ZOrder,SetWindowLong,GetWindow以及用于创建窗口关系的Win32 api的所有其他令人讨厌的内容。

编辑:看起来微软取消了这些内容,这是另一个合理的summary of Ownership / Parenting

答案 1 :(得分:19)

所有者是负责控件或对话框的Window *(例如,负责创建/销毁窗口)。

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

这非常容易:代码错误。故事的结尾就在这里。

是的,某些窗口可能恰好对这种调用做出了反应-谁也不知道的人可能已经实现了对此的支持。大量文档(并且是文档)-您不得使用索引SetWindowLong来调用GWL_HWNDPARENT来更改子窗口的父窗口。而是使用SetParent函数。

那么,这就是全部了:您遇到了错误的代码,将其更改为SetParent或重构以执行其他操作,然后继续吗?