共用方式為


TN029: 分隔視窗

這張便箋說明 MFC CSplitterWnd 類別,提供視窗分割,並管理其他窗格視窗的調整大小。

分隔器的樣式

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

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

在"動態分隔器 」,其他窗格會建立,以及使用者分割和未分割新檢視為損毀。 此分隔都開始於單一檢視,並提供分隔方塊,讓使用者可用來初始化分割。 分隔視窗會以單一方向分割檢視表時,動態建立新的檢視物件。 這個新的 view 物件代表新的窗格。 如果檢視表被分割成兩個方向,藉由使用鍵盤介面,分隔視窗就會建立三個新的三個新窗格的檢視物件。 分割使用中時,Windows 就會顯示為 [在窗格之間的分隔列分隔器] 方塊。 使用者會移除分割,但原始檢視仍會保留,直到分隔視窗本身被損毀時,Windows 就會終結額外的檢視物件。 Microsoft Excel 和 Microsoft Word 會使用動態分割樣式的應用程式的範例。

當您建立不論是哪一種分隔視窗中時,您必須指定資料列和資料行,以管理分隔器的最大數目。 靜態分隔器將會建立窗格,以填滿的所有資料列和資料行。 動態分隔器將會建立第一個的窗格時CSplitterWnd會建立。

您可以為靜態的分隔器之指定的窗格的最大數目是 16 的 16 個資料行的資料列。 建議的組態如下:

  • 1 列 x 2 欄: 通常包含不同的窗格

  • 兩列 x 1 欄: 通常包含不同的窗格

  • 2 列 x2 欄: 通常是以類似的窗格

您可以為動態的分隔器之指定的窗格的最大數目為兩列兩欄。 建議的組態如下:

  • 1 列 x 2 欄: 單欄式資料

  • 兩列 x 1 欄: 文字或其他資料

  • 2 列 x2 欄: 格線或表格為導向的資料

分隔器範例

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

您也可以使用 「 類別精靈 」 來建立新的多個文件介面 (MDI) 子框架視窗類別,其中包含分隔視窗中。 如需有關分隔視窗的詳細資訊,請參閱多種文件、 檢視和框架視窗

實作所使用的術語

下面是一份專用於分隔視窗的詞彙:

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

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

    若要使用CWnd-衍生物件,傳遞RUNTIME_CLASS之物件的CreateView運作一樣如果您使用CView-衍生的類別。 您的類別必須使用DECLARE_DYNCREATEIMPLEMENT_DYNCREATE因為架構在執行階段使用動態建立。 雖然有許多程式碼在CSplitterWnd ,僅適用於CView類別, CObject::IsKindOf會執行這些動作之前,皆使用。

  • 分隔列:
    這種控制項位於資料列和資料行的窗格。 它可能會用於調整大小的資料列或資料行的窗格。

  • 分隔器] 方塊中:
    在 [動態控制項CSplitterWnd您可以使用建立新的資料列或資料行的窗格。 它位於頂端的垂直捲軸列或水平捲軸的左邊。

  • 分隔器交集:
    垂直分割軸和水平分割列的交集。 您可以拖曳它,同時調整大小的列和欄的窗格。

共用的捲軸列

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

比方說,在 1 列 x 2 資料行] 視窗中,您可以指定 WS_VSCROLL 時建立CSplitterWnd。 Windows 建立特殊的捲軸的兩個窗格之間共用的。

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

當使用者將捲軸, WM_VSCROLL會將訊息傳送至這兩種檢視。 當任一檢視將捲軸列的位置,則會被設定共用的捲軸列。

請注意共用的捲軸列具有相似的檢視物件最有用處。 如果您混用不同的型別分隔器的檢視,您可能必須撰寫特殊的程式碼,來協調它們的捲軸位置。 任何CView-衍生的類別使用CWnd捲軸上若有的話,將會委派給共用的捲軸列的 Api。 CScrollView實作是一種CView支援類別共用的捲軸列。 不從衍生的類別CView,需要使用非控制捲軸列上的類別或使用標準的 Windows 實作方式的類別 (比方說, CEditView) 的 「 共用的捲軸列 」 功能將無法在CSplitterWnd

大小的下限。

每個資料列的最小列高,而且每個資料行中,沒有最小欄寬。 此最小值可確保不太小,無法顯示在 [完整詳細資料窗格。

靜態分隔視窗中,初始的最小列高及欄寬是 0。 對於動態分隔視窗中,初始的最小列高及欄寬會設定sizeMin參數的CSplitterWnd::Create函式。

您可以變更這些最小的大小,藉由使用CSplitterWnd::SetRowInfoCSplitterWnd::SetColumnInfo函式。

實際的 vs。理想的大小

分隔視窗中的窗格中的版面配置包含這些框架的大小而定。 當使用者重新調整大小包含框架中, 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 ,但不是CSplitterWndCSplitterWnd實作不會與應用程式連結。

  • virtual BOOL CanActivateNext(BOOL bPrev = FALSE);
    檢查是否有目前的 ID_NEXT_PANE 或 ID_PREV_PANE。

  • virtual void ActivateNext(BOOL bPrev = FALSE);
    執行"下一個窗格 」 或 「 上一個窗格 」 的命令。

  • virtual BOOL DoKeyboardSplit();
    執行鍵盤分隔的命令,通常是"視窗分割線]。

請參閱

其他資源

技術的備忘稿編號

依類別的技術注意事項