停靠和浮动工具栏

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

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

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

本文涉及的其他主题包括:

相关示例请参阅 MFC 常规示例 DOCKTOOL

在框架窗口中启用停靠

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

为工具栏启用停靠

准备好停靠目标位置后,必须以类似的方式准备工具栏(或源)。 针对要停靠的每个工具栏调用 CControlBar::EnableDocking,指定工具栏应停靠的目标位置。 如果调用 CControlBar::EnableDocking 中指定的侧边不能匹配框架窗口中为停靠启用的侧边,工具栏将无法停靠,它将浮动。 浮动后,它是浮动工具栏,无法停靠到框架窗口。

如果想要永久浮动工具栏效果,请使用参数 0 调用 EnableDocking。 然后调用 CFrameWnd::FloatControlBar。 工具栏仍然浮动,永远无法停靠到任何地方。

停靠工具栏

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

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

使工具栏浮动

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

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

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

动态重设工具栏大小

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

你可以:

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

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

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

  • CBRS_SIZE_DYNAMIC 控件条是动态的。

  • CBRS_SIZE_FIXED 控制条是固定的。

使用动态大小样式,你的用户可以在工具栏浮动时调整工具栏大小,但不能在工具栏停靠时调整其大小。 当用户拖动工具栏边缘时,工具栏根据需要换行改变其形状。

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

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

设置固定样式工具栏的换行位置

对于固定大小样式的工具栏,在工具栏换行处指定工具栏按钮索引。 以下代码演示如何在主框架窗口的 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 类的成员函数来管理工具栏的动态布局。 请参阅 DOCKTOOL 中的 EDITBAR.CPP 文件。

你想进一步了解什么

另请参阅

MFC 工具栏实现