有关MFC中静态分割窗口的一点总结

        这两天遇到在MFC中静态分割窗口的操作,需要把以前项目中的四分平均窗口重新划分为三分窗口,去掉其中一个不需要的视图类,使得左侧为一个视图类,占整个窗口的一半;右侧为上下两个均分视图类,每个视图类占四分之一窗口。

        在修改过程中遇到了一点问题,现在说一下。

开始的项目中窗口布局是这样的:

有关MFC中静态分割窗口的一点总结_第1张图片      

        代码如下:

      CRect rc;
      GetClientRect(&rc);

      m_wndSplitter.CreateStatic(this,2,1);

      m_wndSplitter1.CreateStatic(&m_wndSplitter,1,2,WS_CHILD|WS_VISIBLE,m_wndSplitter.IdFromRowCol(0,0));
      m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CVideograbView),CSize((rc.right-rc.left)/2, (rc.bottom-rc.top)/2),pContext);
      m_wndSplitter1.CreateView(0,1,RUNTIME_CLASS(CVideoView1),CSize((rc.right-rc.left)/2, (rc.bottom-rc.top)/2),pContext); 

      m_wndSplitter2.CreateStatic(&m_wndSplitter,1,2,WS_CHILD|WS_VISIBLE,m_wndSplitter.IdFromRowCol(1,0));   
      m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CPicView),CSize((rc.right-rc.left)/2, (rc.bottom-rc.top)/2),pContext);  
      m_wndSplitter2.CreateView(0,1,RUNTIME_CLASS(CGISView),CSize((rc.right-rc.left)/2, (rc.bottom-rc.top)/2),pContext);


PS:CVideograbView为主视图类,CVideoView1、CPicView、CGISView为自己添加的视图类。


现在需要把右下角的视图类放到左侧,把左上和右上的两个视图类放到右侧上下均分,去掉CPicView视图类,如图所示:

有关MFC中静态分割窗口的一点总结_第2张图片


       开始的代码如下:

     CRect rc;
     GetClientRect(&rc);


     //创建分割窗口1行2列
     if(m_wndSplitter.CreateStatic(this,1,2) == NULL)
        return FALSE;

     //创建GIS的视图位置
     m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CGISView),CSize(rc.Width()/2,rc.Height()), pContext); 

     //为子窗口创建分割窗口   IdFromRowCol(0,1)中的(0,1)记录的是将要分割的位置,即未显示的那个部分(0,1)
     m_wndSplitter1.CreateStatic(&m_wndSplitter,2,1,WS_CHILD|WS_VISIBLE,m_wndSplitter.IdFromRowCol(0,1));  

     //创建监视器视图位置
     m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CVideograbView),CSize(rc.Width()/2, rc.Height()/2),pContext);
     m_wndSplitter1.CreateView(1,0,RUNTIME_CLASS(CVideoView1),CSize(rc.Width()/2, rc.Height()/2),pContext);


       可编译后运行时软件锁死无法运行,上网查了查资料,觉得有可能是因为必须先把CVideograbView主视图类创建后才能继续分割,所以把代码调整如下:

     CRect rc;
     GetClientRect(&rc);


     //创建分割窗口1行2列
     if(m_wndSplitter.CreateStatic(this,1,2) == NULL)
        return FALSE;

     //创建GIS的视图位置
     m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CVideograbView),CSize(rc.Width()/2,rc.Height()), pContext); 

     //为子窗口创建分割窗口   IdFromRowCol(0,1)中的(0,1)记录的是将要分割的位置,即未显示的那个部分(0,1)
     m_wndSplitter1.CreateStatic(&m_wndSplitter,2,1,WS_CHILD|WS_VISIBLE,m_wndSplitter.IdFromRowCol(0,1));  

     //创建监视器视图位置
     m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CGISView),CSize(rc.Width()/2, rc.Height()/2),pContext);
     m_wndSplitter1.CreateView(1,0,RUNTIME_CLASS(CVideoView1),CSize(rc.Width()/2, rc.Height()/2),pContext);

        把两个视图类交换了位置,这样一来能够顺利运行了,可是没有按照既定的位置显示视图区域,如图所示。

有关MFC中静态分割窗口的一点总结_第3张图片


        如何解决这个问题呢?难道必须先创建主视图类再分割才可以么?经过查阅和研究,突然想,要是先分割再创建不知道可以不?于是代码修改为了这样:

 

     CRect rc;
     GetClientRect(&rc);

     //创建分割窗口1行2列
     if(m_wndSplitter.CreateStatic(this,1,2) == NULL)
        return FALSE;

     //为子窗口创建分割窗口   IdFromRowCol(0,1)中的(0,1)记录的是将要分割的位置,即未显示的那个部分(0,1)
     m_wndSplitter1.CreateStatic(&m_wndSplitter,2,1,WS_CHILD|WS_VISIBLE,m_wndSplitter.IdFromRowCol(0,1));  

     //创建GIS的视图位置
     m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CGISView),CSize(rc.Width()/2,rc.Height()), pContext); 
     //创建监视器视图位置
     m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CVideograbView),CSize(rc.Width()/2, rc.Height()/2),pContext);
     m_wndSplitter1.CreateView(1,0,RUNTIME_CLASS(CVideoView1),CSize(rc.Width()/2, rc.Height()/2),pContext);
 

        这样便得到了预期的分割位置。

        最后别忘记了在发送命令的时候修改视图的位置,否则会出现报错。

你可能感兴趣的:(MFC,静态分割窗口,Splitter)