新建一MFC单文档工程,在CMyView::onCreate中想得到框架窗口指针,
无论 CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd()
还是 CMainFrame *pFrame = (CMainFrame *)AfxGetApp()->m_pMainWnd
都不能在 ASSERT(::IsWindow(pFrame->m_hWnd)) 通过!
按理说 CMyView 类是 CMainFrame 类的子窗口, CMainFrame::m_hWnd 应该是有效句柄才对。
望指教!
无论 CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd()
还是 CMainFrame *pFrame = (CMainFrame *)AfxGetApp()->m_pMainWnd
都不能在 ASSERT(::IsWindow(pFrame->m_hWnd)) 通过!
按理说 CMyView 类是 CMainFrame 类的子窗口, CMainFrame::m_hWnd 应该是有效句柄才对。
望指教!
而在CMyView::OnCreate中的m_hWnd是有效的,说明CView调用CreateWindowEx成功了,
也就是CMainFrame的m_hWnd也应该是有效的。
CView调用的CreateWindowEx中dwStyle有WS_CHILD, 而hwndParent必须是有效窗口句柄,
hwndParent当然是指CFrameWnd::m_hWnd了,否则会出现失败断言!
{
...
CXxxFrame* pFrame = new CXxxFrame;
m_pMainWnd = pFrame; // <----- 这一句才能保证AfxGetMainWnd()能获取到有效值
pFrame->Create(...);
...
}
在“调用堆栈”窗口中,CMainFrame::OnCreate确实是在CMyView::OnCreate之前。
int CMyView::OnCreate(LPCREATESTRUCT lpcs)
{
if( CView::OnCreate(lpcs) == -1 )
return -1; ASSERT(::IsWindow(lpcs->hwndParent)); [color=#FF0000]// 这样就能顺利通过 return 0;
}
[/color]
视图是在框架窗口的OnCreate函数中创建的,当执行到视图类的OnCreate函数时,框架窗口的创建尚未完成。