本帖最后由 djf_1985 于 2011-05-29 10:07:16 编辑

解决方案 »

  1.   

    在CMainFrame::OnCreateClient添加分割代码
      

  2.   

    //成员变量声明
    CFixSplitterWnd m_wndSplitterH; //用于横向切割
    CFixSplitterWnd m_wndSplitterV; //用于纵向切割
    BOOL m_bCreateSplitter;//分割窗体的实现
    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
    {
    //对整个主框架进行混合分割视图
    BOOL bResult=m_wndSplitterV.CreateStatic(this,1,2);
    ASSERT(bResult);
    m_wndSplitterH.CreateStatic(&m_wndSplitterV,4,1,WS_CHILD | WS_VISIBLE,m_wndSplitterV.IdFromRowCol(0,1));
    //创建各自子窗片的对应的视图
    m_wndSplitterV.CreateView(0,0,RUNTIME_CLASS(CSceneView),CSize(600,600),pContext);
    m_wndSplitterH.CreateView(0,0,RUNTIME_CLASS(CPitchView),CSize(100,100),pContext);
    m_wndSplitterH.CreateView(1,0,RUNTIME_CLASS(CYawView),CSize(100,100),pContext);
    m_wndSplitterH.CreateView(2,0,RUNTIME_CLASS(CRollView),CSize(100,100),pContext);
    m_wndSplitterH.CreateView(3,0,RUNTIME_CLASS(CControlView),CSize(100,100),pContext);
    //设置窗格的初始化的大小
    m_wndSplitterV.SetRowInfo(0,IDEAL_RAWHEIGHT,0);
    m_bCreateSplitter=TRUE;
    //激活sceneview使得其可以接受命令消息
    m_wndSplitterV.SetActivePane(0,0,NULL);
    return bResult;
    }
    //主框架窗体大小发生变化,调节相应的窗体大小
    void CMainFrame::OnSize(UINT nType, int cx, int cy)
    {
    CMDIFrameWnd::OnSize(nType, cx, cy);
    CRect rect;
    GetClientRect(rect);
    if (m_bCreateSplitter)
    {
    m_wndSplitterV.SetColumnInfo(0,rect.Width() *3/4,10);
    m_wndSplitterV.SetColumnInfo(1,rect.Width() *1/4,10);
    m_wndSplitterH.SetRowInfo(0,rect.Height() /6,10);
    m_wndSplitterH.SetRowInfo(1,rect.Height() /6,10);
    m_wndSplitterH.SetRowInfo(2,rect.Height() /6,10);
    m_wndSplitterH.SetRowInfo(3,rect.Height()/2,10);
    }
    m_wndSplitterV.RecalcLayout();
    m_wndSplitterH.RecalcLayout();
    }
       注意m_wndSplitterH.CreateView 中的第二个参数,这个参数将分割窗体和相应的视图类相对应。
      

  3.   


    我看见也能在View中进行分割啊
    因为我主窗口中要显示不同的View,好几个视图进行切换的
    其中一个视图我需要进行分割,所以我想在此View中进行分割
      

  4.   

    只有主窗体的OnCreateClient提供了分割窗体的功能其中一个视图我需要进行分割,所以我想在此View中进行分割
    这里不能进行分割的,你只能进行不同的区域显示不同的数据,不能分割视图,视图必须依赖框架类,不能依赖视图类,这就是MFC的规定
      

  5.   


    哦,原来是这样啊,看来要学的东西很多啊
    如果我定义一个CMySplitterWnd继承CSplitterWnd,有没可能在视图中进行分割呢?不在框架类中进行。
    因为我看见有人这么做的,在视图中进行分割的,不过他有写个CMySplitterWnd
      

  6.   

    推荐你看一下《MFC深入浅出》,会受益匪浅的
      

  7.   


    额 那我来捧场吧 哈哈1.OnSize()
    2.MoveWindow()
    3.ReCalLayout()
    4. ...这几个是我遇到过的问题 ;)
      

  8.   

    重写CMainFrame类的OnCreateClient函数,在它里面去调用CSplitterWnd::CreateView()去拆分视图框架窗口,最后return TRUE;
      

  9.   


    我今天看了下公司的其他项目,确实有在视图类中对视图进行分割的啊,分成一个Cwnd,一个CFormView,不过我这样做,就什么也不显示了,不知道为什么,那位高人来帮我看看啊
      

  10.   

    用MainFrame::OnCreateClient添加分割代码,也可以切换view啊,还要在formview分割?直接加些控件撒
      

  11.   

    我认为在框架中添加 控件 应该可以达到你想要的效果。对 View 分割,还没有搞过。
      

  12.   

    胡说!
    在框架类里面可以分割视图
    在某个视图内也可以再分割视图
    甚至在某个视图内还可以创建框架后再分割视图
    这些我以前都实现过!!楼主的问题,我没有看你的代码。但我估计可能是创建的问题。应该是静态(static)创建才可以的。
      

  13.   

    给你一个参考吧,希望对你有用:
    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
    CCreateContext* pContext)
    {
    m_wndSplitter.CreateStatic(this,1,2);
    m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CInputView),CSize(580,400),pContext);
    m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CDisplayView),CSize(400,400),pContext);
    return TRUE;
    }
      

  14.   


    对啊,我就看到我们公司的项目能分割的,不过我自己写的就不行。
    我做的很简单
    就是在视图类头文件中定义了CSplitterWnd m_wndSplitter;
    然后在cpp的OnCreate
    中进行分割的m_wndSplitter.CreateStatic(this,1,2);
    CCreateContext *pContext=(CCreateContext*)lpCreateStruct->lpCreateParams;m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CView2),CSize(500,500), pContext); 
    m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CPatientEnrollView),CSize(500,500),pContext);
      

  15.   

    我知道视图分割的场所:主窗体的OnCreateClient中
    所用分割对象:CSplitterWnd m_wndSplitter25楼写的代码估计就是lz想要的,应该没问题。
      

  16.   

    感谢(vcf_reader) 的帮助!
    可以在视图类中进行分割,但必须响应视图类的WM_SIZE,在OnSize里面加
    m_wndSplitter.MoveWindow(0,0,cx+4,cy+4);
    m_wndSplitter.SetColumnInfo(0,520,0);
    m_wndSplitter.RecalcLayout();