分割視圖

分割視圖

分割窗口將窗口分成幾個部分,每個部分通常代表一個視圖(但也可以是具有子窗口標識的CWnd對象),又稱窗格。

分割視圖簡介


如圖所示。如果想在一個窗口裡面觀察文檔的不同部分,或者是在一個窗口裡用不同類型的視圖(比如用圖表和表格)觀察同一個文檔,那麼採用分割窗口是非常方便的。許多優秀的軟體都採用了分割窗口技術,因此我們有必要掌握分割窗口的用法。
分割窗口分為兩類:動態分割窗口和靜態分割窗口。
動態分割窗口是指:用戶可以動態的分割和除去分割窗口,分割窗口會創建和刪除相應的窗格。Microsoft Word就是使用動態分割窗口的例子,這是一種最常用的分割窗口。動態分割窗口最多可以有2行´ 2列個格。
靜態分割窗口是指:在窗口創建時,分割窗口的窗格就已經創建好了,且窗格的數量和順序不會改變。窗格為一個分割條所分割,用戶可以拖動分割條調整相應的窗格的大小。

CSplitterWnd類


MFC中的分割窗口類-CSplitterWnd類提供了分割窗口的功能。CSplitterWnd類中包含一個分割器窗口,該分割器窗口就是一個包含多個窗格的窗口。我們分割窗口時就是直接在此分割器窗口中分割的。
下面介紹三個最常用的成員函數:
virtual BOOL Create(
CWnd* pParentWnd,
int nMaxRows,
int nMaxCols,
SIZE sizeMin,
CCreateContext* pContext,
DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | SPLS_DYNAMIC_SPLIT,
UINT nID = AFX_IDW_PANE_FIRST
);
創建動態分割窗口。參數pParentWnd為分割器窗口的父框架窗口;參數nMaxRows為分割器窗口的最大行數,不能超過2;參數nMaxCols為分割器窗口的最大列數,也不能超過2;參數sizeMin為窗格能顯示的最小尺寸,如果窗格尺寸小於sizeMin則不顯示;參數pContext為指向CCreateContext結構的指針,大多數情況下可以賦值為父框架窗口的pContext;參數dwStyle指定窗口風格;參數nID為分割窗口的ID,除非分割器窗口嵌入到另一個分割器窗口中,否則可以取值AFX_IDW_PANE_FIRST。
virtual BOOL CreateStatic(
CWnd* pParentWnd,
int nRows,
int nCols,
DWORD dwStyle = WS_CHILD | WS_VISIBLE,
UINT nID = AFX_IDW_PANE_FIRST
);
創建靜態分割窗口。參數pParentWnd、dwStyle和nID同上;參數nRows為行數,不能超過16;參數nCols為列數,同樣不能超過16。
virtual BOOL CreateView(
int row,
int col,
CRuntimeClass* pViewClass,
SIZE sizeInit,
CCreateContext* pContext
);
為靜態分割窗口創建窗格視圖。參數row指定分割器窗口中放置新視圖的行;參數col指定放置新視圖的列;參數pViewClass指定新視圖的CRuntimeClass對象;參數sizeInit指定新視圖的初始大小;參數pContext為指向CCreateContext結構的指針,通常可以賦值為傳遞給父框架窗口的重載函數CFrameWnd::OnCreateClient的pContext參數值。

動態分割窗口


創建動態分割窗口的步驟為:
1. 在父框架類中定義一個CSplitterWnd類型的成員對象。
2. 重載父框架類的CFrameWnd::OnCreateClient成員函數。
3. 在重載的CFrameWnd::OnCreateClient函數中調用CSplitterWnd成員對象的Create函數。

靜態分割窗口


創建靜態分割窗口的步驟為:
1. 在父框架類中定義一個CSplitterWnd類型的成員對象。
2. 重載父框架類的CFrameWnd::OnCreateClient成員函數。
3. 在重載的CFrameWnd::OnCreateClient函數中調用CSplitterWnd成員對象的CreateStatic成員函數,然後可以調用CSplitterWnd成員對象的CreateView成員函數為每個窗格創建視圖。