Winapi Win32窗口所有者与窗口父级?

Winapi Win32窗口所有者与窗口父级?,winapi,window,parent,owner,Winapi,Window,Parent,Owner,在Win32编程中,窗口的父窗口和窗口的所有者之间有什么区别?我想我已经弄明白了,然后我遇到了以下代码: SetWindowLong(handle, GWL_HWNDPARENT, foo); 这实际上设置了窗口的所有者,而不是父窗口-尽管使用了GWL_HWNDPARENT。术语“父级/所有者”是可互换的,还是实际上有区别?所有者是负责控件或对话框的窗口*(例如,负责创建/销毁窗口) 父窗口是窗口链中控件或对话框的下一个高级窗口*,但实际上并不负责(不一定关心其生命周期等)。窗口的父窗口也可以

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

SetWindowLong(handle, GWL_HWNDPARENT, foo);

这实际上设置了窗口的所有者,而不是父窗口-尽管使用了GWL_HWNDPARENT。术语“父级/所有者”是可互换的,还是实际上有区别?

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

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


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

所有权是两个顶级窗口之间的关系,而父级是顶级窗口与WS_子级、WS_子级窗口与另一WS_子级窗口之间的关系

按钮的父级是它所在的窗体,而消息框则属于显示它的窗体

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


编辑:看起来微软删除了这些内容,这是另一个合理的解释。

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

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

是的,一些窗口可能会对这样的呼叫做出积极的反应-不知道更好的人可能已经实现了对它的支持。引用文档(它是旧的文档)-不能使用
GWL\uhwndprent
索引调用
SetWindowLong
来更改子窗口的父窗口。相反,请使用
SetParent
功能


所以,所有的一切都是这样的:你遇到了错误的代码,将其更改为
SetParent
或重构以做其他事情,然后继续进行?

同样感谢窗口与窗口的提示-有时这些事情在试图与其他人讨论时会有点混乱。这是不正确的。一个窗口可以有一个父窗口也可以有一个所有者,但不能同时有两个。Raymond,我认为混淆的一部分是Spy++和GetSenator(GA_parent)将返回一个“HWND树上一级的下一个窗口”,即使是顶级拥有的HWND,所以通俗地说,他们有一个“父窗口”,即使内部没有这样跟踪。基本上有两种方法可以查看HWND树;您在Spy++/Get祖先/EnumChildWindows/GetWindow(GA_FIRST/NEXT)中看到的朴素的“单树桌面根目录”视图,然后是“面向内部的”视图,其中每个HWND都有一个单独的插槽,该插槽是父插槽还是所有者,具体取决于WS_CHILD.Yes。不幸的是,人们往往对术语马虎,这只会加剧混乱。(在内部,实际上有两个插槽,但API设计“聪明”,并将它们公开为一个参数,根据上下文在两个插槽之间进行选择。)呸,MS已经删除了该内容:(完全解释陈雷蒙写了一篇关于的文章。陈雷蒙文章的更新URL:请接受当前接受的答案。它是不正确的。