建一个多文档的MFC(model)程序后,在这个程序里有自动产生的CModelView,CModelDoc,CMainFrame几个类,新建一个Dialog,在这个Dialog的一个按钮事件里想要得到这个程序的几个view指针,也就是程序刚开始自动产生的那个view的指针,怎么得到?

解决方案 »

  1.   

    (CYourView*)GetActiveView();
    别忘了包含YourView.h和YourDoc.h。
      

  2.   

    可是这样获取的指针是空的啊!
    这是我的程序:
    CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
    CModelView *pV = (CModelView *) pFrame->GetActiveView();
    if (pV == NULL)
    {
    AfxMessageBox("null pV");
    return;
    }这样也是得到空指针:
    CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
    CMDIChildWnd *pChild = 
                 (CMDIChildWnd *) pFrame->GetActiveFrame();
    CModelView *pV = (CModelView *) pFrame->GetActiveView();
    if (pV == NULL)
    {
    AfxMessageBox("null pV");
    return;
    }
      

  3.   

    全局变量CModelView *pV;
    在CModelView的构造函数中pV=this,以后就可以在任何地方使用pV了。
      

  4.   

    为什么不能直接用了,现在AfxGetApp() 得到的是全局变量app的指针,我跟踪过是有这个指针,然后:
        AfxGetApp()->m_pMainWnd;也得到了,这个指针也存在,但是,
           在通过 GetActiveView();会得到空指针。
    我认为的原因是,现在在对话框中时,没有一个View是激活的,也即GetActiveView()是没有的,为空。
    上面说用一个全局变量来,我同意,但是不妥。
    我建议在CYourApp中加上一个变量CYourView * pv, 由它来保存刚才的VIEW指针,这样就可将此信息封装,从而使得代码有很好的移植性。
      

  5.   

    上面我说的有的错了,我再次创建了一个DOC/VIEW机制,发现可以获得GetActiveView()指针,不需要任何变量。
    不过注意的是应该包含头文件:
    #include "MainFrm.h"
    #include "TestViewDoc.h"
    #include "TestViewView.h"例:
    CTestViewView *pv;
    pv= (CTestViewView *) 
              ((CMainFrame*)(AfxGetApp()->m_pMainWnd))->GetActiveView();
    if(pv == NULL)
       AfxMessageBox("HILLO");
    else
    pv->m_pPrintString(CString("I LOVE YOU"));其中:CTestViewView::m_pPrintString(CString &str);
    代码如下:void CTestViewView::m_pPrintString(CString &str)
    { CClientDC dc(this);
    CRect rect;
    GetClientRect(&rect);
    dc.DrawText(str, str.GetLength()+1, rect,  
              DT_CENTER|DT_VCENTER|DT_SINGLELINE);
    }
    主要用来输出一些信息.我没发现任何错误。
      

  6.   

    TO:: wu4long()    我返回的还是null啊?!
      

  7.   

    这种做法不妨试一下
    1、向CModelApp类中添加一个CModelView类的成员变量
       CModelView m_pMyView;
    2、在CModelView的构造函数中,添加如下语句
       (CModelApp *)AfxGetApp()->m_pMyView = this;
    3、当需要使用View的指针时,
       (CModelApp *)AfxGetApp()->m_pMyView->XXXFunction(...);
       
      

  8.   

    wu4long()说的在单文档程序中可以让指针不为空,但是在多文档中却为空的,我试过,为什么会出现这种情况呢?
      

  9.   

    CMDIChildWnd * pChild =
             ((CMDIFrameWnd*)(AfxGetApp()->m_pMainWnd))->MDIGetActive();
     
          if ( !pChild )
              return NULL;
     
          CView * pView = pChild->GetActiveView();
    我的程序一直这么用,没有问题的
      

  10.   

    View指针已得到。在定义CMyView* pV的文件中必须按顺序包含:MainFrm.h,myDoc.h,myView.h三个文件,否则定义pV会出错,按这个问题郁闷了半天!