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的影響。