在 Win32 编程中,窗口的父级和窗口的所有者有什么区别?我以为我已经弄清楚了,然后我遇到了这段代码:
SetWindowLong(handle, GWL_HWNDPARENT, foo);
这实际上设置了窗口的所有者,而不是父级 - 尽管使用了 GWL_HWNDPARENT。父母/所有者这两个术语是否可以互换,或者实际上有区别?
所有权是两个顶级窗口之间的关系,而父级是顶级和 WS_CHILD 或 WS_CHILD 和另一个 WS_CHILD 之间的关系。
按钮的父级是它所在的窗体,而消息框由显示它的窗体拥有。
阅读 Microsoft Win32 Window Hierarchy and Styles中的这篇文章,以更清楚地了解 Ownership、Parenting、ZOrder、SetWindowLong、GetWindow 以及用于创建窗口关系的 Win32 api 的所有其他讨厌的部分。
编辑:看起来 Microsoft 删除了该内容,这是Ownership / Parenting 的另一个合理总结。
Owner 是负责控件或对话框的 Window*(例如,负责创建/销毁窗口)。
Parent 是窗口链中控件或对话框的下一个高级窗口*,但实际上并不对其负责(不一定关心它的生命周期等)。窗口的父级也可以是它的所有者。
*Window vs window:Window是屏幕上实际显示的窗口;window 是具有 HWND 的任何对象(包括按钮、面板等)。
陈的博客文章是值得阅读的。对我来说关键点是必须在子窗口上使用 WS_CHILD 样式。您可以尝试创建一个子窗口并将父句柄传递给 CreateWindow(),但如果您没有设置 WS_CHILD 样式,则两个窗口将具有所有者关系,而不是父/子关系。
这非常简单:代码错误。故事到此结束。
是的,有些窗口可能碰巧对这样的调用做出了积极的反应——不知道更好的人可能已经实现了对它的支持。Quoth 文档(它是旧文档) -您不能SetWindowLong
使用GWL_HWNDPARENT
索引调用来更改子窗口的父级。相反,请使用该SetParent
功能。
所以,它的全部内容:你遇到了错误的代码,将其更改SetParent
或重构以做其他事情,然后继续?