分割窗口將窗口分成幾個部分,每個部分通常代表一個視圖(但也可以是具有子窗口標識的CWnd對象),又稱窗格。如圖8-8所示。如果想在一個窗口里面觀察文檔的不同部分,或者是在一個窗口里用不同類型的視圖(比如用圖表和表格)觀察同一個文檔,那么采用分割窗口是非常方便的。許多優秀的軟件都采用了分割窗口技術,因此我們有必要掌握分割窗口的用法。

T8_8.tif (313144 bytes)

圖8-8 分割窗口

分割窗口分為兩類:動態分割窗口和靜態分割窗口。

動態分割窗口是指:用戶可以動態的分割和除去分割窗口,分割窗口會創建和刪除相應的窗格。Microsoft Word就是使用動態分割窗口的例子,這是一種最常用的分割窗口。動態分割窗口最多可以有2行′ 2列個窗格。

靜態分割窗口是指:在窗口創建時,分割窗口的窗格就已經創建好了,且窗格的數量和順序不會改變。窗格為一個分割條所分割,用戶可以拖動分割條調整相應的窗格的大小。如圖8-9,Visual Studio的圖標編輯器就是靜態分割窗口的例子。在編輯器的左邊窗格,顯示圖標的縮微圖像,在右邊顯示圖標的編輯窗口,可以拖動中間的分割條調整兩個窗格的大小。靜態分割窗口最多可以有16行′ 16列的窗格。

T8_9.tif (295722 bytes)

圖8-9 圖標編輯器—靜態分割窗口的例子

這里我們只介紹動態分割窗口的使用,有關靜態分割窗口的用法,讀者可以參考Visual C++的例子VIEWEX,它在SAMPLES\MFC\GENERAL \VIEWEX目錄下。

要使文檔視結構程序支持動態分割窗口,可以有三種方法:

1.在用AppWizard創建窗口時指定分割窗口風格:

在MFC AppWizard Step 4 of 6對話框中,點Advanced按鈕。彈出Advanced Options對話框,選擇Window Styles標簽頁。如圖8-10,選中該頁的Use Split Window檢查框。這樣生成的應用程序就自動支持分割窗口功能。

T8_10.tif (323220 bytes)

圖8-10 Window Styles設置

如果應用程序已經生成,采用這種方法就不合適了。此時,可以使用下面的兩種方法:

2.使用Component Gallery為已經生成的應用程序增加分割窗口功能:

打開相應的工程文件。選擇Project-Add To Project-Components and controls菜單,彈出

Components and controls Gallery對話框。雙擊Developer Studio Components目錄,從該目錄下選擇split Bars控件。Visual C++提示split Bar對話框,對話框內有三個選項:Horizontal,Vertical和Both,用于指定在水平方向、垂直方向還是兩個方向都使用分割窗口。選擇Both,點OK關閉Split Bar對話框,此時Component Gallery就將分割窗口功能添加到了Draw程序中。再點OK關閉Components and controls Gallery對話框。然后瀏覽應用程序類,看有什么變化。

在childfrm.h中,增加了以下內容:

// Generated message map functions

protected:

CSplitterWnd m_wndSplitter;

virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);

m_wndSplitter是一個CSplitterWnd類的對象。CSplitterWnd是MFC提供的一個類,它提供了窗格分割控制,以及能被所有同一行或列上的窗格共享的滾動條。這些行和列的值都是從0開始的整數,第一個窗格的行數和列數都為0。

另外還重載了子框架窗口的OnCreateClient方法。在該函數內部,創建了分割窗口控制:

BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)

{

// CG: The following block was added by the Split Bars component.

{

if (!m_wndSplitter.Create(this,

2, 2, // TODO: adjust the number of rows, columns

CSize(10, 10), // TODO: adjust the minimum pane size

pContext))

{

TRACE0("Failed to create split bar ");

return FALSE; // failed to create

}

return TRUE;

}

}

CSplitterWnd::Create方法帶五個參數,第一個參數代表父窗口指針,第二個參數和第三個參數告訴CSplitterWnd要多少行、多少列的窗格,第四個參數是一個CSize類型的數據,用于指定窗格的最小大小。

第三種方法是手工加入代碼:

在需要分割視圖的框架窗口中加入一個CSplitterWnd類型的數據成員;用ClassWizard重載框架窗口的OnCreateClient方法,在OnCreateClient方法的實現中,加入上面的代碼