【问题标题】:Win32 window Owner vs window Parent?Win32窗口所有者与窗口父?
【发布时间】:2010-10-05 04:53:53
【问题描述】:

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

SetWindowLong(handle, GWL_HWNDPARENT, foo);

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

【问题讨论】:

标签: winapi window parent owner


【解决方案1】:

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

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

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

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

【讨论】:

【解决方案2】:

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

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

那么,就是这样:您遇到了错误代码,将其更改为 SetParent 或重构以做其他事情,然后继续?

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 也感谢窗口与窗口提示 - 有时这些事情在尝试与其他人讨论时会有点混乱。
      • 这是不正确的。一个窗口可以有父级或所有者,但不能同时拥有。
      • Raymond,我认为部分混淆是 Spy++ 和 GetAncestor(GA_PARENT) 将返回一个“在 HWND 树中上一级的下一个窗口”,即使对于顶级拥有的 HWND,通俗地说,他们有一个“父母”,即使内部没有这样跟踪。基本上有两种查看 HWND 树的方法;您使用 Spy++ / GetAncestor / EnumChildWindows / GetWindow(GA_FIRST/NEXT) 看到的幼稚的“以桌面为根的单一树”视图,然后是“面向内部”的视图,其中每个 HWND 都有一个单独的插槽,取决于父级或所有者在 WS_CHILD 上。
      • 是的。不幸的是,人们往往对术语草率,这只会加剧混乱。 (在内部,实际上有两个插槽,但 API 设计很“聪明”,并将它们公开为一个参数,根据上下文在两个插槽之间进行选择。)
      猜你喜欢
      • 2012-09-19
      • 2011-02-05
      • 2013-04-01
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 2010-11-06
      相关资源
      最近更新 更多