Q: What is a top-level window?
A : A top-level window is a window that is not child , i.e. it has not WS_CHILD style set.Notes
- unlike the child windows, a top-level window can be displayed anywhere in the screen;
- many definitions state that a top-level window is "a window that has no parent";
that is correct but can lead in a confusion: many people think that every window which is created passing a valid hWndParent in CreateWindow(Ex) "has a parent" then, according to the definition it is not top-level;
in fact hWndParent may be either a handle to parent or owner window;
if hWndParent is a valid window handle and WS_CHILD style is not set, then we have a top-level owned window; - a top-level window can or can not be owned but is never a child; further we can say that it can have an owner but never has aparent.
- top-level windows can be either overlapped windows (having WS_OVERLAPPED style and generally used as application main window) or popup windows (having WS_POPUP style, usually temporary windows like message boxes and dialogs);
- the coordinates used in CreateWindow(Ex), MoveWindow, SetWindowPos, and so on are always scren coordinates (relative to top-left corner of the screen).
// create a top-level window (not owned) HWND hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPED, // WS_CHILD style is not set, so it's a top-level window. CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, // no handle to the owner, so it's not owned. NULL, hInstance, NULL);
// create a top-level window (owned) HWND hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPED, // WS_CHILD style is not set, so it's a top-level window CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, hWndParent, // handle to the owner, so it's an owned window NULL, hInstance, NULL);
child window
A window that has the WS_CHILD style. A child window always appears within the client area of its parent window.
GetParent
The GetParent function retrieves a handle to the specified window's parent or owner.
If the window is a child window, the return value is a handle to the parent window. If the window is a top-level window, the return value is a handle to the owner window
CWnd::GetOwner
Retrieves a pointer to the owner of the window. If the window has no owner, then a pointer to the parent window object is returned by default. Note that the relationship between the owner and the owned differs from the parent-child aspect in several important aspects. For example, a window with a parent is confined to its parent window’s client area. Owned windows can be drawn at any location on the desktop.