令人困惑:在 CDialog 中检索 Parent Wnd,这是通过 SetParent 给出的

Confusing: Retrieve Parent Wnd in CDialog, that is given with SetParent

CView 派生的 class 中,我通过以下方式给对话框父级:

CTestDlg& dlg = m_TestDLg;
dlg.SetParent(this);
if (dlg.DoModal() != IDOK)
    return;

CTestDlg 中,我尝试使用

检索父级
CMyView* pTView_ = (CMyView*)GetParent();        // Wrong Parent pointer
CMyView* pTView2 = (CMyView*)GetParentOwner();   // Wrong Parent pointer  
CMyView* pTView3 = (CMyView*)m_pParentWnd;       // Wrong Parent pointer

我想用 SetParent() 我可以用 GetParent() 取回它。

甚至 doc in MSDN 也让我感到困惑。 Set/GetParent() 到底发生了什么?

不完全是答案,但这只有一个给了我想要的正确 Parent。
(所以我把它标记为我的解决方案)

CView* GenericGetActiveView()
{
  // Retrieve Active View
  CView* pActiveView = NULL;    

  CWnd* pWndMain = AfxGetMainWnd();
  if (NULL != pWndMain)
  {
    if (pWndMain->IsKindOf(RUNTIME_CLASS(CMDIFrameWnd)))
    {
        // MDI application
        CMDIChildWnd* pChild = ((CMDIFrameWnd*)(pWndMain->MDIGetActive();
        if (pChild)
            pActiveView = pChild->GetActiveView();  
    }
    else if (pWndMain->IsKindOf(RUNTIME_CLASS(CFrameWnd))) 
    {   
        // SDI appllication 
        pActiveView = ((CMainFrame*)pWndMain)->GetActiveView();
    }
    else
        TRACE(_T("Attention no MDI / SDI Main Wnd found!\n"));
  }

  return pActiveView;
}

@IInspectable 在他的评论中向我指出了这个方向。 (MFC内部有一个句柄映射,很容易造成意外结果)

只有 child windows(WS_CHILD 样式集)有 parent。 对于任何其他 window 样式,SetOwner 设置所有者 window。通过调用 GetOwner() 检索。

将 SetParent 的拼写错误更正为 SetOwner。