庫(kù)結(jié)構(gòu)
立即下載BCGControlBar Professional Edition for MFC
BCGControlBar Library Professional Edition (Pro Version)介紹了非 MFC的對(duì)接架構(gòu),這意味著所有控制欄不再派生自CControlBar,專業(yè)版中所有控制欄的基類是CBCGPBaseControlBar(它又派生自 CBCGPWnd)。
專業(yè)版架構(gòu)背后的主要思想與 MFC 沒(méi)有太大區(qū)別,更重要的是,我們?cè)噲D使專業(yè)版與MFC(和BCGControlBar庫(kù)標(biāo)準(zhǔn)版)高度兼容。
下面您可以看到使用專業(yè)版構(gòu)建的應(yīng)用程序的圖片:
應(yīng)用程序主框架窗口通常由CBCGPFrameWnd或CBCGPMDIFrameWnd表示,主框架稱為“停靠站點(diǎn)”。所有控制欄都可以具有三種類型的父級(jí):“??空军c(diǎn)”、“停靠欄”或“小型框架窗口”,控制欄可分為兩種一般類型:不可調(diào)整大小的控制欄(例如狀態(tài)欄和工具欄)和可調(diào)整大小的控制欄。在“可調(diào)整大小”控制欄下,我們指的是可以通過(guò)拆分器(或“滑塊”)調(diào)整大小的欄,可以形成“容器”(一個(gè)控制欄可以??康搅硪粋€(gè)控制欄并在它們之間創(chuàng)建拆分器)并且不能連接(停靠)到??繖?,所有不可調(diào)整大小的控制欄應(yīng)源自CBCGPControlBar,CBCGPDockingControlBar(此類實(shí)現(xiàn)了??吭谕?空军c(diǎn)、放置在容器中、自動(dòng)隱藏等基本功能)。
??空军c(diǎn)
主框架窗口或??空军c(diǎn)是所有控制欄和小型框架窗口的所有者,它包含CBCGPDockManager類(稍后的對(duì)接管理器)的嵌入成員。停靠管理器維護(hù)屬于??空军c(diǎn)的所有控制欄的列表,該列表的排序方式是在??空军c(diǎn)外邊緣創(chuàng)建的欄排在最前面。當(dāng)需要重新計(jì)算布局時(shí),它會(huì)循環(huán)遍歷此列表,將每個(gè)控制欄的布局調(diào)整為(??空军c(diǎn)的)當(dāng)前邊界矩形,并減去控制欄區(qū)域,每次需要調(diào)整??坎季謺r(shí),您都可以調(diào)用 mainframeclass::AdjustDockingLayout 或 RecalcLayout,該調(diào)用將被重定向到停靠管理器。
Dock欄
每個(gè)主框架可以具有沿邊界放置的“停靠欄”(與邊界對(duì)齊),Dock欄是CBCGPDockBar類的控制欄,可以接受 CBCGPControlBar 派生的對(duì)象(通常是工具欄)。應(yīng)在主框架窗口初始化期間通過(guò)調(diào)用 mainframeclass::EnableDocking (DWORD dwDockStyle) 創(chuàng)建??繖冢绻朐谥骺蚣艽翱诘哪承﹤?cè)面啟用“自動(dòng)隱藏”欄,應(yīng)該調(diào)用 mainframeclass::EnableAutoHideBars(DWORD dwDockStyle),此調(diào)用將在每個(gè)停靠欄旁邊創(chuàng)建CBCGPAutoHideDockBar對(duì)象,您仍然可以使用 CBRS樣式來(lái)指定對(duì)接對(duì)齊。每個(gè)??繖诙挤譃椋ò斜恚巴?啃小?,??啃杏蒀BCGPDockBarRow表示班級(jí),每個(gè)停靠行都包含一個(gè)工具欄列表。當(dāng)工具欄被??浚ɡ缤ㄟ^(guò)鼠標(biāo))或在同一停靠裸露中從一行移動(dòng)到另一行時(shí),框架會(huì)創(chuàng)建一個(gè)新行并相應(yīng)地調(diào)整??繖诘拇笮』?qū)⒐ぞ邫诜胖迷诂F(xiàn)有行上。
迷你框架窗口
當(dāng)控制欄浮動(dòng)時(shí),它駐留在小型框架窗口上,Miniframe 窗口由兩個(gè)類表示:CBCGPMiniFrameWnd(只能包含一個(gè)控制欄)和CBCGPMultiMiniFrameWnd(可以包含多個(gè)控制欄)。當(dāng)控制欄浮動(dòng)時(shí),框架會(huì)自動(dòng)創(chuàng)建一個(gè)迷你框架窗口,要使控制欄在代碼中浮動(dòng),您可以調(diào)用CBCGPBaseControlBar::FloatControlBar ()。請(qǐng)注意,當(dāng)控制欄變?yōu)楦?dòng)時(shí),其父級(jí)會(huì)自動(dòng)更改并設(shè)置為小型框架窗口,當(dāng)控制欄??繒r(shí),其父項(xiàng)將更改回??繖冢▽?duì)于工具欄)或??空军c(diǎn)(對(duì)于可調(diào)整大小的控制欄)。
滑塊
滑塊(或分離器)由CBCGPSlider類表示,當(dāng)??靠刂茩谕5酵?空军c(diǎn)或另一個(gè)控制欄時(shí),框架會(huì)自動(dòng)創(chuàng)建滑塊。當(dāng)欄??康酵?空军c(diǎn)時(shí),新滑塊稱為“默認(rèn)滑塊”,它包含有關(guān)其調(diào)整大小的??靠刂茩诓季值乃行畔?。默認(rèn)滑塊放置在由??抗芾砥骶S護(hù)的控制欄的常規(guī)列表中,并控制在“包含的”停靠控制欄上執(zhí)行的所有布局操作。
容器
所有可調(diào)整大小的控制欄在相互??繒r(shí)都保存在“容器”中。容器由CBCGPBarContainer類表示,每個(gè)容器都有指向“左”欄、“右”欄、“左”子容器、“右”子容器以及左右部分之間的分隔符的指針。通過(guò)這種方式,我們能夠構(gòu)建一個(gè)由多個(gè)控制欄和拆分器組成的樹(shù),從而實(shí)現(xiàn)可以一起調(diào)整大小的非常復(fù)雜的控制欄布局,CBCGPBarContainerManager類維護(hù)容器樹(shù)(它包含指向根容器的指針),此外,它還維護(hù)放置在該樹(shù)中的兩個(gè)控制欄和滑塊列表。
自動(dòng)隱藏控制欄
每個(gè)對(duì)接控制欄都會(huì)自動(dòng)啟用“自動(dòng)隱藏”功能,當(dāng)用戶單擊位于??靠刂茩跇?biāo)題上的固定按鈕時(shí),該欄將切換到自動(dòng)隱藏模式。該框架創(chuàng)建一個(gè) CBCGPAutoHideToolbar 類型的新工具欄和一個(gè)CBCGPAutoHideButton類型的新按鈕,將工具欄放置在自動(dòng)隱藏??繖谏希ǜ鶕?jù)當(dāng)前欄對(duì)齊方式),將自動(dòng)隱藏按鈕附加到工具欄并將指針附加到??靠刂茩诘桨粹o,此時(shí),停靠控制欄被放置在由??抗芾砥骶S護(hù)的自動(dòng)隱藏欄的特殊列表中。
選項(xiàng)卡式控制欄和前景欄
CBCGPBaseTabWnd 類實(shí)現(xiàn)帶有可拆卸選項(xiàng)卡的選項(xiàng)卡式窗口的基本功能。CBCGPBaseTabbedBar派生自CBCGPDockingControlBar ,并維護(hù)指向 CBCGPBaseTabWnd 對(duì)象的指針,通過(guò)這種方式,我們實(shí)現(xiàn)了選項(xiàng)卡式控制欄的停靠和調(diào)整大小的能力,使用CBCGPDockingControlBar::AttachToTabWnd動(dòng)態(tài)創(chuàng)建對(duì)接選項(xiàng)卡式控制欄。
Outlook 欄控件也基于專業(yè)版中的選項(xiàng)卡式欄(CBCGPOutlookBar派生自CBCGPBaseTabbedBar)。
自定義應(yīng)用程序操作的技巧
1.您可以應(yīng)用幾種新樣式的組合來(lái)創(chuàng)建一個(gè)新的控制欄:
CBRS_BCGP_FLOAT:使控制欄浮動(dòng)
CBRS_BCGP_AUTOHIDE:?jiǎn)⒂米詣?dòng)隱藏模式
CBRS_BCGP_CLOSE:控制欄可以關(guān)閉(隱藏)
CBCGPBaseControlBar實(shí)現(xiàn)以下虛擬布爾方法來(lái)反映這些標(biāo)志:CBCGPBaseControlBar ::CanBeClosed、CBCGPBaseControlBar::CanAutoHide、CBCGPBaseControlBar::CanFloat,您可以在派生類中重寫(xiě)它們來(lái)自定義此操作。
2.您可以通過(guò)重寫(xiě)CBCGPBaseControlBar::CanAcceptBar方法來(lái)自定義??坎僮?,如果控制欄返回 FALSE,pBar 將不會(huì)??康皆摽刂茩?。
3.該庫(kù)現(xiàn)在允許兩種??磕J剑毫⒓矗ㄔ诘谝粋€(gè)測(cè)試版中可用 - 當(dāng)控制欄被拖動(dòng)并與上下文??繒r(shí))和標(biāo)準(zhǔn)(當(dāng)使用“拖動(dòng)矩形”拖動(dòng)控制欄并??繒r(shí))。對(duì)接模式可以是 BCGP_DOCK_TYPE::DT_IMMEDIATE 或 BCGP_DOCK_TYPE::BCGP_DT_STANDARD,它由CBCGPDockManager::m_dockModeGlobal全局定義,您可以隨時(shí)更改此變量。如果要控制各個(gè)控制欄的停靠模式,可以重寫(xiě) BCGP_DOCK_TYPE CBCGPBaseControlBar::GetDockMode ()。
4.如果您想創(chuàng)建一個(gè)無(wú)法浮動(dòng)的“靜態(tài)”控制欄,并且無(wú)法在其之前??咳魏慰刂茩冢ㄈ?BCGPOutlookDemo 示例中的 Outlook 欄),則必須將其創(chuàng)建為非浮動(dòng)并覆蓋 CBCGPBaseControlBar :: doesAllowDynInsertBefore方法返回 FALSE。從版本 6.01 開(kāi)始,如果創(chuàng)建的欄沒(méi)有 CBRS_BCGP_FLOAT 樣式,則默認(rèn)實(shí)現(xiàn)返回 FALSE。
5.Outlook 欄的操作與常規(guī)選項(xiàng)卡式控制欄一樣,當(dāng)您將一個(gè)控制欄??康搅硪粋€(gè)控制欄時(shí),將根據(jù)創(chuàng)建第二個(gè)??靠刂茩跁r(shí)指定的以下樣式來(lái)定義結(jié)果樣式:
- CBRS_BCGP_REGULAR_TABS:創(chuàng)建常規(guī)選項(xiàng)卡式控制欄
- CBRS_BCGP_OUTLOOK_TABS:創(chuàng)建 Outlook 樣式的選項(xiàng)卡欄
CBCGPDockingControlBar有 SetTabbedControlBarRTC 方法,可以使用它來(lái)自定義由于停靠到選項(xiàng)卡窗口而創(chuàng)建的控制欄。
6.您可以將任何 CWnd 派生的控件插入到 Outlook 和選項(xiàng)卡式控制欄中,該庫(kù)將使用CBCGPDockingCBWrapper對(duì)象自動(dòng)包裝這些條形,可以將這些欄與 Outlook 和選項(xiàng)卡式控制欄分離,同時(shí)提供所需的對(duì)接行為。CBCGPBaseTabWnd(用作選項(xiàng)卡窗口和 Outlook 窗口的基類)具有 SetDockingBarWrapperRTC 方法,使您能夠自定義包裝器外觀和操作,將 CBCGPBaseTabWnd::m_bEnableWrapping 設(shè)置為 FALSE 來(lái)禁用此功能,請(qǐng)注意,當(dāng)控制欄被換行時(shí),其直接父級(jí)被設(shè)置為虛擬停靠控制欄,該控制欄又被插入到選項(xiàng)卡窗口中。
7.如果要將選項(xiàng)卡添加為不可拆卸,可以調(diào)用 CBCGPBaseTabWnd::AddTab 并將bDetachable設(shè)置為FALSE或調(diào)用 CBCGPBaseTabWnd::EnableTabDetach。
8.如果要啟用/禁用選項(xiàng)卡交換,請(qǐng)調(diào)用 CBCGPBaseTabWnd::EnableTabSwap。
9.強(qiáng)烈建議創(chuàng)建 ID 不為 -1 的所有控制欄。
10.如果您對(duì)初始對(duì)接布局進(jìn)行任何更改,則必須清除應(yīng)用程序注冊(cè)表項(xiàng)才能看到更改(如果您的應(yīng)用程序?qū)?duì)接狀態(tài)保存到注冊(cè)表)。
11.如果啟用可分離選項(xiàng)卡,則可以動(dòng)態(tài)創(chuàng)建和銷毀選項(xiàng)卡式窗口,不要保存指向動(dòng)態(tài)選項(xiàng)卡式窗口的指針。
12.如果您為兩個(gè)非選項(xiàng)卡式??靠刂茩谡{(diào)用CBCGPDockingControlBar::AttachToTabWnd ,則將使用最后一個(gè)參數(shù) ppTabbedControlBar 返回指向選項(xiàng)卡式窗口的指針,可以使用它繼續(xù)向新創(chuàng)建的選項(xiàng)卡式窗口添加選項(xiàng)卡(或進(jìn)行其他操作)。
13.如果您想用任何對(duì)齊方式將一個(gè)??靠刂茩谕?康搅硪粋€(gè)??靠刂茩?,可以調(diào)用CBCGPDockingControlBar::DockToWindow,原來(lái)的控制欄此時(shí)必須??吭谀程?,對(duì)于工具欄,依然可以使用CBCGPFrameWnd::DockControlBarLeftOf。
14.ShowControlBar 方法有第三個(gè)非默認(rèn)參數(shù) bActivate,因此某些現(xiàn)有代碼可能無(wú)法編譯。
15.CBCGPDockingControlBar::m_bHideInAutoHideMode是一個(gè)新的靜態(tài)成員,用于控制在調(diào)用CBCGPFrameWnd::ShowControlBar時(shí)對(duì)接控制欄在自動(dòng)隱藏模式下的操作方式。如果此變量設(shè)置為 TRUE,控制欄及其自動(dòng)隱藏按鈕將被隱藏,否則,控制欄將滑入/滑出。
16.不要使用 GetStyle() 和 WS_VISIBLE 來(lái)確定控制欄的可見(jiàn)性,請(qǐng)改用CBCGPBaseControlBar::IsVisible,因?yàn)樗梢哉_處理選項(xiàng)卡式/自動(dòng)隱藏模式下的可見(jiàn)性狀態(tài)。
17.如果想創(chuàng)建一個(gè)非浮動(dòng)、不可調(diào)整大小的控制欄,則不能調(diào)用 DockControlBar,您必須改為調(diào)用CBCGPDockManager::AddControlBar (CBCGPControlBar* pNonFloatingBar, ...) ,此調(diào)用將向??抗芾砥髯?cè)此控制欄,并且此控制欄將參與??坎季?。
18.如果要?jiǎng)?chuàng)建非浮動(dòng)可調(diào)整大小的控制欄,則應(yīng)在不使用 CBRS_BCGP_FLOAT 樣式的情況下創(chuàng)建它并調(diào)用 DockControlBar (CBCGPDockingControlBar* pResizingBar)。
19.如果想從??坎季种信懦刂茩冢瑥钠渫?繖谥袆h除工具欄等,您必須調(diào)用CBCGPBaseControlBar::UnDockControlBar,不能為自動(dòng)隱藏模式下的控制欄或位于選項(xiàng)卡式窗口的選項(xiàng)卡中的控制欄調(diào)用此方法。
20.如果控制欄已設(shè)置為自動(dòng)隱藏模式,則必須在調(diào)用CBCGPBaseControlBar::FloatControlBar或CBCGPBaseControlBar::UnDockControlBar之前調(diào)用 SetAutoHideMode (FALSE,...) 。
21.您可以使用CBCGPDockingControlBar::m_bDisableAnimation禁用自動(dòng)隱藏動(dòng)畫(huà)。