2008. 9. 29. 00:30

[번역] Architecture of BCGControlBar Library (Professional Edition)

Architecture of BCGControlBar Library (Professional Edition)

 

번역 : codemuri (http://codemuri.tistory.com/)

 

BCGControlBar Library Proferssional Edition (Pro Version) 은 비 MFC 기반 도킹 아키텍처이다.

이것은 모든 control bar CControlBar를 상속하지 않는다는 것을 의미한다. Pro 버전에서 모든 컨트롤 바의 기본 클래스는 CBCGPBaseControlBar (CWnd로부터 상속된) 이다.

 

Pro 버전 아키텍처에 숨겨진 메인 아이디어는 MFC와 크게 다르지 않다. 오히려 Pro 버전이 MFC와 아주 호환될 수 있도록 만들려고 노력하고 있다.

 

아래는 Pro 버전으로 만들어진 애플리케이션의 이미지이다.



 

애플리케이션 메인 프레임 윈도우는 보통 CBCGPFrameWnd 또는 CBCGPMDIFrameWnd로 표현된다. 메인 프레임은 “dock site”라고 불린다. 모든 control bar는 세 종류의 부모를 가 질 수 있다:

l  “dock site”,

l  “dock bar” 또는

l  “miniframe window”.

Control bar는 두개의 일반적인 형태로 나뉠 수 있다:

l  non resizable control bar (status bar toolbar와 같은) 그리고

l  resizable control bar.

 

“resizable” control bar 의 경우 splitter(또는 slider)에 의해 크기가 조절될 수 있는 바를 의미하거나, “container”(다른 control bar에 도킹 될 수 있고 control bar들 사이에 splitter를 생성할 수 있는 하나의 control bar) 를 형성하는(form) 바를 의미하거나, 그리고 dock bar에 부착될 수 (또는, 도킹 될 수) 없는 bar를 의미한다.

모든 non resizable control barCBCGPControlBar를 상속해야 한다. 모든 resizable control barCBCGPDockingControlBar 를 상속해야 한다. (이 클래스는 dock site에 도킹될 수 있는, container 내에 놓일 수 있는, autohide가 될 수 있는 등의 기본적인 능력을 구현한다.)

 

Dock Site

메인 프레임 윈도우 또는 dock site는 모든 control bar miniframe window의 소유자(owner)이다. CBCGPDockManager 클래스의 내장 멤버를 포함한다 (뒤에서부터는 docking manager). docking manager dock site에 속하는 모든 control bar의 목록을 관리한다. 그 목록은 dock site의 바깥쪽 가장자리(outer edge)에서부터 생성된 바를 처음에 오게하는 방식으로 정렬된다. layout이 재계산 되어야할 필요가 있을 때, 그 목록을 순회하고(loop over), (dock siter) 현재 경계 영역(bounding rectangle)에 맞게 각 control bar layout을 조절하고, 그리고 control bar 영역 일부를 제거한다. 도킹 layout을 조절해야 할 필요가 있을 때마다 mainframeclass::AdjustDockingLayout 또는 RecalcLayout 을 호출할 수 있다 그리고 이러한 호출은 docking manager에게 재지정될 것이다. (redirected)

 

Dock bar

main frame border를 따라 위치한 (border에 배치된) “dock bar”를 가질 수 있다. Dock barCBCGPDockBar 클래스의 control bar이다. Dock bar CBCGPControlBar를 상속한 객체 (보통은 toolbar)를 받아들일 수 있다. Dock bar main frame window의 초기화 동안에 mainframeclass::EnableDocking(DWORD dwDockStyle) 을 호출함으로써 생성되어야 한다. main frame 윈도우의 어떤 사이드에서 “auto hide” 바를 활성화하길 원한다면 mainframeclass::EnableAutoHideBars(DWORD dwDockStyle)을 호출해야 한다. docking 배열을 상세하기 위해서 CBRS_ 스타일을 여전히 사용할 수 있다. dock bar“dock row”로 나뉘어 진다(“dock row”에 대한 목록을 포함한다). Dock rowCBCGPDockBarRow 클래스에 의해 표현된다. dock row는 툴바 목록을 포함하고 있다. 툴바가 도킹 될 때 (예를 들어, 마우스에 의해) 또는 동일한 dock bar내에서 한 행(row)에서 다른 행으로 이동될 때, framework는 새로운 행을 생성하고 적절히 dock bar의 크기를 변경하거나 현존하는 행(row) 위에 툴바를 위치시킨다.

 

Miniframe window

control bar가 떠다닐 때 control bar miniframe window위에 상주한다. miniframe window는 두개의 클래스로 표현된다. CBCGPMiniFrameWnd (오직 한 개의 control bar만을 포함할 수 있다) CBCGPMultiMiniFrameWnd (여러 개의 control bar를 포함할 수 있다). miniframe window control bar가 떠 다니게 될 때 framework에 의해 자동적으로 생성된다. code에서 control bar가 떠다니도록 만들기 위해서는 CBCGPBaseControlBar::FloatControlBar()를 호출할 수 있다. control bar가 떠 다니게 될 때 그 control bar의 부모는 자동적으로 변경되고 miniframe window에 설정된다. control bar가 도킹될 때 control bar의 부모는 dock bar (툴바를 위한)로 변경되거나 dock site (크기조절이 가능한 control bar를 위한)로 변경된다.

 

Sliders

Slider (또는 splitter)CBCGPSlider 클래스로 표현된다. Slider docking control bar dock site나 다른 control bar에 도킹될 때 framework에 의해 자동적으로 생성된다. bar dock site에 도킹될 때 그 새로운 slider“default slider”라 불린다. default slider는 크기를 조절하는 docking control bar layout에 관한 모든 정보를 포함하고 있다. Default sliderdock manager에 의해 관리되는 control bar의 목록 내에 위치하고 포함된(contained) docking control bar 위에서 수행된 모든 layout 연산을 제어한다.

 

Containers

모든 크기변경이 가능한 control bar, control bar에서 다른 control bar로 도킹될 때, “container”에 의해 관리된다. ContainerCBCGPBarContainer 클래스로 표현된다. container“left” bar, “right” bar, “left” sub-container, left right 부분사이의 “right” sub-conatiner splitter에 대한 포인터를 가지고 있다. 이런 식으로 여러 control bar splitter의 트리를 구축할 수 있다 그리하여 함께 크기가 변경될 수 있는 control bar들의 매우 복잡한 layout을 이룩할 수 있다. CBCGPBarContainerManager 클래스는 container의 트리를 관리한다 (CBCGPBarContainerManager root container에 대한 포인터를 포함한다). 또한, CBCGPBarConatinerManager는 이 트리 내에 위치된 control bar slider에 대한 두 개의 목록을 관리한다. Bar container manager는 대개 다중 control bar를 운반하는 default slider miniframe window에 내장된다(embedded).

 

Autohide control bars

docking control bar“autohide” 능력을 가지기 위해 자동적으로 활성화된다. 사용자가 docking control bar의 제목에 위치한 pin 버튼을 클릭할 때, bar autohide mode로 전환된다. frameworkCBCGPAutoHideToolbar 타입의 새로운 툴바와 CBCGPAutoHideButton 타입의 새로운 버튼을 생성하고, autohide dock bar 위에 툴바를 위치시키고 (현재 bar 정렬에 따라), 그 툴바에 autohide 버튼을 부착시킨다 그리고 docking control bar에 대한 포인터를 그 버튼에 부착한다. 이 때 docking control bar dock manager에 의해 관리되는 autohide bar의 특별한 목록 내에 놓여진다.

 

Tabbed control bars and outlook bars

CBCGPBaseTabWnd 클래스는 떼어낼수 있는(detachable) tab을 가진 tabbed window의 기본 기능을 구현한다. CBCGPBaseTabbedBarCBCPDockingControlBar를 상속하고 CBCGPBaseTabWnd 객체에 대한 포인터를 관리한다. 이런 식으로 tabbed control bar를 도킹하고 크기를 변경하는 능력을 달성한다. 떠다니는 동안 docking tabbed control bar를 생성하기 위해서는 CBCGPDockingControlBar::AttachToTabWnd 를 사용하라.

(Use CBCGPDockingControlBar::AttachToTabWnd to create docking tabbed control bars on the fly.)

Outlook bar control 또한 Pro Version에서는 tabbed bar 기초를 두고 있다 (CBCGPOutlookBar CBCGPBaseTabbedBar 상속한다)

 

Some tips how to customize the application behavior

1.    여러 새로운 스타일의 조합을 적용시키는 새로운 control bar 생성할 있다.

CBRS_BCGP_FLOAT              - control bar 떠다니게 만든다

CBRS_BCGP_AUTOHIDE        - auto hide mode 활성화 한다.

CBRS_BCGP_CLOSE              - control bar 닫힐 있다(숨겨질 있다)

 

CBCGPBaseControlBar 이러한 플래그를 반영하기 위한 다음의 virtual Boolean 메소드를 구현한다 : CanBeClosed(), CanAutoHide(), CanFloat(). 이런 행위를 커스터마이즈 하기 위해 상속된 클래스내에서 메소드들을 재정의할 있다.

 

2.    BOOL CanAcceptBar(const CBCGPBaseControlBar * pBar) 메소드를 재정의함(override)으로써 도킹되는 행위를 커스터마이즈 있다. control bar FALSE 반환할 pBar control bar 도킹되지 않을 것이다.

 

3.    이제 라이브러리는 두개의 도킹 모드를 허용한다: immediate (control bar 드래그 되고 어떤 context 도킹될 처음 베타 내에서 사용가능 했던) standard (control bar 드래그 되고 drag rectangle 사용하여 도킹될 ). 도킹 모드는 BCGP_DOCK_TYPE::DT_IMMEDIATE 또는 BCGP_DOCK_TYPE::BCGP_DT_STANDARD 있다 그리고 CBCGPDockManager::m_dockModelGlobal 의해 전역으로 정의된다. 변수를 언제든 변경할 있다. 개인적인 control bar 위한 도킹 모드를 제어하길 원한다면, BCGP_DOCKTYPE CBCGPBaseControlBar::GetDockMode() 재정의할 있다.

 

4.    다닐 없고 control bar 도킹 없는 static control bar 생성하길 원한다면 (BCGPOutlookDemo 예제에서 outlook bar 처럼) control bar non-floating 으로 생성해야 하고 FALSE 반환하는 DoesAllowDynInsertBefore 메소드를 재정의 해야 한다. bar CBRS_BCGP_FLOAT 스타일 없이 생성되었다면 버전 6.01 부터 디폴트 구현은 FALSE 반환한다.

 

5.    Outlook bar regular tabbed control bar로서 동작한다. control bar 다른 control bar 도킹할 초래되는 스타일은 두번째 도킹 control bar 생성될 상세했던 다음 스타일에 따라 정의된다.

 

CBRS_BCGP_REGULAR_TABS – regular tabbed control bar 생성한다

CBRS_BCGP_OUTLOOK_TABS – outlook-스타일의 tabbed bar 생성한다.

 

CBCGPDockingControlBar SetTabbedControlBarRTC 메소드를 가지고 있다. tab window 대한 도킹의 결과로 생성될 control bar 커스터마이즈 하기 위해서 이것을 사용할 있다.

 

6.    outlook tabbed control bar CWnd 상속한 모든 control 추가할 있다. 라이브러리는 CBCGPDockingCBWrapper 객체를 사용하여 그러한 bar 자동적으로 감쌀 것이다(Wrap). 이것은 요구되는 도킹 행위를 동시에 제공하는 outlook tabbed control bar로부터 이러한 bar들을 떼어내도록(detach) 허용한다. CBCGPBaseTabWnd( tab window outlook window base class 사용되는) wrapper appearance behavior 커스터마이즈 있도록 하는 SetDockingBarWrapperRTC 메소드를 가지고 있다. 기능을 비활성화 하기 위해서는 CBCGPBaseTabWnd::m_bEnableWrapping FALSE 설정한다. control bar wrap , control bar 직접적인 부모(immediate parent) tab window 추가되는 시점에 dummy docking control bar 설정된다.

7.    non-detachable tab 추가하고자 한다면 CBCGPBaseTabWnd::AddTab 호출하고 bDetachable FALSE 설정하거나 EnableTabDetach 호출할 있다.

 

8.    tab 전환(swapping) 활성/비활성하길 원한다면 CBCGPBaseTabWnd::EnableTabSwap 호출하라.

 

9.    -1 아닌 ID 모든 control bar 생성하길 강력하게 추천한다.

 

10. 초기 도킹 layout 변경하길 원한다면, 변경을 보기 위해서는 application 레지스트리 entry clear해야 한다. (application docking 상태를 registry 저장한다면)

 

11.  detachable tab 활성화 하고자 한다면, tabbed window 동적으로 생성되고 소멸될 것이다, 동적인 tabbed window 대한 포인터를 저장하지 마라.

 

12. 두개의 non-tabbed docking control bar 대해 CBCGPDockingControlBar::AttachToTabWnd 호출한다면, tabbed window 대한 포인터는 마지막 파라미터 ppTabbedControlBar 이용하여 반환될 것이다. 새로이 생성된 tabbed window tab 계속해서 추가하기 위해서 (또는 다른 연산을 위해서) 그것을 사용할 있다.  

 

13. docking control bar 다른 control bar 어떤 순서(alignment)로든 도킹시키길 원한다면, CBCGPDockingControlBar::DockToWindow 호출할 있다. 원본 control bar 이때 어딘가에 도킹되어야만 한다. 툴바의 경우 DockControlBarLeftOf 여전히 사용할 있다.

 

14. ShowControlBar 메소드는 세번째에 non-default 파라미터인 bActivate 가지고 있다, 그리하여 예전 코드는 컴파일되지 않을 있다.

 

15. CBCGPDockingControlBar::m_bHideInAutoHideMode ShowContrlBar 호출할 자동 숨김 모드일 경우 docking control bar 어떻게 동작할지에 대해 제어하는 새로운 정적 멤버이다. 변수가 만일 TRUE 설정된다면, control bar control bar 자동 숨김 버튼은 숨겨질 것이다. 그렇지 않은 경우, control bar slide in/out 것이다.

 

16. control bar 가시성(visibility) 결정짓기 위해 GetStyle() & WS_VISIBLE 사용하지 마라. 대신에 CBCGBaseControlBar::IsVisible 사용하라, 왜냐하면 함수가 tabbed/autohide 모드에서 visibility state 올바르게 다루기 때문이다.

 

17. non-floating, non-resizable control bar 생성하길 원한다면 DockControlBar 호출해서는 안된다. 대신에 CBCGPDockManager::AddControlBar(CBCGPControlBar * pNonFloatingBar, …) 호출해야 한다. 이것은 control bar docking manager 이용하여 등록할 것이고 bar docking layout 일부가 것이다.

 

18. non-floating resizable control bar 생성하길 원한다면, CBRS_BCGP_FLOAT 스타일 없이 그것을 생성해야만 하고 DockControlBar(CBCGPDockingControlBar* pResizableBar) 호출해야 한다.

 

19. docking layout에서 어떤 control bar 제거(exclude)하길 원한다면, control bar dock bar로부터 toolbar 제거하고 CBCGPBaseControlBar::UnDockControlBar 호출해야 한다. autohide 모드에 있는 control bar 대해서나 tabbed window tab 상주하고 있는 control bar 대해서는 메소드를 호출해서는 안된다.

 

20. control bar autohide 모드로 설정된 경우, CBCGPBaseControlBar::FloatControlBar 또는 CBCGPBaseControlBar::UnDockControlBar 호출하기 전에 SetAutoHideMode 호출해야 한다.

 

21. CBCGPDockingControlBar::m_bDisableAnimation 사용하여 autohide animation 비활성화 있다.