在我们的代码中,实例化了一个从CMDIChildWnd派生的C++类,并调用了它的Create()函数,该函数实际上是CMDIChildWnd::Create()。正在将第5个参数pParentWnd设置为CMDIFrameWnd对象。这反过来(在MFC代码中)设置一个CREATESTRUCT对象,将它的hwndParent设置为该参数,然后使用该对象作为其中一个参数传递来调用PreCreateWindow()。
然而,当使用CWnd::GetParent() (原始的) GetAncestor(hwnd, GA_PARENT) (只是尝试,因为原始的代码不工作,并且这段代码已经有20+年头了)甚至GetWindow(hwnd, GW_OWNER)进入父窗口列表时,只是想看看它是否出于某种原因设置了窗口的所有者。在每种情况下,我都看不到与CMDIFrameWnd对象关联的句柄。相反,显示的父对象是桌面,并且owner为空。
使用Spy++,它显示了我所期望的。如何以编程方式获得Spy++给出的布局?
发布于 2018-11-13 05:58:29
在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()
https://stackoverflow.com/questions/53256240
复制相似问题