令人困惑:在 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。
在 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。