1.首先是CsplitterWnd的关键的几个参数
// implementation attributes which control layout of the splitter
int m_cxSplitter, m_cySplitter; // size of splitter bar
int m_cxBorderShare, m_cyBorderShare; // space on either side of splitter
int m_cxSplitterGap, m_cySplitterGap; // amount of space between panes
int m_cxBorder, m_cyBorder; // borders in client area
m_cxSplitter, m_cySplitter就是分隔条的粗细。当这两个值比m_cxSplitterGap或者m_cySplitterGap小或者相等的时候,才能完全显示m_cxSplitter, m_cySplitter所设定大小的分隔条,否则显示分隔条的大小以m_cxSplitterGap或者m_cySplitterGap的大小为准。
m_cxSplitterGap, m_cySplitterGap就是分割窗体面板(各个view)之间的间隔,并且间隔占用的空间根据行列方向而定。如果是横向排列相邻的两个子面板,那么这个间隔占用空间由右边的子窗体提供;如果是纵向排列相邻的两个子窗体,那么这个间隔占用空间由下面的子窗体提供。
m_cxBorder, m_cyBorder;就是各个分割窗体面板(各个view)的边界的大小。
m_cxBorderShare, m_cyBorderShare就是紧邻分隔条其中一边与这一边子窗体边界之间的预留空间大小,如果m_cxBorderShare值为正,则预留空间在分隔条的左边,如果m_cxBorderShare值为负则在右边。对于纵向,m_cyBorderShare道理一样。
这四对变量之间的关系就是m_cxSplitterGap, m_cySplitterGap就是单纯的两个分割子窗体之间的间隔,不会跟子窗体有交,不受其他参数的影响。m_cxSplitter, m_cySplitter就是单纯的分隔条的大小,可能会跟分割子窗体有交,也就是被子窗体覆盖部分。
m_cxSplitterGap = m_cySplitterGap = 25;
m_cxBorder = m_cyBorder = 0;
m_cxBorderShare = m_cyBorderShare = 5;
m_cxSplitter = m_cySplitter = 10;
可得到如下
上面的图示在SplitterGap比其他参数大的情况下。可以看出,BorderShare为正的时候,横向就是从子窗体的右边开始到相邻分隔条之间的间隔,纵向就是上面的子窗体的下边界到相邻分隔条之间的高度,反之亦然。
把m_cxSplitterGap, m_cySplitterGap改成比其他参数小的情况如下:
m_cxSplitterGap = m_cySplitterGap = 3;
m_cxBorder = m_cyBorder = 0;
m_cxBorderShare = m_cyBorderShare = 5;
m_cxSplitter = m_cySplitter = 10;
这时候的界面是
2.关于子窗体view大小的理解,有如下创建代码
m_wndSplitternd.CreateView(0,0,RUNTIME_CLASS(CXYZSliceView),CSize(lv_width,lv_height),pContext);
m_wndSplitternd.CreateView(0,1,RUNTIME_CLASS(CXYZSliceView),CSize(lv_width,lv_height),pContext);
m_wndSplitternd.CreateView(1,0,RUNTIME_CLASS(CXYZSliceView),CSize(lv_width,lv_height),pContext);
m_wndSplitternd.CreateView(1,1,RUNTIME_CLASS(CLiverDemoView),CSize(lv_width,lv_height),pContext);
那么所创建的view的大小区域一定是1中的图的黑色部分背景的大小,因为view的大小主要受m_cxSplitterGap和m_cySplitterGap的影响。