Share via


TN029:分隔視窗

此附注描述 MFC CSplitterWnd 類別,該類別 提供視窗分割和管理其他窗格視窗的大小調整。

分隔器樣式

支援 CSplitterWnd 兩種不同的分割視窗樣式。

在「靜態分隔器」中,分割器視窗會在建立時建立窗格。 窗格的順序和數目永遠不會變更。 分隔列可用來調整不同窗格的大小。 您可以使用此樣式在每個窗格中顯示不同的檢視類別。 Visual C++ 圖形編輯器和 Windows 檔案管理員是使用此分隔器樣式的程式範例。 此分隔視窗樣式不會使用分隔器方塊。

在「動態分割器」中,當使用者分割和取消分割新檢視時,會建立並終結其他窗格。 這個分割器會從單一檢視開始,並提供分隔器方塊,讓使用者起始分割。 當檢視以單一方向分割時,分割器視窗會動態建立新的檢視物件。 這個新的檢視物件代表新的窗格。 如果使用鍵盤介面將檢視分割成兩個方向,則分割器視窗會為三個新的窗格建立三個新的檢視物件。 當分割作用中時,Windows 會將分割器方塊顯示為窗格之間的分隔列。 當使用者移除分割時,Windows 會終結其他檢視物件,但原始檢視會維持在分割器視窗本身終結之前。 Microsoft Excel 和 Microsoft Word 是使用動態分隔器樣式的應用程式範例。

當您建立任一種分割器視窗時,您必須指定分割器將管理的資料列和資料行數目上限。 靜態分隔器會建立窗格來填滿所有資料列和資料行。 動態分隔器只會在建立 時 CSplitterWnd 建立第一個窗格。

您可以為靜態分割器指定的窗格數目上限是 16 個數據行的 16 個數據列。 建議的組態如下:

  • 1 列 x 2 欄:通常具有不同的窗格

  • 2 個數據列 x 1 欄:通常具有不同的窗格

  • 2 個數據列 x 2 個數據行:通常具有類似的窗格

您可以為動態分割器指定的窗格數目上限是 2 個數據列乘 2 個數據行。 建議的組態如下:

  • 1 列 x 2 個數據行:適用于單欄資料

  • 2 列 x 1 欄:適用于文字或其他資料

  • 2 個數據列 x 2 個數據行:適用于方格或資料表導向的資料

分割器範例

許多 MFC 範例程式會直接或間接使用分割器視窗。 MFC 一般範例 VIEWEX 說明數種靜態分割器的用法,包括如何將分割器放在分割器中。

您也可以使用 ClassWizard 來建立新的多文檔介面 (MDI) 子框架視窗類別,其中包含分割器視窗。 如需分割器視窗的詳細資訊,請參閱 多個檔案類型、檢視和框架視窗

實作所使用的術語

以下是分割器視窗特有的字詞清單:

CSplitterWnd:提供窗格分割控制項和捲軸的視窗,可在資料列或資料行上的所有窗格之間共用。 您可以指定以零起始數位的資料列和資料行(第一個窗格是 row = 0,而資料行 = 0)。

窗格:管理的應用程式特定視窗 CSplitterWnd 。 窗格通常是衍生自 CView 類別 的物件,但可以是任何 具有適當子視窗識別碼的 CWnd 物件。

若要使用 CWnd 衍生物件,請將 物件的RUNTIME_CLASS傳遞至 CreateView 函式,就像您使用衍生類別一 CView 樣。 您的類別必須使用 DECLARE_DYNCREATE 和 IMPLEMENT_DYNCREATE,因為架構會在執行時間使用動態建立。 雖然 中 CSplitterWnd 有許多專屬 CView 于 類別的程式碼,但在 執行這些動作之前,一律會使用 CObject::IsKindOf

分隔列:在窗格的資料列和資料行之間放置的控制項。 它可以用來調整窗格的資料列或資料行大小。

分割器方塊:動態 CSplitterWnd 中的控制項,可用來建立窗格的新資料列或欄。 它位於垂直捲動條頂端或水準捲軸左邊。

分隔器交集:垂直分隔列和水準分隔列的交集。 您可以拖曳它,以同時調整窗格的資料列和資料行大小。

共用捲軸

類別 CSplitterWnd 也支援共用捲軸。 這些捲軸控制項是 的 CSplitterWnd 子系,並與分隔器中的不同窗格共用。

例如,在 1 列 x 2 資料行視窗中,您可以在建立 CSplitterWnd 時指定WS_VSCROLL。 Windows 會建立在兩個窗格之間共用的特殊捲軸控制項。

[      ][      ][^]
[pane00][pane01][|]
[      ][      ][v]

當使用者移動捲軸時,WM_VSCROLL訊息會傳送至這兩個檢視。 當任一個檢視設定捲軸位置時,將會設定共用捲軸。

請注意,共用捲軸對類似的檢視物件最有用。 如果您在分割器中混合不同類型的檢視,您可能必須撰寫特殊的程式碼來協調其捲動位置。 任何 CView 使用捲軸 API 的 CWnd 衍生類別,如果共用捲軸存在,則會委派給共用捲軸。 實作 CScrollView 是支援共用捲軸之類別的其中一個 CView 範例。 不是衍生自 CView 的類別、依賴非控制捲軸的類別,或是使用標準 Windows 實作的類別(例如, CEditView ) 將無法使用 的共用捲軸功能 CSplitterWnd

最小大小

每個資料列都有最小資料列高度,而每個資料行的欄寬下限。 此最小保證窗格不會太小,無法完整顯示。

如果是靜態分隔器視窗,初始最小資料列高度和資料行寬度為 0。 對於動態分隔器視窗,初始最小資料列高度和資料行寬度是由 函式的 sizeMin 參數 CSplitterWnd::Create 所設定。

您可以使用 CSplitterWnd::SetRowInfo 和 CSplitterWnd::SetColumnInfo 函式來變更這些最小大小

實際大小與理想大小

分割器視窗中窗格的配置取決於包含窗格的框架大小。 當使用者調整包含框架的大小時, CSplitterWnd 重新調整和調整窗格的大小,使其盡可能適合。

使用者可以手動設定資料列高度和資料行寬度大小,或者程式可以使用 類別來設定理想的大小 CSplitterWnd 。 實際大小可以小於或大於理想。 如果沒有足夠的空間可顯示理想的大小,或分割器視窗右側或底部有太多空白空間,Windows 將會調整實際大小。

自訂控制項

您可以覆寫許多函式,以提供自訂的行為和自訂介面。 您可以覆寫此第一個集合,為分割器視窗的各種圖形元件提供替代影像。

  • virtual void OnDrawSpltter(CDC* pDC, ESplitType nType, const CRect& rect);

  • virtual void OnInvertTracker(const CRect& rect);

您可以呼叫此函式來建立共用捲軸控制項。 您可以覆寫它,以在捲軸旁建立額外的控制項。

  • virtual BOOL CreateScrollBarCtrl(DWORD dwStyle, UINT nID);

這些函式會實作動態分隔器視窗的邏輯。 您可以覆寫這些來提供更進階的分割器邏輯。

  • virtual void DeleteView(int row, int col);

  • virtual BOOL SplitRow(int cyBefore);

  • virtual BOOL SplitColumn(int cxBefore);

  • virtual void DeleteRow(int rowDelete);

  • virtual void DeleteColumn(int colDelete);

CView 功能

類別 CView 會使用下列高階命令來委派至實作 CSplitterWnd 。 因為這些命令是虛擬的,因此標準 CView 實作不需要連結整個 CSplitterWnd 實作。 對於使用 CView 但不是 CSplitterWnd 的應用程式,實 CSplitterWnd 作將不會與應用程式連結。

  • virtual BOOL CanActivateNext(BOOL bPrev = FALSE);

    檢查目前是否可能ID_NEXT_PANE或ID_PREV_PANE。

  • virtual void ActivateNext(BOOL bPrev = FALSE);

    執行 [下一個窗格] 或 [上一個窗格] 命令。

  • virtual BOOL DoKeyboardSplit();

    執行鍵盤分割命令,通常是「視窗分割」。

另請參閱

依編號顯示的技術提示
依分類區分的技術提示