在同一个软件中,CView与CMainFrame对象都是在程序一开始就创建出来的,我想在CView中存取CMainFrame中一些数据,实现两个对象的通信,就像在CView中得到文档指针实现数据交换一样。那么我在CView中应怎样得到CMainFrame对象的指针呢?用GetParent()和GetParentFrame()都不行。谢谢了。

解决方案 »

  1.   

    全局函数AfxGetApp可以得到CWinApp应用类指针 
    AfxGetApp()->m_pMainWnd为框架窗口指针 
    在框架窗口中:CFrameWnd::GetActiveDocument得到当前活动文档指针 
    在框架窗口中:CFrameWnd::GetActiveView得到当前活动视图指针 
    在视图中:CView::GetDocument得到对应的文档指针 
    在文档中:CDocument::GetFirstViewPosition,CDocument::GetNextView用来遍历所有和文档关联的视。 
    在文档中:CDocument::GetDocTemplate得到文档模板指针 
    在多文档界面中:CMDIFrameWnd::MDIGetActive得到当前活动的MDI子窗口
      

  2.   

    可以这样:
    CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();OK!
      

  3.   

    CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd()
      

  4.   

    AfxGetApp()->m_pMainWnd为框架窗口指针 
      

  5.   

    CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd()

    AfxGetApp()->m_pMainWnd
      

  6.   

    CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd()

    AfxGetApp()->m_pMainWnd
      

  7.   

    还是不行,其实如果在CView中包含MainFrm.h ,然后声明一个框架类成员变量的办法我也会,但因各种原因,我无法用这种方法。我在CMainFrame类中声明了一些成员变量,是想在CView 类中直接获取其框架窗口指针从而得到这些变量。 foxmail(萧遥) 的方法我用过了,也就是AfxGetApp()->m_pMainWnd。发现指向的都是其原有的变量与函数,而我定义的那些变量却一个都看不到,其效果与GetParent()或GetParentFrame()的效果一样。我怎样才能找回我的那些自定义变量啊!!!
      

  8.   

    怎么会看不到呢?
    你直接用就行了----只要你添加的变量不是private就可以了!!
    实在不行的话,你直接用自定义消息的方式去存取cmainframe中的变量
      

  9.   

    用以下语句:
    CMainFrame *pFrame = (CMainFrame*)(AfxGetApp()->m_pMainWnd);
    就可以获得CMainFrame的自定义成员了。
    顺便问一下,为什么不用MFC的Document/View框架,把一些属性定义在Document中,
    这样在view中访问则易如反掌。(用CView::GetDocument())。
      

  10.   

    注意,不能用AfxGetApp()->GetMainWnd()或AfxGetMainWnd(),他们只能获得CMainFrame父类的指针,而且可能是一个临时对象的指针,即使用CMainFrame*强制返回结果,也访问获取在CMainFrame中自定义的成员。
      

  11.   

    注意,不能用AfxGetApp()->GetMainWnd()或AfxGetMainWnd(),他们只能获得CMainFrame父类的指针,而且可能是一个临时对象的指针,即使用CMainFrame*强制返回结果,也无法访问获取在CMainFrame中自定义的成员。
      

  12.   

    你如果不想包含MainFrm.h头文件的话,你就只能用发送消息的方法了
    在CMainFrame中将你的数据组织成一个struct类型的变量,然后在消息响应函数中直接返回该变量的指针或者引用,从而在view中可以使用其中的数据了
      

  13.   

    CMainFrame *pFrame = (CMainFrame*)(AfxGetApp()->m_pMainWnd);
      

  14.   

    不想说了,大家都说完了,其实在mfc的document ,view,frame中每一个都可以
    随便访问另一个的没有什么障碍的,就拿从CView来访问说:
    AfxGetApp() or theApp --》CWinApp
    AfxGetMainWnd()---》CMainFrame
    GetParentFrame()--》CChildFrame
    GetDocument()---》CDocument
    而且外部的任何一个类,也都可以通过以Afx打头的一些函数访问文档视结构中
    的任何一个类,
      

  15.   

    感谢各位的热心,其实我遇到的问题也正如 “khwidesea(阔海)”所说的:“ 不能用AfxGetApp()->GetMainWnd()或AfxGetMainWnd(),他们只能获得CMainFrame父类的指针,而且可能是一个临时对象的指针,即使用CMainFrame*强制返回结果,也无法访问获取在CMainFrame中自定义的成员。”而CFrameWnd::GetActiveDocument和CFrameWnd::GetActiveView,AfxGetMainWnd()等等,得到的都是各个类的父类的函数和变量,我自定义的统统不生效。
        难道我只能包含MainFrame.h,然后再生成一个CMainFrm对象吗?可我觉得这好笨,明明已有了现成的CMainFrm对象,还要重新生成一个,而且这样我自定义的变量都要换成static型了(为了保持变量的值不随对象不同而变)。
         TO: khwidesea(阔海):我在CMainFrm中定义变量也是不得已,因为我用到了CDialog Bar组件,要用CMainFrm来管理,其中一些变化只能放在CMainFrm中的,但我却取不出来了,好郁闷。我也想过把其中的变量又转存到CDocument中,但又遇到上述同样的问题,得到的文档指针却是其父类的指针,又没了自定义的变量,又存不了了。
         TO:psusong(爱因思念):你说的发送消息的方法是怎么回事,我看不懂啊。
         大家还有什么好的办法,说出来讨论吧。
      

  16.   


             CMainFrame* pMainFrame = new CMainFrame;
    // pMainFrame = (CMainFrame*)GetParentFrame();
    或者
         pMainFrame = (CMainFrame *)AfxGetMainWnd();
      

  17.   

    MainFrm.h...
    CMainFrame* pMainFrame = new CMainFrame;
    if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
    return FALSE;
    m_pMainWnd = pMainFrame;
    .....
    #include "MainFrm.h"
    void youfuction(){
    ..
    CMainFrame* m_p =  (CMainFrame*)AfxGetApp()->m_pMainWnd;..
    }
      

  18.   


    不是太明白。因为,用GetParent()得到的 的确是临时指针,最好方法是用pWnd->m_hWnd 和 FromHandle()来存取 句柄。指针是临时的,句柄是不会变的。或许你的问题就解决了
      

  19.   

    ((CMainFrame *)AfxGetApp()->GetMainWnd())->
      

  20.   

    虽然最终还是得把MainFrm.h #include 到CView中,但zswzwy(←圣骑士!帕迪拉斯)
    lovetsinghua(瞌睡♂工作虫) 的方法很对,变量传递有同步性。很感谢各位的热心,
    谢谢,明天结贴了,谁还有不同意见不妨提出来。