1.在OnCreateClient函数中有这样一段代码:
    m_splitter.CreateStatic(this, 2, 1);
    m_splitter.CreateView(0,0, pContext->m_pNewViewClass, CSize(200, 200), pContext); 
    m_splitter.CreateView(1,0, RUNTIME_CLASS(CIncomeDlg), CSize(200, 200), pContext); 
    m_splitter1.CreateStatic(&m_splitter ,1,2,WS_CHILD|WS_VISIBLE, m_splitter1.IdFromRowCol(0, 0));
    m_splitter1.CreateView(0,0,RUNTIME_CLASS(CIncomeDlg), CSize(200, 200), pContext); 
    m_splitter1.CreateView(0,0,RUNTIME_CLASS(CIncomeDlg), CSize(200, 200), pContext); 我的目的是,在第一个splitter的上下(0,0)中再创建一个splitter,分割成左右。编译无问题,但运行出错,想请教一下为什么,应该如何实现。2.因为在(1.0)是个CFormView,我创建了一个按钮,此按钮可以动态分割view,但我把按钮事件实现放在CMainFram中无法相应,我只能在CFormView中实现,让后((CMainFrame*)AfxGetMainWnd())->OnBnClickedButton1();我觉得这种实现有问题,想问问应该如何实现。

解决方案 »

  1.   

    1.
     m_splitter.CreateStatic(this, 2, 1);
     m_splitter1.CreateStatic(&m_splitter ,1,2,WS_CHILD|WS_VISIBLE, m_splitter1.IdFromRowCol(0, 0));
      m_splitter.CreateView(0,0, pContext->m_pNewViewClass, CSize(200, 200), pContext);  
      m_splitter.CreateView(1,0, RUNTIME_CLASS(CIncomeDlg), CSize(200, 200), pContext);  
     
      m_splitter1.CreateView(0,0,RUNTIME_CLASS(CIncomeDlg), CSize(200, 200), pContext);  
      m_splitter1.CreateView(0,0,RUNTIME_CLASS(CIncomeDlg), CSize(200, 200), pContext);  
    两个CreateStatic都先调用2.一般都在FormView里响应按钮消息,因为消息不传递到CMainFrame,非要在CMainFrame里响应,可以SendMessage给CMainFrame
      

  2.   

    好像还是不行啊,而且,我觉得这个应该跟先调用后掉用没关系,如果必须两个CreateStatic都先调用,那岂不是一旦分割完就不能再分割了么?虽然不是正解,不过仍然感谢兄台,都在学习么,还希望能再有朋友帮看看小弟的这两个问题。
      

  3.   


    嗯,说的对,我测试了一下,确实不必都先调用 :)
    我之前也有做过段代码,跟你的类似,你可参考一下,是正确的
    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
    CCreateContext* pContext)
    { CRect rt;
    GetClientRect(rt); if(m_wndSplitter1.CreateStatic(this,2,1)==NULL) 
    return FALSE; if(m_wndSplitter2.CreateStatic(&m_wndSplitter1,1,2,WS_CHILD|WS_VISIBLE,m_wndSplitter1.IdFromRowCol(0, 0))==NULL) return FALSE;  m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CProjTreeView),CSize(rt.Width()/3,0),pContext); m_wndSplitter2.CreateView(0,1,RUNTIME_CLASS(CRightInfoView),CSize(0,0),pContext);  m_wndSplitter1.CreateView(1,0,RUNTIME_CLASS(CUnDemoView),CSize(0,rt.Height()/3),pContext); m_wndSplitter1.SetRowInfo(0,2*rt.Height()/3,0); return TRUE;
    }
      

  4.   

    非常感谢,明白问题处在哪里了!再问兄台一句,如果我想用一个button动态分割view,应该用CSplitterWnd::Create吧,如果是在m_splitter的(1,0),那么是不是应该    CCreateContext   context; 
        context.m_pCurrentFrame   =   (CMainFrame*)m_splitter.GetPane(1,0); 
        context.m_pCurrentDoc   =   NULL; 
        context.m_pNewViewClass   =   RUNTIME_CLASS(CIncomeDlg); 
        context.m_pNewDocTemplate   =   NULL;     m_splitter.DeleteView(1,0);
        m_splitter2.Create(&m_splitter ,2,2, CSize(50, 50), &context);    m_splitter2.CreateView(0,0, 
            RUNTIME_CLASS(CIncomeDlg), CSize(200, 200), &context);     m_splitter2.CreateView(0,1, 
            RUNTIME_CLASS(CIncomeDlg), CSize(200, 200), &context);     m_splitter2.CreateView(1,0, 
            RUNTIME_CLASS(CIncomeDlg), CSize(200, 200), &context);     m_splitter2.CreateView(1,1, 
            RUNTIME_CLASS(CIncomeDlg), CSize(200, 200), &context); 
      

  5.   

    如果不想让鼠标拖动分割条,应该重载CSplitterWnd什么函数?
      

  6.   

    重写CSplitterWnd类,处理WM_MOUSEMOVE,WM_LBUTTONDOWN等消息