void CDockContext::EndDrag() /**************************/ { DrawFocusRect( TRUE ); if( m_dwOverDockStyle != 0L && !m_bForceFrame ) { CDockBar *pDockBar = GetDockBar( m_dwOverDockStyle ); ASSERT( pDockBar != NULL ); if( ((m_dwOverDockStyle & CBRS_ORIENT_HORZ) && !m_bFlip) || ((m_dwOverDockStyle & CBRS_ORIENT_VERT) && m_bFlip) ) { pDockBar->DockControlBar( m_pBar, &m_rectDragHorz ); } else { pDockBar->DockControlBar( m_pBar, &m_rectDragVert ); } m_dwOverDockStyle = 0L; m_uMRUDockID = pDockBar->GetDlgCtrlID(); m_pBar->GetWindowRect( &m_rectMRUDockPos ); } else { ASSERT( m_pDockSite != NULL ); if( ((m_dwStyle & CBRS_ORIENT_HORZ) && !m_bFlip) || ((m_dwStyle & CBRS_ORIENT_VERT) && m_bFlip) ) { m_pDockSite->FloatControlBar( m_pBar, m_rectFrameDragHorz.TopLeft(), CBRS_ALIGN_TOP | (m_dwDockStyle & CBRS_FLOAT_MULTI) ); m_ptMRUFloatPos = m_rectFrameDragHorz.TopLeft(); } else { m_pDockSite->FloatControlBar( m_pBar, m_rectFrameDragVert.TopLeft(), CBRS_ALIGN_LEFT | (m_dwDockStyle & CBRS_FLOAT_MULTI) ); m_ptMRUFloatPos = m_rectFrameDragVert.TopLeft(); } } delete m_pDC; m_pDC = NULL; m_bDragging = FALSE; }
void CGuiDockContext::EndDrag() { CancelLoop(); if (m_dwOverDockStyle != 0) { CDockBar* pDockBar = GetDockBar(m_dwOverDockStyle); ASSERT(pDockBar != NULL); CRect rect = (m_dwOverDockStyle & CBRS_ORIENT_VERT) ? m_rectDragVert : m_rectDragHorz; UINT uID = _AfxGetDlgCtrlID(pDockBar->m_hWnd); if (uID >= AFX_IDW_DOCKBAR_TOP && uID <= AFX_IDW_DOCKBAR_BOTTOM) { m_uMRUDockID = uID; m_rectMRUDockPos = rect; pDockBar->ScreenToClient(&m_rectMRUDockPos); } // dock it at the specified position, RecalcLayout will snap m_pDockSite->DockControlBar(m_pBar, pDockBar, &rect); m_pDockSite->RecalcLayout(); } else if ((m_dwStyle & CBRS_SIZE_DYNAMIC) || (HORZF(m_dwStyle) && !m_bFlip) || (VERTF(m_dwStyle) && m_bFlip)) { m_dwMRUFloatStyle = CBRS_ALIGN_TOP | (m_dwDockStyle & CBRS_FLOAT_MULTI); m_ptMRUFloatPos = m_rectFrameDragHorz.TopLeft(); m_pDockSite->FloatControlBar(m_pBar, m_ptMRUFloatPos, m_dwMRUFloatStyle); } else // vertical float { m_dwMRUFloatStyle = CBRS_ALIGN_LEFT | (m_dwDockStyle & CBRS_FLOAT_MULTI); m_ptMRUFloatPos = m_rectFrameDragVert.TopLeft(); m_pDockSite->FloatControlBar(m_pBar, m_ptMRUFloatPos, m_dwMRUFloatStyle); } }
//创建或获取DockBar RingDockBar* RingDockSite::CreateDockBar(RingBaseWnd* wnd,BOOL bCanSize) { if(wnd == NULL) return NULL; RingDockBar* dockbar = NULL; //判断是否已有dockbar与wnd绑定,是为防止多次调用AddBar if(wnd->GetParent() == m_hWnd) dockbar = GetDockBar(wnd); else { //DockBar内的窗口其父窗口句柄为DockSite,但m_parent为原父窗口对象 RingBaseWnd* parent = GetWindowPtr(wnd->GetParent()); if(parent) { if(parent->GetWindowType() == ITIS_DOCKSITE) //已加入,但非停靠在本区域 dockbar = ((RingDockSite*)parent)->GetDockBar(wnd); else if(parent->GetWindowType() == ITIS_FLYBAR) dockbar = ((RingFlyBar*)parent)->GetDockBar(); } } if(dockbar == NULL) { //创建dockbar if(bCanSize) dockbar = new RingSizeBar; else { if(wnd->GetWindowType() == ITIS_MENUBAR) dockbar = new RingAllLineBar; else dockbar = new RingDockBar; } } return dockbar; }
void CCJDockContext::EndDragDockBar() { CancelLoop(); if (m_dwOverDockStyle != 0) { CCJSizeDockBar* pDockBar = GetDockBar(m_dwOverDockStyle); ASSERT(pDockBar != NULL); CRect rect = (m_dwOverDockStyle & CBRS_ORIENT_VERT) ? m_rectDragVert : m_rectDragHorz; UINT uID = _AfxGetDlgCtrlID(pDockBar->m_hWnd); m_uMRUDockID = uID; m_rectMRUDockPos = rect; pDockBar->ScreenToClient(&m_rectMRUDockPos); DockSizeBar(m_pBar, pDockBar, &rect); m_pDockSite->RecalcLayout(); } else if ((m_dwStyle & CBRS_SIZE_DYNAMIC) || (HORZF(m_dwStyle) && !m_bFlip) || (VERTF(m_dwStyle) && m_bFlip)) { m_dwMRUFloatStyle = CBRS_ALIGN_TOP | (m_dwDockStyle & CBRS_FLOAT_MULTI); m_ptMRUFloatPos = m_rectFrameDragHorz.TopLeft(); m_pDockSite->FloatControlBar(m_pBar, m_ptMRUFloatPos, m_dwMRUFloatStyle); m_pDockSite->RecalcLayout(); } else { m_dwMRUFloatStyle = CBRS_ALIGN_LEFT | (m_dwDockStyle & CBRS_FLOAT_MULTI); m_ptMRUFloatPos = m_rectFrameDragVert.TopLeft(); m_pDockSite->FloatControlBar(m_pBar, m_ptMRUFloatPos, m_dwMRUFloatStyle); m_pDockSite->RecalcLayout(); } }
BOOL RingDockSite::ReleaseDockBar(RingBaseWnd* wnd) { RingDockBar* bar = GetDockBar(wnd); if(bar == NULL) { RingDockBar *prevbar = NULL; bar = m_flybar; while(bar) { if(bar->m_child && bar->m_child == wnd) { if(prevbar == NULL) m_flybar = bar->m_next; else prevbar->m_next = bar->m_next; break; } prevbar = bar; bar = bar->m_next; } } if(bar) { DelBar(bar); HWND hFlyWnd = wnd->GetParent(); wnd->SetParent(wnd->Parent()->Handle()); RemoveSysMenu(bar); if(bar->GetState() == TBS_FLAG_FLY) DestroyWindow(hFlyWnd); //flybar析构会销毁bar else delete bar; return TRUE; } return FALSE; }
void COXDragDockContext::EndDrag() { CancelDrag(); if (m_ptStart == m_ptLast) return; m_dwOverDockStyle = m_bForceFrame ? 0 : CanDock(); if (m_dwOverDockStyle != 0) { // dockbar we're going to dock at. CDockBar* pDockBar = GetDockBar(); ASSERT(pDockBar != NULL); // check the original dockbar - if a valid CSizeDockBar... // work out the row number. CDockBar* pOrigDockBar = m_pBar->m_pDockBar; int nOrigCheckSum = -1; if (pOrigDockBar != NULL && pOrigDockBar->IsKindOf(RUNTIME_CLASS(COXSizeDockBar))) nOrigCheckSum = ((COXSizeDockBar*)pOrigDockBar)->CheckSumBars(); // Now we're going to actually dock the window. // Update the appropriate size in the control bar. if (HORZF(m_dwOverDockStyle)) { ((COXSizeControlBar*)m_pBar)->m_HorzDockSize = m_rectDragDock.Size(); } else { ((COXSizeControlBar*)m_pBar)->m_VertDockSize = m_rectDragDock.Size(); } m_pDockSite->DockControlBar(m_pBar, pDockBar, m_rectDragDock); // if into a sizeable dockbar (always we be !), then adjust other bars in the same row // to attempt to maintain size if (pDockBar->IsKindOf(RUNTIME_CLASS(COXSizeDockBar))) { if (pOrigDockBar != pDockBar || ((COXSizeDockBar*)pDockBar)->CheckSumBars() != nOrigCheckSum) { ((COXSizeDockBar*)pDockBar)->AdjustForNewBar(m_pBar); } // force RecalcLayout below to adjust sizes always for the bar into // which we have docked - this is needed as if the bar doesn't // actually changed position in the array, but has changed size // (because the docking algorithm above guess the size wrong, then // we need to set it back again. ((COXSizeDockBar*)pDockBar)->m_CountBars = 0; } // This RecalcLayout is what will adjust the size. m_pDockSite->RecalcLayout(); } else { m_ptMRUFloatPos = m_rectFrameDragHorz.TopLeft(); m_pDockSite->FloatControlBar(m_pBar, m_rectFrameDragHorz.TopLeft(), CBRS_ALIGN_TOP | (m_dwDockStyle & CBRS_FLOAT_MULTI)); m_pBar->SendMessage(WM_OX_APP_AFTERFLOAT_MSG); // set flag to indicate user has moved the bar - done as a style flag on the window. CWnd* pFrameWnd = m_pBar->GetParentFrame(); ASSERT(pFrameWnd->IsKindOf(RUNTIME_CLASS(CMiniDockFrameWnd))); pFrameWnd->ModifyStyle(0, CBRS_MOVED_BY_USER); } }