单文档视图分割实现了,但是视图间通信不成功!希望高手指点视图间的通信实现方式!
视图被我成功分割为3块,但是视图间的通信失败!无法实现相互访问成员函数和成员变量!!希望高手给出详细的实现方式!!
目前我在一个视图中的成员函数使用网上介绍的方式
void CLineView::OnBtnTree() 
{
// TODO: Add your control notification handler code here
CMainFrame* pMainFrame = (CMainFrame*)this->GetParent();
CInfoView* pView = (CInfoView*)pMainFrame->m_wndSplitter1.GetPane(0,0);
pView->Test();
}
结果运行到获取pView的指针时错误!希望高手指点错误的原因或者详细可行的实现方式!

解决方案 »

  1.   

    什么错误,是CInfoView* pView 返回结果为空吗
      

  2.   

    获取分割视图中各个视图的指针
    主框架中定义:CSplitterWnd m_wndSplitter;
    定义两个View类:CView1、CView2
    框架类中重载:
    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT, CCreateContext* pContext)
    {
    VERIFY(m_splitter.CreateStatic(this,2,1)); //分割成两行一列
    VERIFY(m_splitter.CreateView(0,0,RUNTIME_CLASS(CView1),CSize(100,100),pContext));
    VERIFY(m_splitter.CreateView(1,0,RUNTIME_CLASS(CView2),CSize(100,100),pContext));
    return TRUE;
    }
    获取分割视图指针CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();
    CView1* pView1 = (CView1*) pMainFrame->m_wndSplitter.GetPane(0,0);
    CView2* pView2 = (CView2*) pMainFrame->m_wndSplitter.GetPane(1,0);
      

  3.   

    视图类中GetParent得到的就是Splitter的指针。
      

  4.   

    不管是分割视图还是多视图,都应该通过绑定的文档类来通讯,也就是通过UpdateAllViews函数通知各个视图更新的时候。
      

  5.   

    /************************************************
    * 标   题 : 使用VC6.0实现窗口的任意分割 *
    * 用   途 : *
    * 整 理 人: ffww *
    * 整理日期: 2006-12-11 9:18:42 *
    * 附    注: ★★★ *
    *************************************************/
    一、关于CSplitterWnd类
    1、用来创建动态切分窗口
    BOOL Create(CWnd* pParentWnd,int nMaxRows,int nMaxCols,SIZE sizeMin,CCreateContext* pContext,DWORD dwStyle,UINT nID);
    2、用来创建静态切分窗口
    BOOL CreateStatic(CWnd* pParentWnd,int nRows,int nCols,DWORD dwStyle,UINT nID) 
    3、为静态切分的窗口的网格填充视图
    BOOL CreateView (int row,int col,CruntimeClass* pViewClass,SIZE sizeinit,CcreateContext* pContext); 
    4、参数说明
    pParentWnd 切分窗口的父框架窗口。
         nMaxRows,nMaxCols是创建的最大的列数和行数。 
         sizeMin是窗格的现实大小。 
         pContext 大多数情况下传给父窗口。 
         nID是字窗口的ID号. 
    二、创建嵌套分割窗口
    1、动态分割窗口
    动态分割窗口使用Create方法,例:m_wndSplitter.Create(this,2,2,CSize(100,100),pContext); 但是一般不使用动态分割,不实用
    2、静态分割窗口(适用于SDI、MDI程序)
    1)创建单文档ww,生成的视类为CWwView,从CFormView继承,在增加3个视类或者从视类继承而来的派生类CView2、CView3
    2)在框架类CMainFrame的.cpp文件中加入头文件,并在CWwView类定义前加上class CWwDoc;
    #include "view2.h"
    #include "view3.h"
    #include "wwView.h" //注意这里,必须在CWwView类定义前加上class CWwDoc;否则编译3条错误
    3)在框架类CMainFrame中增加成员: 
       CSplitterWnd m_wndSplitter1;
       CSplitterWnd m_wndSplitter2;
    4)利用ClassWizard重载CMainFrame::OnCreateClient()函数
    //----------------------------------------------------------------------------------------------
    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
    {
    //创建一个1行2列
    m_wndSplitter1.CreateStatic(this,1,2);
    //将CWwView连接到0行0列窗格上
    m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CWwView),CSize(100,100),pContext);
    //将窗口右边再分开2行1列
    m_wndSplitter2.CreateStatic(&m_wndSplitter1,2,1,WS_CHILD|WS_VISIBLE, m_wndSplitter1.IdFromRowCol(0, 1));
    m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CView2),CSize(100,100),pContext);
    m_wndSplitter2.CreateView(1,0,RUNTIME_CLASS(CView3),CSize(100,100),pContext);     return TRUE;
    }
      //----------------------------------------------------------------------------------------------
     
    注意:
    ① 必须为每个静态切分窗格创建视图窗口,不能漏掉一个;
    ② 如果从一个CformView类继承的视类,此对话框要作如下设置
    style=Child
    Border=None
    Visible=不选中
    ② 若在CWwView窗口上放入一TreeCtrl,为了在改变窗口时随窗口大小而改变(类似CB中的居中),可以在CWwView类的WM_SIZE中添加代码如下:
    //------------------------------------------------------------
    void CWwView::OnSize(UINT nType, int cx, int cy) 
    {
    CFormView::OnSize(nType, cx, cy);

    // TODO: Add your message handler code here
    if (GetSafeHwnd())
    {
    CRect rect;
    GetClientRect(&rect);
    if (m_TreeCtrl.GetSafeHwnd())
    m_TreeCtrl.MoveWindow(&rect);
    }

    }
    //------------------------------------------------------------
    //在WM_ONINITALUPDATE消息中,添加初始化数据
    void CWwView::OnInitialUpdate()
    {
    CFormView::OnInitialUpdate();
    GetParentFrame()->RecalcLayout();
    ResizeParentToFit();
    //上面的代码不用管,是啥就是啥,
    m_TreeCtrl.InsertItem("ListCtrl View", 1, 1);
    m_TreeCtrl.InsertItem("EditCtrl View", 2, 2);}三、实现各个分割区域的通信
    点击Button1按钮,在CView2中显示文字
    1、在CWwView的.cpp文件中加入:
    #include "view2.h"
    #include "MainFrm.h"
    2、添加按钮代码:
    //----------------------------------------------------------------------------------------------
    void CWwView::OnButton1() 
    {
    //得到一SplitterView的指针
    CView2 *pView=(CView2*)(((CMainFrame*)AfxGetMainWnd())->m_wndSplitter2.GetPane(0,0));
    //定义View的DC
    CClientDC dc(pView);
    dc.MoveTo(10,10);
    dc.LineTo(10,100);
    dc.TextOut(10,10,"m_wndSplitter2的0行0列就是CView2");
    }
    //----------------------------------------------------------------------------------------------