Introduction.
This is an implementation of docking windows for the WTL library. The following topics describe how to use docking window classes.
Pre-Build Set-Up.
- Make sure all header files are placed in the appropriate location and compiler can reach it.
- Add
DockImpl.cpp
to the project. Probably the best way to do it is to add #include<DockImpl.cpp>
to the stdafx.cpp
.
- Docking Windows use STL so it's requires to enable exception handling (
/GX
or /EH
compiler options) and remove _ATL_MIN_CRT
from the list the preprocessor defines in release configuration. If you use standard HP's STL you can leave default project setting intact, but I don't think it is a good idea.
- If you use boost library define
USE_BOOST
.
- I use some private message in range
WM_USER
to WM_USER + 2
WMDF_FIRST = WM_USER
WMDF_LAST = WM_USER + 2
So if you define your own private messages please use WMDF_LAST+1
or if it is impossible redefine WMDF_FIRST
.
Add to Main Frame Support for Docking Window Features
- Create a new project with ATL/WTL AppWizard (MDI or SDI as you like)
- Add
#include <DockingFrame.h>
to CMainFrame
header.
- Change the base of your
CMainFrame
class to dockwins::CDockingFrameImpl<CMainFrame>
for SDI applications or to dockwins::CMDIDockingFrameImpl<CMainFrame>
for MDI applications. All references to previous base class should be replaced by new one.
- Add to the
OnCreate
method of your CMainFrame
class InitializeDockingFrame()
; it's the best place to change windows behavior of docking window. By default it is depend on system setting (Show window contents while dragging) if you for some reason need to change it you should use the following flags:
CDockingBarStyle::sUseSysSettings
� depend on system setting, default.
CDockingBarStyle::sIgnoreSysSettings | CDockingBarStyle::sFullDrag
� full drag
CDockingBarStyle::sIgnoreSysSettings | CDockingBarStyle::sGhostDrag
� ghost drag.
If you use auto-hiding features you also can use the following flags:
CDockingBarStyle::sAnimation
� animate auto-hiding windows.
CDockingBarStyle::sNoAnimation
� do not animate auto-hiding windows.
Implement a Docking Window
- Add
#include <ExtDockingWindow.h>
to header file of your docking window.
- Create new class
CSampleDockingWindow
for example. Derive it from dockwins::CTitleDockingWindowImpl
.
- Add message map and
DECLARE_WND_CLASS
macro The CSampleDockingWindow class should look like this:
class CSampleDockingWindow :
public dockwins::CTitleDockingWindowImpl< SampleDockingWindow,
CWindow, dockwins::COutlookLikeTitleDockingWindowTraits >
{
typedef CSampleDockingWindow thisClass;
typedef dockwins::CTitleDockingWindowImpl<CSAMPLEDOCKINGWINDOW,
CWINDOW,
dockwins::COutlookLikeTitleDockingWindowTraits> baseClass;
public:
DECLARE_WND_CLASS(_T("CSampleDockingWindow"))
BEGIN_MSG_MAP(thisClass)
CHAIN_MSG_MAP(baseClass)
END_MSG_MAP()
};
- Instantiate an object of the
CSampleDockingWindow
class as a member of the CMainFrame
- In the
CMainFrame::OnCreate(...)
method, call the Create(...)
method of the instantiated docking window class.
LRESULT OnCreate(UINT , WPARAM , LPARAM ,
BOOL& )
{
...
InitializeDockingFrame();
...
CRect rcBar(0,0,100,100);
m_sampleDockWnd.Create(m_hWnd,rcBar,_T("Sample docking window"));
...
}
Do not use empty rect even if you dock the window. When window start dragging it use previously stored floating rect size.
Add to Generic Window Support for Docking Window Features
To implement a window with docking window features, derive a class from dockwins::CDockingSiteImpl
. In derived class chain default message map to the base class.
class CDockSiteSampleWnd : public dockwins::CDockingSiteImpl <
CDockSiteSampleWnd >
{
typedef dockwins::CDockingSiteImpl < CDockSiteSampleWnd > baseClass;
public:
DECLARE_WND_CLASS(_T("CDockSiteSampleWnd"))
BEGIN_MSG_MAP(CDockSiteSampleWnd)
CHAIN_MSG_MAP(baseClass)
END_MSG_MAP()
};
Add Support for Tabbed Docking Window
- The tabbed docking window depend on Daniel Bowen's The Codeproject article "Custom Tab Controls,Tabbed Frame and Tabbed MDI", Please download the source code for this article.
- Change the base class of your docking window from
dockwins::CTitleDockingWindowImpl
to dockwins::CBoxedDockingWindowImpl
.
- Use the following classes as traits for the
dockwins::CBoxedDockingWindowImpl
: COutlookLikeBoxedDockingWindowTraits
, COutlookLikeExBoxedDockingWindowTraits
or CVC6LikeBoxedDockingWindowTraits
.
- To add tabbed docking features support to the previous
CSampleDockingWindow
class, the code should look like this:
class CSampleTabDockingWindow :
public dockwins::CBoxedDockingWindowImpl< SampleDockingWindow,
CWindow, dockwins::COutlookLikeBoxedDockingWindowTraits >
{
typedef CSampleTabDockingWindow thisClass;
typedef dockwins::CBoxedDockingWindowImpl<CSAMPLEDOCKINGWINDOW,
CWINDOW,
dockwins::COutlookLikeBoxedDockingWindowTraits> baseClass;
public:
DECLARE_WND_CLASS(_T("CSampleTabDockingWindow"))
BEGIN_MSG_MAP(thisClass)
CHAIN_MSG_MAP(baseClass)
END_MSG_MAP()
};
Add Support for Auto-Hiding Features
To add auto-hiding features to your project just include a DWAutoHide.h
header before any other docking windows headers.
Dock a Docking Window
Call the DockWindow
methods from your frame window class.
template<class T>
bool DockWindow(T& dockWnd,CDockingSide side,
unsigned long nBar,float fPctPos,
unsigned long nWidth, unsigned long nHeight);
- dockWnd
- Docking window.
- side
- Sides of the frame window to dock to
CDockingSide::sSingle
force docking window to occupy the fulll width of the docking bar, combine this style with one of the following:
CDockingSide::sRight
Dock to the right side of the frame window.
CDockingSide::sLeft
Dock to the left side of the frame window.
CDockingSide::sTop
Dock to the top side of the frame window.
CDockingSide::sBottom
Dock to the bottom side of the frame window. - nBar
- Index of dockbar to dock to, it's zero-based.
- fPctPos
- The percent of the dock bar's width that the docking window should use as top point.
- nWidth
- The requested width (in pixels) of the docking window. If the docking window is vertical, this parameter actually represents the control bar height.
- nHeight
- The requested height (in pixels) of the docking window. If the docking window is vertical, this parameter actually represents the control bar width.
Dock One Tabbed Docking Window to Another
Call the DockTo
method of the tabbed docking window.
bool DockTo(HWND hWnd,int index=0);
- hWnd
- Tabbed docking window to dock to.
- index
- Zero-based index.
Float a Docking Window that is Docked
Call the Float
methods from your docking window class.
bool Float()
- restore previous floating positionbool Float(LPCRECT pRc,
UINT flags=SWP_SHOWWINDOW | SWP_NOACTIVATE,
HWND hWndInsertAfter=HWND_TOP)
- float docking window and move to a specified location.
Pin-up Docking Window
Call the one of the PinUp
methods of the tabbed docking window.
bool PinUp(const CDockingSide& side);
bool PinUp(const CDockingSide& side, unsigned long width,
bool bVisualize=false);
- side
- Sides of the frame window to pin-up to:
CDockingSide::sRight
Pin-up to the right side of the frame window.
CDockingSide::sLeft
Pin-up to the left side of the frame window.
CDockingSide::sTop
Pin-up to the top side of the frame window.
CDockingSide::sBottom
Pin-up to the bottom side of the frame window. - width
- The requested width (in pixels) of the docking window.
- bVisualize
- Specifies the show state of the docking window after pinning.
Unpin Pinned Docking Window
Call Hide
then Show
methods of the pinned window to emulate the pin button press,
or call Float
method to float a pinned docking window,
or call Hide
method then call any functions that set docking window position.
Receive Notifications when the Docked State of a Docking Window Changes
Override the following member functions of your docking window class
void OnDocked(HDOCKBAR hBar,bool bHorizontal)
void OnUndocked(HDOCKBAR hBar)
- hBar
- Handle to the dockbar to docking to.
- bHorizontal
- Docking window orientation.
Hide/Show a Docking Window
To hide/show a docking window simply call Hide()
/ Show()
or Togle()
methods of the CTitleDockingWindowImpl
class.
Specify Minimum Docking Window Size
You can specify minimum docking window size by overriding GetMinMaxInfo
method of your docking window, like this:
void GetMinMaxInfo(LPMINMAXINFO pMinMaxInfo) const
{
pMinMaxInfo->ptMinTrackSize.y=100;
pMinMaxInfo->ptMinTrackSize.x=100;
}
Preserve Docking Window Position
You can use following member functions of the CDockingWindowBaseImpl
class:
bool GetDockingWindowPlacement(DFDOCKPOSEX* pHdr) const
bool SetDockingWindowPlacement(DFDOCKPOSEX* pHdr)
Replace Splitter Bar
If you do not like splitter bar you can make your own. If you just want to change it's appearance probably the best way to derive it from CSimpleSplitterBar
. And override Draw()
,DrawGhostBar()
etc. Then define your traits
typedef CDockingFrameTraitsT <CMySplitterBar,
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
WS_EX_APPWINDOW | WS_EX_WINDOWEDGE> CMyDockingFrameTraits;
and apply it to base class of
CMainFrame
.
Make Custom Caption
Create a new caption class. You can derive it from CCaptionBase
or from other available Caption classes. Then define DockingWindowTraits
typedef CDockingWindowTraits<CMyCaption,
WS_OVERLAPPEDWINDOW | WS_POPUP | WS_VISIBLE |
WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
WS_EX_TOOLWINDOW> CMyTitleDockingWindowTraits;
and apply it to CTitleDockingWindowImpl
.
Docking Window Classes
Docking Windows Frame Classes
CDockingFrameImplBase
[DockingFrame.h]
� this class provides basic docking window features. CDockingFrameImpl [DockingFrame.h]
� base class for a single document interface (SDI) frame window. CMDIDockingFrameImpl [DockingFrame.h]
� base class for a multiple document interface (MDI) frame window. CDockingSiteImpl [DockingFrame.h]
� base class for a generic window with docking window features. CDockingFrameTraitsT [DockMisc.h]
� traits of docking frame it's derived from CWinTraits
class and add TSplitterBar
parameter.
Docking Windows Classes
CDockingWindowBaseImpl [DockingWindow.h]
� base class for docking windows. The CDockingWindowBaseImpl
class derives from CWindowImpl
and has the same parameters except TWinTraits
. Instead, it is uses CDockingWindowTraits
. CTitleDockingWindowImpl [DockingWindow.h]
� titled docking window. CBoxedDockingWindowImpl [DockingBox.h]
� titled docking window which support tabbed docking. CDockingWindowTraits [DockingWindow.h]
� traits of docking window it's derived from CWinTraits
class and add TCaption
parameter. If you need to customize the docking window caption, make new caption class and use CDockingWindowTraits
with new class as TCaption
parameter.
Docking Windows Captions Classes
CCaptionBase[DockingWindow.h]
� base class for other caption class COutlookLikeExCaption
and COutlookLikeCaption [ExtDockingWindow.h]
� Microsoft Outlook� likes caption. COutlookLikeCaption
� always horizontal caption. COutlookLikeExCaption
� orientation of the caption depends on docking position. CVC6LikeCaption [ExtDockingWindow.h]
� Microsoft Visual C++ 6� IDE like caption.
Docking Windows Traits Classes
COutlookLikeTitleDockingWindowTraits [ExtDockingWindow.h]
traits for COutlookLikeCaption
, use this class with CTitleDockingWindowImpl
COutlookLikeExTitleDockingWindowTraits [ExtDockingWindow.h]
traits for COutlookLikeExCaption
, use this class with CTitleDockingWindowImpl
CVC6LikeTitleDockingWindowTraits [ExtDockingWindow.h]
traits forCVC6LikeCaption
, use this class with CTitleDockingWindowImpl
COutlookLikeBoxedDockingWindowTraits [TabDockingBox.h]
traits for COutlookLikeCaption
, use this class with CBoxedDockingWindowImpl
COutlookLikeExBoxedDockingWindowTraits [TabDockingBox.h]
traits for COutlookLikeExCaption
, use this class with CBoxedDockingWindowImpl
CVC6LikeBoxedDockingWindowTraits[TabDockingBox.h]
traits for CVC6LikeCaption
, use this class with CBoxedDockingWindowImpl
Docking Windows Splitter Bar Classes
CSimpleSplitterBar[SimpleSplitterBar.h]
- Very simple splitter bar. CSimpleSplitterBarEx[SimpleSplitterBar.h]
- another simple splitter bar.