c++windowswindowatl

Wrong parent HWND in modal dialog


Why do i get desktop as a parent HWND for my modal dialog here?

class CSaveProfileAsDlg:
 public CSimpleDialog<IDD_DLG_RESOURCE>
{
  ....
  LRESULT OnInitDialog(UINT,  WPARAM, LPARAM, BOOL&)
  {
    ...
    HWND parent = GetParent(); // or GetAncestor(m_hWnd, GA_PARENT);
    assert(parent != GetDesktopWindow()); // not ok
    ...
  }
 ....
}


//somewhere in code
//m_hWnd is some valid HWND
assert(m_hWnd != GetDesktopWindow()); //ok
CSaveProfileAsDlg dlg;
dlg.DoModal(m_hWnd /*as a parent wnd*/);

I can "solve" it by passing corret HWND in CSaveProfileAsDlg ctor, but i'd like to have correct solution.

Thank you!


Solution

  • The documentation is very confusing but I think I found the problem. DoModal internally calls ::DialogBox(), one parameter of which takes a HWND named hWndParent. From the documentation:

    hWndParent [in, optional]
    Type: HWND
    A handle to the window that owns the dialog box.

    The keyword here is the word "owns". The section about owned windows confirms this:

    Dialog boxes and message boxes are owned windows by default. An application specifies the owner window when calling a function that creates a dialog box or message box.

    So we actually talk about the owner window instead of its parent. This makes sense as the dialog is a free floating window and not part of a window hierarchy as "parenthood" would imply.

    You can get the owning window by using:

    HWND parent = ::GetWindow(m_hWnd, GW_OWNER);