在Win32编程中,窗口的父窗口和窗口的所有者之间有什么区别?我以为我弄明白了,然后我遇到了这段代码:
SetWindowLong(handle, GWL_HWNDPARENT, foo);
这实际上设置了窗口的所有者,而不是父级 - 尽管使用了GWL_HWNDPARENT。父母/所有者这些术语是否可以互换,或者实际上是否存在差异?
答案 0 :(得分:27)
所有权是两个顶级窗口之间的关系,而Parent是顶级和WS_CHILD之间的关系,或WS_CHILD和另一个WS_CHILD。
按钮的父级是它所在的表单,而消息框由显示它的表单所有。
阅读Microsoft Win32 Window Hierarchy and Styles中的这篇文章,以便更清楚地了解所有权,育儿,ZOrder,SetWindowLong,GetWindow以及用于创建窗口关系的Win32 api的所有其他令人讨厌的内容。
编辑:看起来微软取消了这些内容,这是另一个合理的summary of Ownership / Parenting。
答案 1 :(得分:19)
所有者是负责控件或对话框的Window *(例如,负责创建/销毁窗口)。
Parent是窗口链中控件或对话框的下一个高级窗口*,但实际上并不负责它(不一定关心它的生命周期等)。窗口的父级也可以是其所有者。
*窗口与窗口:窗口是屏幕上显示的实际窗口; window是具有HWND的任何对象(包括按钮,面板等)。
答案 2 :(得分:1)
陈的博客文章是要读的。对我而言,关键是必须在子窗口上使用WS_CHILD样式。您可以尝试创建子窗口并将父句柄传递给CreateWindow(),但如果您没有设置WS_CHILD样式,则两个窗口将具有所有者关系,而不是父/子关系。
答案 3 :(得分:0)
这非常容易:代码错误。故事的结尾就在这里。
是的,某些窗口可能恰好对这种调用做出了反应-谁也不知道的人可能已经实现了对此的支持。大量文档(并且是旧文档)-您不得使用索引SetWindowLong
来调用GWL_HWNDPARENT
来更改子窗口的父窗口。而是使用SetParent
函数。
那么,这就是全部了:您遇到了错误的代码,将其更改为SetParent
或重构以执行其他操作,然后继续吗?