void CControlBar::EnableDocking(DWORD dwDockStyle)
{
ASSERT((dwDockStyle & ~(CBRS_ALIGN_ANY|CBRS_FLOAT_MULTI)) == 0);
ASSERT(((dwDockStyle & CBRS_FLOAT_MULTI) == 0) || ((m_dwStyle & CBRS_SIZE_DYNAMIC) == 0));
m_dwDockStyle = dwDockStyle;
if (m_pDockContext == NULL)
m_pDockContext = new CDockContext(this);
if (m_hWndOwner == NULL)
m_hWndOwner = ::GetParent(m_hWnd);
}
在创建CControlBar类的窗口之后,需要调用两次EnableDocking函数。一次调用相应的浮动窗口的EnableDocking函数设置浮动窗口的一些属性,然后调用父窗口的EnableDocking函数设置父窗口浮动的属性。首先验证窗口创建的属性,因为浮动窗口只可能存在两种情况,第一种依赖在父窗口的边缘,这个属性设置为CBRS_ALIGN_ANY表明依靠到父窗口的某一个边缘,这个边缘由创建时的CBRS_XXX(表示左右上下的四个方位);如果设置为CBRS_FLOAT_MULTI则在创建的时候不能设置CBRS_SIZE_DYNAMIC属性。如果没有设置CBRS_SIZE_DYNAMIC则不论是依靠还是浮动窗口的大小不会改变,不过在用鼠标将工具条浮动之后就不能依靠到父窗口了。验证参数之后,就会根据需要获取父窗口句柄以及浮动的上下文类。其中CDockContext包含浮动窗口的显示信息包括窗口的高和宽以及浮动属性父窗口等等。
void CFrameWnd::EnableDocking(DWORD dwDockStyle)
{
ASSERT((dwDockStyle & ~(CBRS_ALIGN_ANY|CBRS_FLOAT_MULTI)) == 0);
m_pFloatingFrameClass = RUNTIME_CLASS(CMiniDockFrameWnd);
for (int i = 0; i < 4; i++)
{
if (dwDockBarMap[i][1] & dwDockStyle & CBRS_ALIGN_ANY)
{
CDockBar* pDock = (CDockBar*)GetControlBar(dwDockBarMap[i][0]);
if (pDock == NULL)
{
pDock = new CDockBar;
if (!pDock->Create(this,
WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_CHILD|WS_VISIBLE |
dwDockBarMap[i