MFC 分割表單(Splitter Windows)
<reference MSDN Microsoft Foundation Class Library and Templates TNO 029>
文檔描述MFC中的CSplitterWnd類,該類用來支援表單的分割和管理分割後每一個子窗格(pane)的大小
1 分割表單風格(Splitter Styles)
CSplitterWnd類支援2種不同風格的分割視窗
1.1 靜態分割(static splitter)
分割的窗格(pane)在分割表單(splitter window;)建立時建立,而且順序,數量不會變化,分割控制條(Splitter Bar)用來控制每個窗格的大小.通常不同的窗格是不同的視圖類(view class);
例如 Visual C++graphics 和 Windows檔案管理工具就是這個風格的分割表單;
該風格分割表單不會用到分割格(splitter box)
1.2 動態分割(dynamic splitter)
當使用者控制視圖的分割或停止分割, 附加窗格會被建立或銷毀; 這種動態分割開始於一個單獨的視圖,分割格(splitter box)用於初始化分割;當一個視圖可以在2個方向上被分割時,會有3個新的視圖被建立並顯示為3個新的窗格;當分割(split)被啟用(active)時,分割格(splitter box)會如同分割控制條(splitter bar)一樣在各個窗格間被繪製;當使用者除去分割時,附加窗格會被銷毀,只有原來的視圖(分割時位於0行0列位置的窗格)會被保留直到分割表單本身被銷毀;
例如 Microsoft Excel 和 Microsoft Word都是這種風格的分割表單;
當建立任意一種風格的分割表單時,必須給定分割表單的最大的行列數;
靜態風格的分割表單,每個窗格必須被建立CSplitterWnd::CreateView;
動態風格的分割表單 第一個窗格會在CSplitterWnd對象建立被自動建立
靜態風格的分割表單的最大行列數為 16 x 16
動態風格的分割表單的最大行列數為 2 x 2
推薦的分割方式為:
1 X 2 2 X 1 2 X 2
2 分割表單的例子(Splitter Samples)
很多MFC的列子程式都直接或間接的用到了分割表單 MFC入門程式Scripple程式的第4 部中就用到動態切分表單
MFC標準樣本中ViewEx展示靜態使用切分表單的方法,包括如何在一個切分表單中包含另一個切分表單
3 分割表單中使用的術語(Terminology Used By Implement)
CsplitterWnd(分割表單):
負責提供窗格切分空間和捲軸(同行(row)共用豎直捲軸(Vertical ScrollBar),同列(column)共用水平捲軸(Horizontal ScrollBar) );同時行列的下標從0, 0開始,言即第一個窗格為第0行 第0列的窗格
Pane(窗格)
CSplitterWnd管理的應用程式顯示資料的表單,一般而言窗格是一個視圖的衍生類別對象,實際上窗格可以是任意的從CWnd中派生的對象;
Splitter Bar(分割控制條)
在窗格行列間的控制項,用於控制行列上窗格的大小
Spliiter Box(分割格)
動態分割表單位於豎直捲軸最上的或水平捲軸最左位置的按鍵,用於建立新的分割窗格
Splitter Intersection(分割交叉點)
豎直或水平分割控制條的交叉點,可用於同步控制水平,豎直窗格的大小
4 共用捲軸(Shared Scroll Bars)
CSplitterWnd支援共用捲軸,捲軸是CSplitterWnd的子表單並且在分割表單中為不同的窗格所共用;
如在建立1X 2 CSplitterWnd時聲明了WS_VSCROLL分割 那麼2個窗格共用的豎直捲軸會建立如:
[ ][ ][^]
[pane00][pane01][|]
[ ][ ][v]
當移動捲軸時,WM_VSCROLL訊息會發送到2個窗格中同樣,同列的窗格可以共用水平捲軸
注意
在分割表單中共用捲軸是非常有用的,如果是2種不同的視圖使用共用捲軸 那麼就必須要協調滾動位置和視圖的顯示;所有視圖的衍生類別可以通過CWnd中的操作ScrollBar的方法來控制共用捲軸,但是一些非視圖衍生類別,沒有使用ScrollBar控制項的類 或 通過標準Window的實現方法的類如CEditView將不適合於共用捲軸
5 最小大小(Minimum size)
在分割表單中每一行都有最小高度限制,每一列都有最小寬度限制,這2個最小值用於控制窗格顯示資料最小大小;
靜態分割表單的最小大小為 0,0; 動態分割表單的最小大小可以在CSplitterWnd::建立時設定;
這些值可以同過SetColumnInfo 和 SetRowInfo來改變;
6 未公布的介面函數(protected interface)
以下將討論一些未公布的CSplitterWnd的技術細節以便進階使用者來定製CSplitterWnd;
這些API沒有官方文檔公布同時在將來版本的MFC中極可能會被改變:
6.1 分割控制條(splitter bar)分割格(box) 和 分割位置跟蹤(tracker)的繪製
enum ESplitType { splitBox, splitBar, splitIntersection, splitBorder };virtual void OnDrawSplitter(CDC* pDC, ESplitType nType, const CRect& rect);virtual void OnInvertTracker(const CRect& rect);這些虛函數可以用來實現不同圖形表現的分割表單
6.2 建立視圖和控制項
virtual BOOL CreateScrollBarCtrl(DWORD dwStyle, UINT nID);預設行為時建立捲軸,但是可以重載用於在捲軸邊建立新控制項
6.3 動態切分表單
virtual void DeleteView(int row, int col);virtual BOOL SplitRow(int cyBefore);virtual BOOL SplitColumn(int cxBefore);virtual void DeleteRow(int row);virtual void DeleteColumn(int row);用於實現動態分割表單的邏輯(當分割表單擁有風格SPLS_DYNAMIC_SPLIT時)