这两天遇到在MFC中静态分割窗口的操作,需要把以前项目中的四分平均窗口重新划分为三分窗口,去掉其中一个不需要的视图类,使得左侧为一个视图类,占整个窗口的一半;右侧为上下两个均分视图类,每个视图类占四分之一窗口。
在修改过程中遇到了一点问题,现在说一下。
开始的项目中窗口布局是这样的:
代码如下:
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视图类,如图所示:
开始的代码如下:
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);
把两个视图类交换了位置,这样一来能够顺利运行了,可是没有按照既定的位置显示视图区域,如图所示。
如何解决这个问题呢?难道必须先创建主视图类再分割才可以么?经过查阅和研究,突然想,要是先分割再创建不知道可以不?于是代码修改为了这样:
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);
这样便得到了预期的分割位置。
最后别忘记了在发送命令的时候修改视图的位置,否则会出现报错。