停靠和浮动工具栏

Microsoft基础类库支持可停靠工具栏。 可停靠工具栏可以附加到其父窗口的任何一侧,也可以将其分离或浮动在其自己的微型框架窗口中。 本文介绍如何在应用程序中使用可停靠工具栏。

如果使用应用程序向导生成应用程序的框架,系统会要求你选择是否想要可停靠工具栏。 默认情况下,应用程序向导将生成执行在应用程序中放置可停靠工具栏所需的三个作的代码:

如果缺少上述任一步骤,应用程序将显示标准工具栏。 必须为应用程序中每个可停靠工具栏执行最后两个步骤。

本文介绍的其他主题包括:

有关示例,请参阅 MFC 常规示例 DOCKTOOL

在框架窗口中启用停靠

若要将工具栏停靠到框架窗口,必须启用框架窗口(或目标)才能允许停靠。 这是使用 CFrameWnd::EnableDocking 函数完成的,该函数采用一个 DWORD 参数,该参数是一组样式位,指示框架窗口的哪一侧接受停靠。 如果工具栏即将停靠,并且存在可停靠到的多个侧,则传递的参数 EnableDocking 中指示的边按以下顺序使用:顶部、底部、左、右。 如果希望能够在任何地方停靠控制栏,请将 CBRS_ALIGN_ANY 传递给 EnableDocking

为工具栏启用停靠

准备好停靠目标后,必须以类似的方式准备工具栏(或源)。 为要停靠的每个工具栏调用 CControlBar::EnableDocking ,并指定工具栏应停靠到的目标端。 如果在调用中未指定任何一侧来 CControlBar::EnableDocking 匹配在框架窗口中启用停靠的边,工具栏将无法停靠 , 它将浮动。 浮动后,它仍然是浮动工具栏,无法停靠到框架窗口。

如果所需的效果是永久浮动工具栏,请使用参数 0 进行调用 EnableDocking 。 然后调用 CFrameWnd::FloatControlBar。 工具栏保持浮动,永久无法停靠到任何位置。

停靠工具栏

当用户尝试在允许停靠的框架窗口一侧放置工具栏时,框架将调用 CFrameWnd::D ockControlBar

此外,可以随时调用此函数,将控制栏停靠到框架窗口。 这通常在初始化期间完成。 多个工具栏可以停靠到框架窗口的特定一侧。

浮动工具栏

从框架窗口分离可停靠工具栏称为浮动工具栏。 调用 CFrameWnd::FloatControlBar 以执行此作。 指定要浮动的工具栏、放置位置的点,以及确定浮动工具栏是水平还是垂直的对齐样式。

当用户将工具栏从停靠位置拖动并放置到未启用停靠的位置时,框架将调用此函数。 这可以是框架窗口内外的任意位置。 与上一样 DockControlBar,还可以在初始化期间调用此函数。

可停靠工具栏的 MFC 实现不提供某些支持可停靠工具栏的应用程序中找到的一些扩展功能。 不提供可自定义工具栏等功能。

动态调整工具栏大小

从 Visual C++ 版本 4.0 开始,可以让应用程序的用户动态调整浮动工具栏的大小。 通常,工具栏具有长线性形状,水平显示。 但可以更改工具栏的方向及其形状。 例如,当用户将工具栏停靠在框架窗口的一个垂直侧上时,形状将更改为垂直布局。 还可以将工具栏重塑为具有多行按钮的矩形。

您可以:

  • 将动态大小指定为工具栏特征。

  • 将固定大小指定为工具栏特征。

若要提供此支持,在调用 CToolBar::Create 成员函数时可以使用两个新的工具栏样式。 它们分别是:

  • CBRS_SIZE_DYNAMIC 控件栏是动态的。

  • CBRS_SIZE_FIXED 控件栏是固定的。

大小动态样式允许用户在浮动工具栏时调整其大小,但在停靠时不能调整其大小。 当用户拖动其边缘时,工具栏“包装”需要更改形状。

固定样式的大小保留工具栏的换行状态,并修复每个列中按钮的位置。 应用程序的用户无法更改工具栏的形状。 工具栏在指定位置(例如按钮之间的分隔符的位置)换行。 无论工具栏是停靠还是浮动,它都维护此形状。 效果是具有多个按钮列的固定调色板。

还可以使用 CToolBar::GetButtonStyle 返回工具栏上按钮的状态和样式。 按钮的样式确定按钮的显示方式以及按钮对用户输入的响应方式;状态指示按钮是否处于包装状态。

设置 Fixed-Style 工具栏的换行位置

对于大小固定样式的工具栏,请指定工具栏将环绕的工具栏按钮索引。 以下代码演示如何在主框架窗口的 OnCreate 重写中执行此作:

// Get the style of the first button separator
UINT nStyle = m_wndToolBar.GetButtonStyle(3);
// Augment the state for wrapping
nStyle |= TBBS_WRAPPED;
m_wndToolBar.SetButtonStyle(3, nStyle);

// Do the same for other wrap locations ...

// Set the bar style to size fixed
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
   CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_FIXED);

// Call docking/floating functions as needed ...

MFC 常规示例 DOCKTOOL 演示如何使用 CControlBarCToolBar 类的成员函数来管理工具栏的动态布局。 请参阅文件 EDITBAR。DOCKTOOL 中的 CPP。

想要详细了解哪些内容

另请参阅

MFC 工具栏实现