我建了一个单文档的工程CTest,里面有两个View类:CTestView和CTreeView。想获得CTestView类的指针,该如何做?如果只有一个类,可以用CTestView* pView = (CTestView*)((CMainFrame*)AfxGetMainWnd())->GetActiveFrame()->GetActiveView();
但是有两个View类该怎么做?谢谢大家了!

解决方案 »

  1.   

    你的两个VIEW是怎么创建 的?
      

  2.   

    一个是工程自带的,另一个是用CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)中m_splitterWnd.CreateView(...)
      

  3.   

    两个都是使用m_splitterWnd.CreateView(...)的
      

  4.   

    一、关于CSplitterWnd类
    我们在使用CuteFtp或者NetAnt等工具的时候,一般都会被其复杂的界面所吸引,在这些界面中窗口被分割为若干的区域,真正做到了窗口的任意分割。 那么我们自己如何创建类似的界面,也实现窗口的任意的分割呢 ?在VC6.0中这就需要使用到CSplitterWnd类。CSplitterWnd看上去像是一种特殊的框架窗口,每个窗口都被相同的或者不同的视图所填充。当窗口被切分后用户可以使用鼠标移动切分条来调整窗口的相对尺寸。虽然VC6.0支持从AppWizard中创建分割窗口,但是自动加入的分割条总是不能让我们满意,因此我们还是通过手工增加代码来熟悉这个类。 
    CSplitterWnd的构造函数主要包括下面三个。 BOOL Create(CWnd* pParentWnd,int nMaxRows,int nMaxCols,SIZE sizeMin,CCreateContext* pContext,DWORD dwStyle,UINT nID);
    功能描述:该函数用来创建动态切分窗口。 参数含义:pParentWnd 切分窗口的父框架窗口。 nMaxRows,nMaxCols是创建的最大的列数和行数。 sizeMin是窗格的现实大小。 pContext 大多数情况下传给父窗口。 nID是字窗口的ID号. BOOL CreateStatic(CWnd* pParentWnd,int nRows,int nCols,DWORD dwStyle,UINT nID) 
    功能描述:用来创建切分窗口。 参数含义同上。 BOOL CreateView (int row,int col,CruntimeClass* pViewClass,SIZE sizeinit,CcreateContext* pContext);
    功能描述:为静态切分的窗口的网格填充视图。在将视图于切分窗口联系在一起的时候必 须先将切分窗口创建好。 
    参数含义:同上。
    从CSplitterWnd源程序可以看出不管是使用动态创建Create还是使用静态创建CreateStatic,在函数中都调用了一个保护函数CreateCommon,从下面的CreateCommon函数中的关键代码可以看出创建CSplitterWnd的实质是创建了一系列的MDI子窗口。 
    DWORD dwCreateStyle = dwStyle & ~(WS_HSCROLL|WS_VSCROLL);
    if (afxData.bWin4) 
          dwCreateStyle &= ~WS_BORDER; //create with the same wnd-class as MDI-Frame (no erase bkgnd) 
    if (!CreateEx(0, _afxWndMDIFrame, NULL, dwCreateStyle, 
             0, 0, 0, 0,pParentWnd->m_hWnd, (HMENU)nID, NULL)) 
          return FALSE; // create invisible 
             二、创建嵌套分割窗口 
    2.1创建动态分割窗口
    动态分割窗口使用Create方法。下面的代码将创建2x2的窗格。 
    m_wndSplitter.Create(this,2,2,CSize(100,100),pContext);但是动态创建的分割窗口的窗格数目不能超过2x2,而且对于所有的窗格,都必须共享同一个视图,所受的限制也比较多,因此我们不将动态创建作为重点。我们的主要精力放在静态分割窗口的创建上。 
    2.2创建静态分割窗口
    与动态创建相比,静态创建的代码要简单许多,而且可以最多创建16x16的窗格。不同的窗格我们可以使用CreateView填充不同的视图。 
    在这里我们将创建CuteFtp的窗口分割。CuteFtp的分割情况如下: 
    CCuteFTPView 
    CView2 CView3 
    CView4 创建步骤: 
    ▲ 在创建之前我们必须先用AppWizard生成单文档CuteFTP,生成的视类为 CCuteFTPView.同时在增加三个视类或者从视类继承而来的派生类CView2,CView3 CView4. 
    ▲ 增加成员: 
    在Cmainfrm.h中我们将增加下面的代码: 
    CSplitterWnd wndSplitter1;
                     CSplitterWnd wndSplitter2;
    ▲ 重载CMainFrame::OnCreateClient()函数: BOOL CMainFrame::OnCreateClient( LPCREATESTRUCT  /*lpcs*/, CCreateContext* pContext) 
    { //创建一个静态分栏窗口,分为三行一列 
        if(m_wndSplitter1.CreateStatic(this,3,1)==NULL) 
                 return FALSE;
     //将CCuteFTPView连接到0行0列窗格上
        m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CCuteFTPView),CSize(100,100), pContext); 
        m_wndSplitter1.CreateView(2,0,RUNTIME_CLASS(CView4),CSize(100,100),pContext); 
     //将CView4连接到0行2列
        if(m_wndSplitter2.CreateStatic(&m_wndSplitter,1,2,WS_CHILD|WS_VISIBLE, 
             m_wndSplitter.IdFromRowCol(1, 0))==NULL) 
                  return FALSE; //将第1行0列再分开1行2列 
     //将CView2类连接到第二个分栏对象的0行0列
             m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CView2),CSize(400,300),pContext); 
     //将CView3类连接到第二个分栏对象的0行1列
             m_wndSplitter2.CreateView(0,1,RUNTIME_CLASS(CView3),CSize(400,300),pContext); 
                  return TRUE; 

    2.3实现各个分割区域的通信 
    ■有文档相连的视图之间的通信
    由AppWizard生成的CCuteFTPView是与文档相连的,同时我们也让CView2与文档相连,因此我们需要修改CCuteFTPApp的InitInstance()函数,我们将增加下面的部分。
    AddDocTemplate (new CMultiDocTemplate(IDR_VIEW2TYPE, 
             
             RUNTIME_CLASS(CMainDoc), 
             RUNTIME_CLASS(CMDIChildWnd), 
             RUNTIME_CLASS(CView2))); 
    我们现在来实现CCuteFTPView与CView2之间的通信。由于跟文档类相连的视图类 是不能安全的与除文档类之外的其余的视图类通信的。因此我们只能让他们都与文档 类通信。在文档中我们设置相应的指针以用来获的各个视图。我们重载 CCuteFTPView::OnOpenDocument()函数; 
    CCuteFTPView* pCuteFTPView;CView2* pView2;
    POSITION pos;
    CView* pView;
    while(pos!=NULL)
    {
         pView=GetNextView(pos); 
         if(pView->IsKindOf(RUNTIME_CLASS(CCuteFTPView))==NULL) 
             pCuteFTPView=(CCuteFTPView*)pView; 
         else(pView->IsKindOf(RUNTIME_CLASS(CCuteFTPView))==NULL) 
             pView2=(CView2*)pView; 

    这样我们在文档类中就获的了跟它相连的所有的视图的指针。
    如果需要在 CCuteFTPView中调用CView2中的一个方法DoIt()则代码如下: 
    CCuteFTPDoc* pDoc=GetDocument();CView2* pView2=pDoc->pView3;pView3.DoIt();