TN029:拆分Windows

此说明描述了 MFC CSplitterWnd 类,提供 windows 拆分和管理调整其他窗格窗口。

拆分样式

CSplitterWnd 支持拆分窗口的两个不同的样式。

在 “静态拆分,,则在创建集合时,”拆分窗口创建窗格。 窗格的顺序和数量从不更改。 拆分栏用于调整不同的窗格。 可以使用此样式显示在每个窗格的不同视图类。 Visual C++ 图形编辑器和 windows 文件管理器是使用此拆分样式程序的示例。 拆分窗口此样式不使用拆分框。

在 “动态拆分,那么,当用户拆分和非拆分新视图,”附加窗格创建和销毁。 此拆分从单个视图开始并为用户提供拆分框中启动拆分。 ,当视图在一个方向上,拆分拆分窗口动态创建新的视图对象。 此新视图对象表示新的窗格。 使用键盘界面,如果该视图在两个方向拆分,拆分窗口创建三个新的窗格的三个新视图对象。 当拆分处于活动状态时,窗口显示拆分框中为窗格之间的一个拆分栏。 窗口销毁附加视图对象,当用户移除拆分时,但是,原始视图保持,直到销毁拆分窗口。 Microsoft Excel 和 Microsoft Word 是使用动态拆分样式应用程序的示例。

在创建用于此类拆分窗口时,必须指定拆分器将管理的最大行数和列数。 一个静态拆分器将创建窗格加载所有行和列。 ,当 CSplitterWnd ,将创建一个动态拆分器将只创建第一个窗格。

可以为静态拆分窗格指定的最大数是由 16 行 16 列。 建议的配置为:

  • x 1 行 2 列:通常为不相似的窗格

  • x 2 行 1 列:通常为不相似的窗格

  • x 2 行 2 列:通常具有类似的窗格

可以为动态拆分窗格指定的最大数是由 2 行 2 列。 建议的配置为:

  • x 1 行 2 列:为柱状数据

  • x 2 行 1 列:为文本或其他数据

  • x 2 行 2 列:对网格或表放入数据

拆分示例

许多 MFC 示例程序直接或间接使用拆分窗口。 MFC 通用示例 VIEWEX 拆分器声明为静态拆分的若干使用,包括如何将拆分器。

也可以使用类向导创建新的多文档界面 (mdi) (MDI) 子帧包含一个拆分窗口的窗口类。 有关拆分窗口的更多信息,请参见 多个文件类型、视图和框架窗口

实现使用的术语

这是特定于拆分窗口的术语列表:

  • CSplitterWnd:
    提供窗格拆分的控件和滚动条共享行上所有窗格或列之间的窗口。 您指定行和列与从零开始的数字 (第一个窗格是行和列 = 0 = 0)。

  • 窗格:
    CSplitterWnd 管理特定的窗口。 窗格通常是从 CView 类派生的对象,但是,可能有相应的子窗口. ID 的所有 CWnd 对象

    使用 CWnd派生的对象,请通过对象的 RUNTIME_CLASSCreateView 功能,则,如果使用 CView派生类。 ,因为框架使用动态创建在运行时,您的类必须使用 DECLARE_DYNCREATEIMPLEMENT_DYNCREATE 。 虽然具有特定于 CView 类在 CSplitterWnd 的大量代码,始终使用 CObject::IsKindOf ,这些运算之前。

  • 拆分栏:
    放置在窗格之间的行和列的控件。 它可以用于调整行的窗格的大小或列。

  • 拆分框:
    在使用创建新的 " 窗格中的行或列的动态 CSplitterWnd 的控件。 它位于垂直滚动条顶部或在水平滚动条的左边。

  • 拆分交集:
    一个垂直拆分栏和一个水平拆分栏的交集。 您可以将同时调整窗格的行和列的大小。

共享滚动条

CSplitterWnd 类还支持共享滚动条。 这些滚动条控件是 CSplitterWnd 的子级并在拆分的不同窗格中共享。

例如,那么,当创建 CSplitterWnd时,在 x 1 行 2 列窗口,可以指定 WS_VSCROLL。 窗口创建共享在两个窗格之间的特定滚动条控件。

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

当用户移动滚动条, WM_VSCROLL 信息将发送到两个视图。 当其中一个视图将滚动条的位置,共享滚动条将设置为。

请注意共享滚动条是最有用的方法与和中的视图对象。 如果混视图不同输入拆分,则可能必须协调它们的滚动位置编写特定代码。 任何 CView- 使用 CWnd 滚动条 API 的派生类将委托给共享滚动条,如果存在)。 CScrollView 实现是支持共享滚动条 CView 类的一个示例。 从 CView,对类进行派生取决于非控件滚动条的类,或例如使用标准的 windows 实现的类 (, CEditView) 不会使用 CSplitterWnd使用共享滚动条功能。

最小大小

对于每行具有最小的行高,并且,对于每一列具有最低的列宽。 此最小确保窗格不太小而无法显示在完整详细信息。

对于静态拆分窗口,初始最小行高度和列的宽度为 0。 对于动态拆分窗口,初始最小行高度和列宽。 CSplitterWnd::Create 功能的 sizeMin 参数设置为。

使用 CSplitterWnd::SetRowInfoCSplitterWnd::SetColumnInfo 功能,可以更改这些最小大小。

实际使用。理想的大小

窗格的格式在拆分窗口的取决于包含这些帧的大小。 当用户调整包含的帧时, CSplitterWnd 重新定位和调整窗格,以便尽可能符合。

用户可以手动设置行高和列宽范围,使用 CSplitterWnd 类,或者程序可以设置理想的大小。 实际大小大于理想可以小或。 窗口将调整实际大小,如果没有足够的空间显示理想的大小或,如果在右侧拆分窗口的或底部的多个空格。

自定义控件

您可以重写许多功能提供自定义的行为和自定义的接口。 您可以重写首先此设置为拆分窗口的各种图形元素提供备用 imagery。

  • 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();
    执行键盘部件的命令,通常为 “拆分的窗口”。

请参见

其他资源

由Number "技术说明

技术说明按类别