库结构
立即下载BCGControlBar Professional Edition for MFC
BCGControlBar Library Professional Edition (Pro Version)介绍了非 MFC的对接架构,这意味着所有控制栏不再派生自CControlBar,专业版中所有控制栏的基类是CBCGPBaseControlBar(它又派生自 CBCGPWnd)。
专业版架构背后的主要思想与 MFC 没有太大区别,更重要的是,我们试图使专业版与MFC(和BCGControlBar库标准版)高度兼容。
下面您可以看到使用专业版构建的应用程序的图片:
应用程序主框架窗口通常由CBCGPFrameWnd或CBCGPMDIFrameWnd表示,主框架称为“停靠站点”。所有控制栏都可以具有三种类型的父级:“停靠站点”、“停靠栏”或“小型框架窗口”,控制栏可分为两种一般类型:不可调整大小的控制栏(例如状态栏和工具栏)和可调整大小的控制栏。在“可调整大小”控制栏下,我们指的是可以通过拆分器(或“滑块”)调整大小的栏,可以形成“容器”(一个控制栏可以停靠到另一个控制栏并在它们之间创建拆分器)并且不能连接(停靠)到停靠栏,所有不可调整大小的控制栏应源自CBCGPControlBar,CBCGPDockingControlBar(此类实现了停靠在停靠站点、放置在容器中、自动隐藏等基本功能)。
停靠站点
主框架窗口或停靠站点是所有控制栏和小型框架窗口的所有者,它包含CBCGPDockManager类(稍后的对接管理器)的嵌入成员。停靠管理器维护属于停靠站点的所有控制栏的列表,该列表的排序方式是在停靠站点外边缘创建的栏排在最前面。当需要重新计算布局时,它会循环遍历此列表,将每个控制栏的布局调整为(停靠站点的)当前边界矩形,并减去控制栏区域,每次需要调整停靠布局时,您都可以调用 mainframeclass::AdjustDockingLayout 或 RecalcLayout,该调用将被重定向到停靠管理器。
Dock栏
每个主框架可以具有沿边界放置的“停靠栏”(与边界对齐),Dock栏是CBCGPDockBar类的控制栏,可以接受 CBCGPControlBar 派生的对象(通常是工具栏)。应在主框架窗口初始化期间通过调用 mainframeclass::EnableDocking (DWORD dwDockStyle) 创建停靠栏,如果您想在主框架窗口的某些侧面启用“自动隐藏”栏,应该调用 mainframeclass::EnableAutoHideBars(DWORD dwDockStyle),此调用将在每个停靠栏旁边创建CBCGPAutoHideDockBar对象,您仍然可以使用 CBRS样式来指定对接对齐。每个停靠栏都分为(包含列表)“停靠行”,停靠行由CBCGPDockBarRow表示班级,每个停靠行都包含一个工具栏列表。当工具栏被停靠(例如通过鼠标)或在同一停靠裸露中从一行移动到另一行时,框架会创建一个新行并相应地调整停靠栏的大小或将工具栏放置在现有行上。
迷你框架窗口
当控制栏浮动时,它驻留在小型框架窗口上,Miniframe 窗口由两个类表示:CBCGPMiniFrameWnd(只能包含一个控制栏)和CBCGPMultiMiniFrameWnd(可以包含多个控制栏)。当控制栏浮动时,框架会自动创建一个迷你框架窗口,要使控制栏在代码中浮动,您可以调用CBCGPBaseControlBar::FloatControlBar ()。请注意,当控制栏变为浮动时,其父级会自动更改并设置为小型框架窗口,当控制栏停靠时,其父项将更改回停靠栏(对于工具栏)或停靠站点(对于可调整大小的控制栏)。
滑块
滑块(或分离器)由CBCGPSlider类表示,当停靠控制栏停到停靠站点或另一个控制栏时,框架会自动创建滑块。当栏停靠到停靠站点时,新滑块称为“默认滑块”,它包含有关其调整大小的停靠控制栏布局的所有信息。默认滑块放置在由停靠管理器维护的控制栏的常规列表中,并控制在“包含的”停靠控制栏上执行的所有布局操作。
容器
所有可调整大小的控制栏在相互停靠时都保存在“容器”中。容器由CBCGPBarContainer类表示,每个容器都有指向“左”栏、“右”栏、“左”子容器、“右”子容器以及左右部分之间的分隔符的指针。通过这种方式,我们能够构建一个由多个控制栏和拆分器组成的树,从而实现可以一起调整大小的非常复杂的控制栏布局,CBCGPBarContainerManager类维护容器树(它包含指向根容器的指针),此外,它还维护放置在该树中的两个控制栏和滑块列表。
自动隐藏控制栏
每个对接控制栏都会自动启用“自动隐藏”功能,当用户单击位于停靠控制栏标题上的固定按钮时,该栏将切换到自动隐藏模式。该框架创建一个 CBCGPAutoHideToolbar 类型的新工具栏和一个CBCGPAutoHideButton类型的新按钮,将工具栏放置在自动隐藏停靠栏上(根据当前栏对齐方式),将自动隐藏按钮附加到工具栏并将指针附加到停靠控制栏到按钮,此时,停靠控制栏被放置在由停靠管理器维护的自动隐藏栏的特殊列表中。
选项卡式控制栏和前景栏
CBCGPBaseTabWnd 类实现带有可拆卸选项卡的选项卡式窗口的基本功能。CBCGPBaseTabbedBar派生自CBCGPDockingControlBar ,并维护指向 CBCGPBaseTabWnd 对象的指针,通过这种方式,我们实现了选项卡式控制栏的停靠和调整大小的能力,使用CBCGPDockingControlBar::AttachToTabWnd动态创建对接选项卡式控制栏。
Outlook 栏控件也基于专业版中的选项卡式栏(CBCGPOutlookBar派生自CBCGPBaseTabbedBar)。
自定义应用程序操作的技巧
1.您可以应用几种新样式的组合来创建一个新的控制栏:
CBRS_BCGP_FLOAT:使控制栏浮动
CBRS_BCGP_AUTOHIDE:启用自动隐藏模式
CBRS_BCGP_CLOSE:控制栏可以关闭(隐藏)
CBCGPBaseControlBar实现以下虚拟布尔方法来反映这些标志:CBCGPBaseControlBar ::CanBeClosed、CBCGPBaseControlBar::CanAutoHide、CBCGPBaseControlBar::CanFloat,您可以在派生类中重写它们来自定义此操作。
2.您可以通过重写CBCGPBaseControlBar::CanAcceptBar方法来自定义停靠操作,如果控制栏返回 FALSE,pBar 将不会停靠到该控制栏。
3.该库现在允许两种停靠模式:立即(在第一个测试版中可用 - 当控制栏被拖动并与上下文停靠时)和标准(当使用“拖动矩形”拖动控制栏并停靠时)。对接模式可以是 BCGP_DOCK_TYPE::DT_IMMEDIATE 或 BCGP_DOCK_TYPE::BCGP_DT_STANDARD,它由CBCGPDockManager::m_dockModeGlobal全局定义,您可以随时更改此变量。如果要控制各个控制栏的停靠模式,可以重写 BCGP_DOCK_TYPE CBCGPBaseControlBar::GetDockMode ()。
4.如果您想创建一个无法浮动的“静态”控制栏,并且无法在其之前停靠任何控制栏(如 BCGPOutlookDemo 示例中的 Outlook 栏),则必须将其创建为非浮动并覆盖 CBCGPBaseControlBar :: doesAllowDynInsertBefore方法返回 FALSE。从版本 6.01 开始,如果创建的栏没有 CBRS_BCGP_FLOAT 样式,则默认实现返回 FALSE。
5.Outlook 栏的操作与常规选项卡式控制栏一样,当您将一个控制栏停靠到另一个控制栏时,将根据创建第二个停靠控制栏时指定的以下样式来定义结果样式:
- CBRS_BCGP_REGULAR_TABS:创建常规选项卡式控制栏
- CBRS_BCGP_OUTLOOK_TABS:创建 Outlook 样式的选项卡栏
CBCGPDockingControlBar有 SetTabbedControlBarRTC 方法,可以使用它来自定义由于停靠到选项卡窗口而创建的控制栏。
6.您可以将任何 CWnd 派生的控件插入到 Outlook 和选项卡式控制栏中,该库将使用CBCGPDockingCBWrapper对象自动包装这些条形,可以将这些栏与 Outlook 和选项卡式控制栏分离,同时提供所需的对接行为。CBCGPBaseTabWnd(用作选项卡窗口和 Outlook 窗口的基类)具有 SetDockingBarWrapperRTC 方法,使您能够自定义包装器外观和操作,将 CBCGPBaseTabWnd::m_bEnableWrapping 设置为 FALSE 来禁用此功能,请注意,当控制栏被换行时,其直接父级被设置为虚拟停靠控制栏,该控制栏又被插入到选项卡窗口中。
7.如果要将选项卡添加为不可拆卸,可以调用 CBCGPBaseTabWnd::AddTab 并将bDetachable设置为FALSE或调用 CBCGPBaseTabWnd::EnableTabDetach。
8.如果要启用/禁用选项卡交换,请调用 CBCGPBaseTabWnd::EnableTabSwap。
9.强烈建议创建 ID 不为 -1 的所有控制栏。
10.如果您对初始对接布局进行任何更改,则必须清除应用程序注册表项才能看到更改(如果您的应用程序将对接状态保存到注册表)。
11.如果启用可分离选项卡,则可以动态创建和销毁选项卡式窗口,不要保存指向动态选项卡式窗口的指针。
12.如果您为两个非选项卡式停靠控制栏调用CBCGPDockingControlBar::AttachToTabWnd ,则将使用最后一个参数 ppTabbedControlBar 返回指向选项卡式窗口的指针,可以使用它继续向新创建的选项卡式窗口添加选项卡(或进行其他操作)。
13.如果您想用任何对齐方式将一个停靠控制栏停靠到另一个停靠控制栏,可以调用CBCGPDockingControlBar::DockToWindow,原来的控制栏此时必须停靠在某处,对于工具栏,依然可以使用CBCGPFrameWnd::DockControlBarLeftOf。
14.ShowControlBar 方法有第三个非默认参数 bActivate,因此某些现有代码可能无法编译。
15.CBCGPDockingControlBar::m_bHideInAutoHideMode是一个新的静态成员,用于控制在调用CBCGPFrameWnd::ShowControlBar时对接控制栏在自动隐藏模式下的操作方式。如果此变量设置为 TRUE,控制栏及其自动隐藏按钮将被隐藏,否则,控制栏将滑入/滑出。
16.不要使用 GetStyle() 和 WS_VISIBLE 来确定控制栏的可见性,请改用CBCGPBaseControlBar::IsVisible,因为它可以正确处理选项卡式/自动隐藏模式下的可见性状态。
17.如果想创建一个非浮动、不可调整大小的控制栏,则不能调用 DockControlBar,您必须改为调用CBCGPDockManager::AddControlBar (CBCGPControlBar* pNonFloatingBar, ...) ,此调用将向停靠管理器注册此控制栏,并且此控制栏将参与停靠布局。
18.如果要创建非浮动可调整大小的控制栏,则应在不使用 CBRS_BCGP_FLOAT 样式的情况下创建它并调用 DockControlBar (CBCGPDockingControlBar* pResizingBar)。
19.如果想从停靠布局中排除控制栏,从其停靠栏中删除工具栏等,您必须调用CBCGPBaseControlBar::UnDockControlBar,不能为自动隐藏模式下的控制栏或位于选项卡式窗口的选项卡中的控制栏调用此方法。
20.如果控制栏已设置为自动隐藏模式,则必须在调用CBCGPBaseControlBar::FloatControlBar或CBCGPBaseControlBar::UnDockControlBar之前调用 SetAutoHideMode (FALSE,...) 。
21.您可以使用CBCGPDockingControlBar::m_bDisableAnimation禁用自动隐藏动画。