55

在 Win32 编程中,窗口的父级和窗口的所有者有什么区别?我以为我已经弄清楚了,然后我遇到了这段代码:

SetWindowLong(handle, GWL_HWNDPARENT, foo);

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

4

4 回答 4

29

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

按钮的父级是它所在的窗体,而消息框由显示它的窗体拥有。

阅读 Microsoft Win32 Window Hierarchy and Styles中的这篇文章,以更清楚地了解 Ownership、Parenting、ZOrder、SetWindowLong、GetWindow 以及用于创建窗口关系的 Win32 api 的所有其他讨厌的部分。

编辑:看起来 Microsoft 删除了该内容,这是Ownership / Parenting 的另一个合理总结

于 2009-03-05T17:23:24.107 回答
20

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

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

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

于 2009-02-03T16:47:06.147 回答
1

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

于 2015-01-18T17:12:31.643 回答
0

这非常简单:代码错误。故事到此结束。

是的,有些窗口可能碰巧对这样的调用做出了积极的反应——不知道更好的人可能已经实现了对它的支持。Quoth 文档(它是文档) -您不能SetWindowLong使用GWL_HWNDPARENT索引调用来更改子窗口的父级。相反,请使用该SetParent功能。

所以,它的全部内容:你遇到了错误的代码,将其更改SetParent或重构以做其他事情,然后继续?

于 2020-06-30T02:28:06.483 回答