Win32窗口所有者vs窗口父?

Jon*_*ury 53 winapi window parent owner

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

SetWindowLong(handle, GWL_HWNDPARENT, foo);
Run Code Online (Sandbox Code Playgroud)

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

Mau*_*gan 28

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

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

阅读Microsoft Win32窗口层次结构和样式中的这篇文章,以更清楚地了解所有权,父母,ZOrder,SetWindowLong,GetWindow以及用于创建窗口关系的Win32 api的所有其他讨厌的位.

编辑:看起来微软取消了这些内容,这是所有权/育儿的另一个合理的总结.

  • http://web.archive.org/web/20100318062734/http://msdn.microsoft.com/en-us/library/ms997562.aspx (5认同)
  • Bah,MS已经把这些内容放下了.:( (4认同)

The*_*urf 20

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

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

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

  • 这是不正确的.窗口可以包含父级或所有者,但不能同时包含两者. (31认同)
  • 是.不幸的是,人们倾向于使用术语草率,这只会加剧混乱.(在内部,实际上有两个插槽,但API设计是"聪明的",并将它们公开为仅根据上下文在两个插槽之间选择的一个参数.) (6认同)
  • 感谢窗口与窗口提示 - 有时这些事情在尝试与其他人讨论时会有点混乱. (4认同)
  • Raymond,我认为部分混乱是Spy ++和GetAncestor(GA_PARENT)将在HWND树中返回"下一个窗口一级",即使对于顶级拥有的HWND,所以通俗地说,他们有一个'父',甚至如果内部没有这样跟踪.基本上有两种查看HWND树的方法; 您可以通过Spy ++/GetAncestor/EnumChildWindows/GetWindow(GA_FIRST/NEXT)看到天真的"植树桌面"单一树,然后是"内部导向"视图,其中每个HWND都有一个父级或所有者依赖的插槽在WS_CHILD上. (4认同)