CMainFrame* pMainFrame=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
CChildFrame* pChildFrame=(CChildFrame*)(pMainFrame->MDIGetActive());
CThread_MFCView* pView=(CThread_MFCView*)pChildFrame->GetActiveView();我用这三行代码未能得到我的视图指针,调试中,pMainFrame有值,但pChidlFrame却为空,然后接着中断了。网上的方法我都试了,皆以失败告终。请前辈赐教

解决方案 »

  1.   

    试试这样的:
    CMainFrame* pMainFrame=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
    CFrameWnd* pChildFrame= pMainFrame->GetActiveFrame();
    CThread_MFCView* pView=(CThread_MFCView*)pChildFrame->GetActiveView();
      

  2.   

    也不行。
    不过用你的方法,pChildFrame有值,但是pChildFrame的值和pMainFrame一样。
      

  3.   

    只能使用在CWinApp类中添加CView指针,然后在CView的OnInitUpdate里面保存视图指针了。不过还是想知道为什么上面的代码不行?
    高手快来啊
      

  4.   

    你想在线程函数直接操作view类指针?改用HWND窗口句柄吧,发送消息
      

  5.   

    可以试下给线程传值的时候,传CMainFrame的指针
      

  6.   

    我所过一下,有位高手给出了这样的解答:通常来讲,在MFC中,跨线程是不能传递CWnd对象指针的。因为在每个线程中都有一个自己的内部map,该map记录了HWND和与之对应的CWnd对象。当一个CWnd对象被创建时,它的HWND和CWnd对象指针就会被记录到该线程中的map,但其他的线程的map没有记录。 
    当跨线程传递CWnd指针时,调用CWnd的某些函数时,这些函数会进行有效性检查,也就是检查map,因为map中没有相应的记录,就会报错。通常这个错误是 AsserValid(this) 
    所以,在MFC中跨线程传递参数,最好传递句柄HWND,而不是CWnd对象指针。但是还是有很多疑惑,我发现在work thread中AfxGetMainWnd()有值,但是用它去MDIGetActive()却不行。另外我想问,谁能帮我解答一下传句柄然后由句柄得到指针,使用指针和直接使用指针会有哪些不同?
      

  7.   

    跨不跨线程直接把窗口指针传来传去都不好,充分利用Window的消息机制是一个好习惯。
    多View的时候遍历所有的View多麻烦。