庫結(jié)構(gòu)
立即下載BCGControlBar Professional Edition for MFC
BCGControlBar Library Professional Edition (Pro Version)介紹了非 MFC的對接架構(gòu),這意味著所有控制欄不再派生自CControlBar,專業(yè)版中所有控制欄的基類是CBCGPBaseControlBar(它又派生自 CBCGPWnd)。
專業(yè)版架構(gòu)背后的主要思想與 MFC 沒有太大區(qū)別,更重要的是,我們試圖使專業(yè)版與MFC(和BCGControlBar庫標(biāo)準(zhǔn)版)高度兼容。
下面您可以看到使用專業(yè)版構(gòu)建的應(yīng)用程序的圖片:

應(yīng)用程序主框架窗口通常由CBCGPFrameWnd或CBCGPMDIFrameWnd表示,主框架稱為“停靠站點(diǎn)”。所有控制欄都可以具有三種類型的父級:“停靠站點(diǎn)”、“停靠欄”或“小型框架窗口”,控制欄可分為兩種一般類型:不可調(diào)整大小的控制欄(例如狀態(tài)欄和工具欄)和可調(diào)整大小的控制欄。在“可調(diào)整大小”控制欄下,我們指的是可以通過拆分器(或“滑塊”)調(diào)整大小的欄,可以形成“容器”(一個控制欄可以停靠到另一個控制欄并在它們之間創(chuàng)建拆分器)并且不能連接(停靠)到停靠欄,所有不可調(diào)整大小的控制欄應(yīng)源自CBCGPControlBar,CBCGPDockingControlBar(此類實(shí)現(xiàn)了停靠在停靠站點(diǎn)、放置在容器中、自動隱藏等基本功能)。
停靠站點(diǎn)
主框架窗口或停靠站點(diǎn)是所有控制欄和小型框架窗口的所有者,它包含CBCGPDockManager類(稍后的對接管理器)的嵌入成員。停靠管理器維護(hù)屬于停靠站點(diǎn)的所有控制欄的列表,該列表的排序方式是在停靠站點(diǎn)外邊緣創(chuàng)建的欄排在最前面。當(dāng)需要重新計算布局時,它會循環(huán)遍歷此列表,將每個控制欄的布局調(diào)整為(停靠站點(diǎn)的)當(dāng)前邊界矩形,并減去控制欄區(qū)域,每次需要調(diào)整停靠布局時,您都可以調(diào)用 mainframeclass::AdjustDockingLayout 或 RecalcLayout,該調(diào)用將被重定向到停靠管理器。
Dock欄
每個主框架可以具有沿邊界放置的“停靠欄”(與邊界對齊),Dock欄是CBCGPDockBar類的控制欄,可以接受 CBCGPControlBar 派生的對象(通常是工具欄)。應(yīng)在主框架窗口初始化期間通過調(diào)用 mainframeclass::EnableDocking (DWORD dwDockStyle) 創(chuàng)建停靠欄,如果您想在主框架窗口的某些側(cè)面啟用“自動隱藏”欄,應(yīng)該調(diào)用 mainframeclass::EnableAutoHideBars(DWORD dwDockStyle),此調(diào)用將在每個停靠欄旁邊創(chuàng)建CBCGPAutoHideDockBar對象,您仍然可以使用 CBRS樣式來指定對接對齊。每個停靠欄都分為(包含列表)“停靠行”,停靠行由CBCGPDockBarRow表示班級,每個停靠行都包含一個工具欄列表。當(dāng)工具欄被停靠(例如通過鼠標(biāo))或在同一停靠裸露中從一行移動到另一行時,框架會創(chuàng)建一個新行并相應(yīng)地調(diào)整停靠欄的大小或?qū)⒐ぞ邫诜胖迷诂F(xiàn)有行上。
迷你框架窗口
當(dāng)控制欄浮動時,它駐留在小型框架窗口上,Miniframe 窗口由兩個類表示:CBCGPMiniFrameWnd(只能包含一個控制欄)和CBCGPMultiMiniFrameWnd(可以包含多個控制欄)。當(dāng)控制欄浮動時,框架會自動創(chuàng)建一個迷你框架窗口,要使控制欄在代碼中浮動,您可以調(diào)用CBCGPBaseControlBar::FloatControlBar ()。請注意,當(dāng)控制欄變?yōu)楦訒r,其父級會自動更改并設(shè)置為小型框架窗口,當(dāng)控制欄停靠時,其父項將更改回停靠欄(對于工具欄)或停靠站點(diǎn)(對于可調(diào)整大小的控制欄)。
滑塊
滑塊(或分離器)由CBCGPSlider類表示,當(dāng)停靠控制欄停到停靠站點(diǎn)或另一個控制欄時,框架會自動創(chuàng)建滑塊。當(dāng)欄停靠到停靠站點(diǎn)時,新滑塊稱為“默認(rèn)滑塊”,它包含有關(guān)其調(diào)整大小的停靠控制欄布局的所有信息。默認(rèn)滑塊放置在由停靠管理器維護(hù)的控制欄的常規(guī)列表中,并控制在“包含的”停靠控制欄上執(zhí)行的所有布局操作。
容器
所有可調(diào)整大小的控制欄在相互停靠時都保存在“容器”中。容器由CBCGPBarContainer類表示,每個容器都有指向“左”欄、“右”欄、“左”子容器、“右”子容器以及左右部分之間的分隔符的指針。通過這種方式,我們能夠構(gòu)建一個由多個控制欄和拆分器組成的樹,從而實(shí)現(xiàn)可以一起調(diào)整大小的非常復(fù)雜的控制欄布局,CBCGPBarContainerManager類維護(hù)容器樹(它包含指向根容器的指針),此外,它還維護(hù)放置在該樹中的兩個控制欄和滑塊列表。
自動隱藏控制欄
每個對接控制欄都會自動啟用“自動隱藏”功能,當(dāng)用戶單擊位于停靠控制欄標(biāo)題上的固定按鈕時,該欄將切換到自動隱藏模式。該框架創(chuàng)建一個 CBCGPAutoHideToolbar 類型的新工具欄和一個CBCGPAutoHideButton類型的新按鈕,將工具欄放置在自動隱藏停靠欄上(根據(jù)當(dāng)前欄對齊方式),將自動隱藏按鈕附加到工具欄并將指針附加到停靠控制欄到按鈕,此時,停靠控制欄被放置在由停靠管理器維護(hù)的自動隱藏欄的特殊列表中。
選項卡式控制欄和前景欄
CBCGPBaseTabWnd 類實(shí)現(xiàn)帶有可拆卸選項卡的選項卡式窗口的基本功能。CBCGPBaseTabbedBar派生自CBCGPDockingControlBar ,并維護(hù)指向 CBCGPBaseTabWnd 對象的指針,通過這種方式,我們實(shí)現(xiàn)了選項卡式控制欄的停靠和調(diào)整大小的能力,使用CBCGPDockingControlBar::AttachToTabWnd動態(tài)創(chuàng)建對接選項卡式控制欄。
Outlook 欄控件也基于專業(yè)版中的選項卡式欄(CBCGPOutlookBar派生自CBCGPBaseTabbedBar)。
自定義應(yīng)用程序操作的技巧
1.您可以應(yīng)用幾種新樣式的組合來創(chuàng)建一個新的控制欄:
CBRS_BCGP_FLOAT:使控制欄浮動
CBRS_BCGP_AUTOHIDE:啟用自動隱藏模式
CBRS_BCGP_CLOSE:控制欄可以關(guān)閉(隱藏)
CBCGPBaseControlBar實(shí)現(xiàn)以下虛擬布爾方法來反映這些標(biāo)志:CBCGPBaseControlBar ::CanBeClosed、CBCGPBaseControlBar::CanAutoHide、CBCGPBaseControlBar::CanFloat,您可以在派生類中重寫它們來自定義此操作。
2.您可以通過重寫CBCGPBaseControlBar::CanAcceptBar方法來自定義停靠操作,如果控制欄返回 FALSE,pBar 將不會停靠到該控制欄。
3.該庫現(xiàn)在允許兩種停靠模式:立即(在第一個測試版中可用 - 當(dāng)控制欄被拖動并與上下文停靠時)和標(biāo)準(zhǔn)(當(dāng)使用“拖動矩形”拖動控制欄并停靠時)。對接模式可以是 BCGP_DOCK_TYPE::DT_IMMEDIATE 或 BCGP_DOCK_TYPE::BCGP_DT_STANDARD,它由CBCGPDockManager::m_dockModeGlobal全局定義,您可以隨時更改此變量。如果要控制各個控制欄的停靠模式,可以重寫 BCGP_DOCK_TYPE CBCGPBaseControlBar::GetDockMode ()。
4.如果您想創(chuàng)建一個無法浮動的“靜態(tài)”控制欄,并且無法在其之前停靠任何控制欄(如 BCGPOutlookDemo 示例中的 Outlook 欄),則必須將其創(chuàng)建為非浮動并覆蓋 CBCGPBaseControlBar :: doesAllowDynInsertBefore方法返回 FALSE。從版本 6.01 開始,如果創(chuàng)建的欄沒有 CBRS_BCGP_FLOAT 樣式,則默認(rèn)實(shí)現(xiàn)返回 FALSE。
5.Outlook 欄的操作與常規(guī)選項卡式控制欄一樣,當(dāng)您將一個控制欄停靠到另一個控制欄時,將根據(jù)創(chuàng)建第二個停靠控制欄時指定的以下樣式來定義結(jié)果樣式:
- CBRS_BCGP_REGULAR_TABS:創(chuàng)建常規(guī)選項卡式控制欄
- CBRS_BCGP_OUTLOOK_TABS:創(chuàng)建 Outlook 樣式的選項卡欄
CBCGPDockingControlBar有 SetTabbedControlBarRTC 方法,可以使用它來自定義由于停靠到選項卡窗口而創(chuàng)建的控制欄。
6.您可以將任何 CWnd 派生的控件插入到 Outlook 和選項卡式控制欄中,該庫將使用CBCGPDockingCBWrapper對象自動包裝這些條形,可以將這些欄與 Outlook 和選項卡式控制欄分離,同時提供所需的對接行為。CBCGPBaseTabWnd(用作選項卡窗口和 Outlook 窗口的基類)具有 SetDockingBarWrapperRTC 方法,使您能夠自定義包裝器外觀和操作,將 CBCGPBaseTabWnd::m_bEnableWrapping 設(shè)置為 FALSE 來禁用此功能,請注意,當(dāng)控制欄被換行時,其直接父級被設(shè)置為虛擬停靠控制欄,該控制欄又被插入到選項卡窗口中。
7.如果要將選項卡添加為不可拆卸,可以調(diào)用 CBCGPBaseTabWnd::AddTab 并將bDetachable設(shè)置為FALSE或調(diào)用 CBCGPBaseTabWnd::EnableTabDetach。
8.如果要啟用/禁用選項卡交換,請調(diào)用 CBCGPBaseTabWnd::EnableTabSwap。
9.強(qiáng)烈建議創(chuàng)建 ID 不為 -1 的所有控制欄。
10.如果您對初始對接布局進(jìn)行任何更改,則必須清除應(yīng)用程序注冊表項才能看到更改(如果您的應(yīng)用程序?qū)訝顟B(tài)保存到注冊表)。
11.如果啟用可分離選項卡,則可以動態(tài)創(chuàng)建和銷毀選項卡式窗口,不要保存指向動態(tài)選項卡式窗口的指針。
12.如果您為兩個非選項卡式停靠控制欄調(diào)用CBCGPDockingControlBar::AttachToTabWnd ,則將使用最后一個參數(shù) ppTabbedControlBar 返回指向選項卡式窗口的指針,可以使用它繼續(xù)向新創(chuàng)建的選項卡式窗口添加選項卡(或進(jìn)行其他操作)。
13.如果您想用任何對齊方式將一個停靠控制欄停靠到另一個停靠控制欄,可以調(diào)用CBCGPDockingControlBar::DockToWindow,原來的控制欄此時必須停靠在某處,對于工具欄,依然可以使用CBCGPFrameWnd::DockControlBarLeftOf。
14.ShowControlBar 方法有第三個非默認(rèn)參數(shù) bActivate,因此某些現(xiàn)有代碼可能無法編譯。
15.CBCGPDockingControlBar::m_bHideInAutoHideMode是一個新的靜態(tài)成員,用于控制在調(diào)用CBCGPFrameWnd::ShowControlBar時對接控制欄在自動隱藏模式下的操作方式。如果此變量設(shè)置為 TRUE,控制欄及其自動隱藏按鈕將被隱藏,否則,控制欄將滑入/滑出。
16.不要使用 GetStyle() 和 WS_VISIBLE 來確定控制欄的可見性,請改用CBCGPBaseControlBar::IsVisible,因?yàn)樗梢哉_處理選項卡式/自動隱藏模式下的可見性狀態(tài)。
17.如果想創(chuàng)建一個非浮動、不可調(diào)整大小的控制欄,則不能調(diào)用 DockControlBar,您必須改為調(diào)用CBCGPDockManager::AddControlBar (CBCGPControlBar* pNonFloatingBar, ...) ,此調(diào)用將向停靠管理器注冊此控制欄,并且此控制欄將參與停靠布局。
18.如果要創(chuàng)建非浮動可調(diào)整大小的控制欄,則應(yīng)在不使用 CBRS_BCGP_FLOAT 樣式的情況下創(chuàng)建它并調(diào)用 DockControlBar (CBCGPDockingControlBar* pResizingBar)。
19.如果想從停靠布局中排除控制欄,從其停靠欄中刪除工具欄等,您必須調(diào)用CBCGPBaseControlBar::UnDockControlBar,不能為自動隱藏模式下的控制欄或位于選項卡式窗口的選項卡中的控制欄調(diào)用此方法。
20.如果控制欄已設(shè)置為自動隱藏模式,則必須在調(diào)用CBCGPBaseControlBar::FloatControlBar或CBCGPBaseControlBar::UnDockControlBar之前調(diào)用 SetAutoHideMode (FALSE,...) 。
21.您可以使用CBCGPDockingControlBar::m_bDisableAnimation禁用自動隱藏動畫。