MFC 分割表單(Splitter Windows)

來源:互聯網
上載者:User

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時)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.