窗口拆分

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成員函數)。

注意第三個參數CruntimeClassRUNTIME_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; 
} 




發佈了22 篇原創文章 · 獲贊 5 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章