1 CSplitterWnd類
CSplitterWnd類提供一個分隔器窗口的功能,分隔器窗口是一個包含有多個窗格的窗口。窗格通常是應用程序特定的由CView派生的對象,但它也可以是具有適當子窗口ID的任何CWnd對象。一個CSplitterWnd對象通常被嵌入CFrameWnd或CMDIChildWnd父對象。你應按如下步驟創建一個CSplitterWnd對象:
1.在父框架中嵌入一個CSplitterWnd成員變量。
2.重載父框架的CFrameWnd::OnCreateClient成員函數。
3.從重載的OnCreateClient函數中調用類CSplitterWnd的Create或CreateStatic成員函數。
3.1調用Create成員函數可以創建一個動態的分隔器窗口。
3.2 使用CreateStatic成員函數可以創建一個靜態分隔器窗口。
4. 從重載的OnCreateClient函數中調用類CSplitterWnd的CreateView成員函數;
重要的函數講解:
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
);
返回值:如果成功則返回非零值;否則返回0。
參數:
pParentWnd |
分隔器窗口的父框架窗口。 |
nMaxRows |
分隔器窗口中的最大行數。這個值不能超過2。 |
nMaxCols |
分隔器窗口中的最大列數。這個值不能超過2。 |
sizeMin |
指出顯示一個窗格所需的最小尺寸。 |
pContext |
指向一個CCreateContext結構的指針。多數情況下,這個值可以是傳遞給父框架窗口的pContext。 |
dwStyle |
指定窗口的風格。 |
nID |
此窗口的子窗口ID。如果這個分隔器窗口不是嵌套在另一個分隔器窗口中的,則這個ID可以是AFX_IDW_PANE_FIRST。 |
BOOL CreateStatic( CWnd* pParentWnd,
int nRows,
int nCols,
DWORD dwStyle = WS_CHILD | WS_VISIBLE,
UINT nID = AFX_IDW_PANE_FIRST
);
參數:
pParentWnd |
分隔器窗口的父框架窗口。 |
nRows |
行數。這個值必須不超過16。 |
nCols |
列數。這個值必須不超過16。 |
dwStyle |
指定窗口的風格。 |
nID |
此窗口的子窗口ID。如果這個分隔器窗口不是嵌套在另一個分隔器窗口中的,則這個ID可以是AFX_IDW_PANE_FIRSH。 |
virtual BOOL CreateView( int row, int col, CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext );
返回值:如果成功則返回非零值;否則返回0。
參數:
row |
指定用來放置新視的分隔器窗口行。 |
col |
指定用來放置新視的分隔器窗口列。 |
pViewClass |
指定新視的CRuntimeClass。 |
sizeInit |
指定新視的初始尺寸。 |
pContext |
指向用來創建此視的創建環境的指針(通常,該pContext被傳遞給在其中創建此分隔器窗口的父框架的重載的OnCreateClient成員函數)。 |
注意: 第三個參數CruntimeClass爲RUNTIME_CLASS(類名);如果該類是資源類,那麼該類的父類必須是CformView,
2 創建嵌套分割窗口
2.1創建動態分割窗口
動態分割窗口使用Create方法。下面的代碼將創建2x2的窗格。
m_wndSplitter.Create(this,2,2,CSize(100,100),pContext);
但是動態創建的分割窗口的窗格數目不能超過2x2,而且對於所有的窗格,都必須共享同一個視圖,所受的限制也比較多,因此我們不將動態創建作爲重點。我們的主要精力放在靜態分割窗口的創建上。
2.2創建靜態分割窗口
與動態創建相比,靜態創建的代碼要簡單許多,而且可以最多創建16x16的窗格。不同的窗格我們可以使用CreateView填充不同的視圖。
在這裏我們將創建CuteFtp的窗口分割。CuteFtp的分割情況如下:
CCuteFTPView | |
CView2 | CView3 |
CView4 |
創建步驟:
▲ 在創建之前我們必須先用AppWizard生成單文檔CuteFTP,生成的視類爲 CCuteFTPView.同時在增加三個視類或者從視類繼承而來的派生類CView2,CView3 CView4.
▲ 增加成員:
在Cmainfrm.h中我們將增加下面的代碼:
CSplitterWnd wndSplitter1;
CSplitterWnd wndSplitter2;
▲ 重載CMainFrame::OnCreateClient()函數:
BOOL CMainFrame::OnCreateClient( LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext)
{ //創建一個靜態分欄窗口,分爲三行一列
if(m_wndSplitter1.CreateStatic(this,3,1)==NULL)
return FALSE;
//將CCuteFTPView連接到0行0列窗格上
m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CCuteFTPView),CSize(100,100), pContext);
m_wndSplitter1.CreateView(2,0,RUNTIME_CLASS(CView4),CSize(100,100),pContext);
//將CView4連接到0行2列
if(m_wndSplitter2.CreateStatic(&m_wndSplitter,1,2,WS_CHILD|WS_VISIBLE,
m_wndSplitter.IdFromRowCol(1, 0))==NULL)
return FALSE; //將第1行0列再分開1行2列
//將CView2類連接到第二個分欄對象的0行0列
m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CView2),CSize(400,300),pContext);
//將CView3類連接到第二個分欄對象的0行1列
m_wndSplitter2.CreateView(0,1,RUNTIME_CLASS(CView3),CSize(400,300),pContext);
return TRUE;
}