庫結構
立即下載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禁用自動隱藏動畫。