//-------------------------------------------------------------------------------------------- void CMRCMDIFrameWndSizeDock::UnFloatInMDIChild(CControlBar* pBar, CPoint point, DWORD dwStyle) // removes the control bar from an MDI floating window, and then floats the bar //-------------------------------------------------------------------------------------------- { ASSERT(pBar != NULL); ASSERT(pBar->IsFloating()); CMRCMDIFloatWnd * pFloatFrame = (CMRCMDIFloatWnd *)pBar->GetParentFrame(); ASSERT(pFloatFrame->IsKindOf(RUNTIME_CLASS(CMRCMDIFloatWnd))); // point at which to float is ignored at present - use the co-ordinates of the current frame CRect rcMDIFloat; pFloatFrame->GetWindowRect(&rcMDIFloat); point = rcMDIFloat.TopLeft(); // This is basically the code from MFC's CFrameWnd::FloatControlBar(), with the // test to avoid destroying/creating the floating frame window removed. // Tried explicitly removing the control bar, but this doesn't work as it destroys the // CMDIFloatWnd, which in turn kills the child control bar. So need to create the floating // frame first, and then dock into this. ASSERT(m_pFloatingFrameClass != NULL); CMiniDockFrameWnd* pDockFrame = CreateFloatingFrame(dwStyle); ASSERT(pDockFrame != NULL); pDockFrame->SetWindowPos(NULL, point.x, point.y, 0, 0, SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE); if (pDockFrame->m_hWndOwner == NULL) pDockFrame->m_hWndOwner = pBar->m_hWnd; CDockBar* pDockBar = (CDockBar*)pDockFrame->GetDlgItem(AFX_IDW_DOCKBAR_FLOAT); ASSERT(pDockBar != NULL); ASSERT(pDockBar->IsKindOf(RUNTIME_CLASS(CDockBar))); ASSERT(pBar->m_pDockSite == this); // if this assertion occurred it is because the parent of pBar was not // initially this CFrameWnd when pBar's OnCreate was called // (this control bar should have been created with a different // parent initially) pDockBar->DockControlBar(pBar); pDockFrame->RecalcLayout(); pDockFrame->ShowWindow(SW_SHOWNA); pDockFrame->UpdateWindow(); }
void CFrameWnd::FloatControlBar( CControlBar *pBar, CPoint pt, DWORD dwStyle ) /****************************************************************************/ { ASSERT( pBar != NULL ); if( pBar->IsFloating() && !(pBar->m_pDockBar->GetBarStyle() & CBRS_FLOAT_MULTI) ) { CFrameWnd *pFrame = pBar->GetParentFrame(); pFrame->SetWindowPos( NULL, pt.x, pt.y, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER ); } else { CMiniDockFrameWnd *pFrame = CreateFloatingFrame( dwStyle ); ASSERT( pFrame != NULL ); CDockBar *pDockBar = (CDockBar *)pFrame->GetDlgItem( AFX_IDW_DOCKBAR_FLOAT ); ASSERT( pDockBar != NULL ); ASSERT( pDockBar->IsKindOf( RUNTIME_CLASS( CDockBar ) ) ); pDockBar->DockControlBar( pBar ); if( pt.x != CW_USEDEFAULT && pt.y != CW_USEDEFAULT ) { pFrame->SetWindowPos( NULL, pt.x, pt.y, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER ); } pFrame->ShowWindow( SW_SHOW ); pFrame->UpdateWindow(); RecalcLayout(); } }
void CFrameWnd::FloatControlBar(CControlBar* pBar, CPoint point, DWORD dwStyle) { ASSERT(pBar != NULL); // if the bar is already floating and the dock bar only contains this // bar and same orientation then move the window rather than recreating // the frame if (pBar->m_pDockSite != NULL && pBar->m_pDockBar != NULL) { CDockBar* pDockBar = pBar->m_pDockBar; ASSERT_KINDOF(CDockBar, pDockBar); if (pDockBar->m_bFloating && pDockBar->GetDockedCount() == 1 && (dwStyle & pDockBar->m_dwStyle & CBRS_ALIGN_ANY) != 0) { CMiniDockFrameWnd* pDockFrame = (CMiniDockFrameWnd*)pDockBar->GetParent(); ASSERT(pDockFrame != NULL); ASSERT_KINDOF(CMiniDockFrameWnd, pDockFrame); pDockFrame->SetWindowPos(NULL, point.x, point.y, 0, 0, SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE); pDockFrame->RecalcLayout(TRUE); pDockFrame->UpdateWindow(); return; } } if (pBar->m_dwStyle & CBRS_SIZE_DYNAMIC) { dwStyle |= CBRS_SIZE_DYNAMIC; if (dwStyle & CBRS_ORIENT_VERT) { dwStyle &= ~CBRS_ALIGN_ANY; dwStyle |= CBRS_ALIGN_TOP; } } CMiniDockFrameWnd* pDockFrame = CreateFloatingFrame(dwStyle); ASSERT(pDockFrame != NULL); pDockFrame->SetWindowPos(NULL, point.x, point.y, 0, 0, SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE); if (pDockFrame->m_hWndOwner == NULL) pDockFrame->m_hWndOwner = pBar->m_hWnd; CDockBar* pDockBar = (CDockBar*)pDockFrame->GetDlgItem(AFX_IDW_DOCKBAR_FLOAT); ASSERT(pDockBar != NULL); ASSERT_KINDOF(CDockBar, pDockBar); ASSERT(pBar->m_pDockSite == this); // if this assertion occurred it is because the parent of pBar was not // initially this CFrameWnd when pBar's OnCreate was called // (this control bar should have been created with a different // parent initially) pDockBar->DockControlBar(pBar); pDockFrame->RecalcLayout(TRUE); if (GetWindowLong(pBar->m_hWnd, GWL_STYLE) & WS_VISIBLE) { pDockFrame->ShowWindow(SW_SHOWNA); pDockFrame->UpdateWindow(); } }