新建一MFC单文档工程,在CMyView::onCreate中想得到框架窗口指针,  
无论 CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd()
还是 CMainFrame *pFrame = (CMainFrame *)AfxGetApp()->m_pMainWnd
都不能在 ASSERT(::IsWindow(pFrame->m_hWnd)) 通过!
按理说 CMyView 类是 CMainFrame 类的子窗口, CMainFrame::m_hWnd 应该是有效句柄才对。
望指教!

解决方案 »

  1.   

    根据调试所得,CView和CFrameWnd的都调用了CreateWindowEx函数
    而在CMyView::OnCreate中的m_hWnd是有效的,说明CView调用CreateWindowEx成功了,
    也就是CMainFrame的m_hWnd也应该是有效的。
    CView调用的CreateWindowEx中dwStyle有WS_CHILD, 而hwndParent必须是有效窗口句柄,
    hwndParent当然是指CFrameWnd::m_hWnd了,否则会出现失败断言!
      

  2.   

    你可以放到CMyView::OnInitUpdate()里m_pOwner   =   (CMainFrame   *)AfxGetMainWnd();
      

  3.   

    CMainFrame* pFrame = (CMainFrame*)GetParent();
      

  4.   

    在InitInstance()中创建好主窗口后,要把主窗口的指针赋值给CXXXApp::m_pMainWnd成员,你可以这样做:CXxxApp::InitInstance()
    {
      ...
      CXxxFrame* pFrame = new CXxxFrame;
      m_pMainWnd = pFrame; // <----- 这一句才能保证AfxGetMainWnd()能获取到有效值
      pFrame->Create(...);
      ...
    }
      

  5.   

    我知道获取框架指针的方法,但想知道为什么在CMyView::OnCreate里就不行。
    在“调用堆栈”窗口中,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]
      

  6.   

    窗口创建是调用CreateWindowEx函数,在该函数中会发WM_CREATE消息给窗口函数(也就是OnCreate来响应),此时已有窗口句柄,但窗口创建并未完成,窗口函数返回0后,继续执行创建窗口的其它操作,之后从CreateWindowEx函数返回,此时窗口才真正创建完成。
    视图是在框架窗口的OnCreate函数中创建的,当执行到视图类的OnCreate函数时,框架窗口的创建尚未完成。