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

圖8-8 分割窗口
分割窗口分為兩類:動(dòng)態(tài)分割窗口和靜態(tài)分割窗口。
動(dòng)態(tài)分割窗口是指:用戶可以動(dòng)態(tài)的分割和除去分割窗口,分割窗口會(huì)創(chuàng)建和刪除相應(yīng)的窗格。Microsoft Word就是使用動(dòng)態(tài)分割窗口的例子,這是一種最常用的分割窗口。動(dòng)態(tài)分割窗口最多可以有2行′ 2列個(gè)窗格。
靜態(tài)分割窗口是指:在窗口創(chuàng)建時(shí),分割窗口的窗格就已經(jīng)創(chuàng)建好了,且窗格的數(shù)量和順序不會(huì)改變。窗格為一個(gè)分割條所分割,用戶可以拖動(dòng)分割條調(diào)整相應(yīng)的窗格的大小。如圖8-9,Visual Studio的圖標(biāo)編輯器就是靜態(tài)分割窗口的例子。在編輯器的左邊窗格,顯示圖標(biāo)的縮微圖像,在右邊顯示圖標(biāo)的編輯窗口,可以拖動(dòng)中間的分割條調(diào)整兩個(gè)窗格的大小。靜態(tài)分割窗口最多可以有16行′ 16列的窗格。

圖8-9 圖標(biāo)編輯器—靜態(tài)分割窗口的例子
這里我們只介紹動(dòng)態(tài)分割窗口的使用,有關(guān)靜態(tài)分割窗口的用法,讀者可以參考Visual C++的例子VIEWEX,它在SAMPLES\MFC\GENERAL \VIEWEX目錄下。
要使文檔視結(jié)構(gòu)程序支持動(dòng)態(tài)分割窗口,可以有三種方法:
1.在用AppWizard創(chuàng)建窗口時(shí)指定分割窗口風(fēng)格:
在MFC AppWizard Step 4 of 6對(duì)話框中,點(diǎn)Advanced按鈕。彈出Advanced Options對(duì)話框,選擇Window Styles標(biāo)簽頁(yè)。如圖8-10,選中該頁(yè)的Use Split Window檢查框。這樣生成的應(yīng)用程序就自動(dòng)支持分割窗口功能。

圖8-10 Window Styles設(shè)置
如果應(yīng)用程序已經(jīng)生成,采用這種方法就不合適了。此時(shí),可以使用下面的兩種方法:
2.使用Component Gallery為已經(jīng)生成的應(yīng)用程序增加分割窗口功能:
打開(kāi)相應(yīng)的工程文件。選擇Project-Add To Project-Components and controls菜單,彈出
Components and controls Gallery對(duì)話框。雙擊Developer Studio Components目錄,從該目錄下選擇split Bars控件。Visual C++提示split Bar對(duì)話框,對(duì)話框內(nèi)有三個(gè)選項(xiàng):Horizontal,Vertical和Both,用于指定在水平方向、垂直方向還是兩個(gè)方向都使用分割窗口。選擇Both,點(diǎn)OK關(guān)閉Split Bar對(duì)話框,此時(shí)Component Gallery就將分割窗口功能添加到了Draw程序中。再點(diǎn)OK關(guān)閉Components and controls Gallery對(duì)話框。然后瀏覽應(yīng)用程序類,看有什么變化。
在childfrm.h中,增加了以下內(nèi)容:
// Generated message map functions
protected:
CSplitterWnd m_wndSplitter;
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
m_wndSplitter是一個(gè)CSplitterWnd類的對(duì)象。CSplitterWnd是MFC提供的一個(gè)類,它提供了窗格分割控制,以及能被所有同一行或列上的窗格共享的滾動(dòng)條。這些行和列的值都是從0開(kāi)始的整數(shù),第一個(gè)窗格的行數(shù)和列數(shù)都為0。
另外還重載了子框架窗口的OnCreateClient方法。在該函數(shù)內(nèi)部,創(chuàng)建了分割窗口控制:
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方法帶五個(gè)參數(shù),第一個(gè)參數(shù)代表父窗口指針,第二個(gè)參數(shù)和第三個(gè)參數(shù)告訴CSplitterWnd要多少行、多少列的窗格,第四個(gè)參數(shù)是一個(gè)CSize類型的數(shù)據(jù),用于指定窗格的最小大小。
第三種方法是手工加入代碼:
在需要分割視圖的框架窗口中加入一個(gè)CSplitterWnd類型的數(shù)據(jù)成員;用ClassWizard重載框架窗口的OnCreateClient方法,在OnCreateClient方法的實(shí)現(xiàn)中,加入上面的代碼