代码之家  ›  专栏  ›  技术社区  ›  Adrian

如何获得Spy++提供的父结构?

  •  2
  • Adrian  · 技术社区  · 7 年前

    在我们的代码中,一个C++类派生出来 CMDIChildWnd 是实例化的 Create() 函数被调用,这实际上是 CMDIChildWnd::Create() .第五个参数 pParentWnd 正在被设置为 CMDIFrameWnd 对象这反过来(在MFC代码中)建立了一个 CREATESTRUCT 对象,设置为 hwndParent 调用该参数,然后调用 PreCreateWindow() 将该对象作为参数之一传递。

    但是,当使用 CWnd::GetParent() (原件) GetAncestor(hwnd, GA_PARENT) (只是一次尝试,因为最初的代码不起作用,而且这个代码已经有20多年的历史了)甚至 GetWindow(hwnd, GW_OWNER) 只是想看看它是否出于某种原因设置了窗口的所有者。在每种情况下,我都看不到与 框架窗口类 对象相反,显示的父对象是桌面,所有者为空。

    使用Spy++,它显示了我的预期。如何以编程方式获得Spy++给出的布局?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Barmak Shemirani    7 年前

    在MDI接口中 CMDIChildWnd 通常会传递给 CMultiDocTemplate ,然后我们通过 CDocManager::OnFileNew 这反过来又会 CFrameWnd::LoadFrame 哪一个过去了 NULL 对于子窗口的父窗口(至少在VS 2017中)

    我们通常不打电话 mdi_child->Create 直接,除非我们手动初始化其他所有内容。也许你指的是底层阶级 CMDIChildWnd::Create 调用,或者您可以覆盖它。

    在儿童窗口,

    ::GetAncestor(m_hWnd, GA_ROOT) ::GetAncestor(m_hWnd, GA_ROOTOWNER)

    应该返回对主框架的引用,否则使用 AfxGetMainWnd()