MFC 分割窗體

2021-05-21 18:53:55 字數 3098 閱讀 2259

mfc 分割窗體(splitter windows)

文件描述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 inte***ce)

以下將討論一些未公布的csplitterwnd的技術細節以便高階使用者來定製csplitterwnd;

這些api沒有官方文件公布同時在將來版本的mfc中極可能會被改變:

6.1 分割控制條(splitter bar)分割格(box) 和 分割位置跟蹤(tracker)的繪製

enum esplittype     ;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時)

MFC 視窗分割

動態分割視窗 bool cmainframe oncreateclient lpcreatestruct lpcs,ccreatecontext pcontext else return cframewnd oncreateclient lpcs,pcontext 靜態分割視窗 為mainframe...

MFC實現窗體透明

mfc建立透明窗體 1 設定窗體屬性為 layeredwindow,並設定窗體為無邊框窗體。設定窗體為layeredwindow long para getwindowlong this getsafehwnd gwl exstyle para ws ex layered setwindowlong...

MFC窗體大小變化

對話方塊的大小變化後,假若對話方塊上的控制項大小不變化,看起來會比較難看。下面就介紹怎麼讓對話方塊上的控制項隨著對話方塊的大小的變化自動調整。首先明確的是windows有乙個wm size訊息響應函式,這個函式在對話方塊大小發生變化的時候呼叫,所以我們可以記錄下原來對話方塊的大小,還有當前對話方塊的...