Win32 window Owner vs window Parent?

WinapiWindowParentOwner

Winapi Problem Overview


In Win32 programming, what is the difference between a window's parent and a window's owner? I thought I had it figured out, then I came across this code:

SetWindowLong(handle, GWL_HWNDPARENT, foo);

This actually sets the window's owner, not the parent - despite the GWL_HWNDPARENT being used. Are the terms parent/owner interchangeable, or is there actually a difference?

Winapi Solutions


Solution 1 - Winapi

Ownership is a relationship between two top level windows while Parent is a relationship between a top level and a WS_CHILD, or a WS_CHILD and another WS_CHILD.

The parent of a button is the form it is on, while a message box is owned by the form that showed it.

Read this article from Microsoft Win32 Window Hierarchy and Styles to get a much clearer understanding of Ownership, Parenting, ZOrder, SetWindowLong, GetWindow and all the other nasty bits of the Win32 api for creating window relationships.

EDIT: Looks like Microsoft took down that content, here is another reasonable summary of Ownership / Parenting.

Solution 2 - Winapi

Owner is the Window* responsible for a control or dialog (for example, responsible for creating/destroying the window).

Parent is the next-senior window* to a control or dialog in the window chain, but isn't actually responsible for it (doesn't necessarily care about its lifecycle, etc). A window's parent can also be its owner.

*Window vs window: Window is an actual window displayed on the screen; window is any object with a HWND (includes buttons, panels, etc).

Solution 3 - Winapi

Chen's blog post is the one to read. The key point for me is that the WS_CHILD style must be used on the child window. You can attempt to create a child window and pass the parent handle in to CreateWindow( ), but if you don't have the WS_CHILD style set the two windows will have the owner relationship, not the parent/child relationship.

Solution 4 - Winapi

It's super easy: the code is wrong. End of story right here.

Yes, some windows may happen to react favorably to such a call - someone not knowing any better may have implemented support for it. Quoth documentation (and it's old documentation) - You must not call SetWindowLong with the GWL_HWNDPARENT index to change the parent of a child window. Instead, use the SetParent function.

So, all there's to it: you came upon buggy code, change it to SetParent or refactor to do something else, and keep going?

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJon TackaburyView Question on Stackoverflow
Solution 1 - WinapiMaurice FlanaganView Answer on Stackoverflow
Solution 2 - WinapiTheSmurfView Answer on Stackoverflow
Solution 3 - WinapiosullivjView Answer on Stackoverflow
Solution 4 - WinapiKuba hasn't forgotten MonicaView Answer on Stackoverflow