⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bcgpdockmanager.cpp

📁 关于远程网络监视程序的源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		return;
	}

	if (m_bRecalcLayout || m_bSizeFrame)
	{
		return;
	}

	if (!m_bEnableAdjustLayout)
	{
		return;
	}

	m_bRecalcLayout = TRUE;

	if (!m_bIsOLEContainerMode)
	{
		for (POSITION pos = m_lstControlBars.GetHeadPosition (); pos != NULL;)
		{
			CBCGPBaseControlBar* pNextControlBar = 
				(CBCGPBaseControlBar*) m_lstControlBars.GetNext (pos);
			ASSERT_VALID (pNextControlBar);
			pNextControlBar->AdjustLayout ();
		}

		for (pos = m_lstMiniFrames.GetHeadPosition (); pos != NULL;)
		{
			CBCGPMiniFrameWnd* pNextMiniFrame = 
				(CBCGPMiniFrameWnd*) m_lstMiniFrames.GetNext (pos);
			ASSERT_VALID (pNextMiniFrame);
			pNextMiniFrame->AdjustLayout ();
		}
	}
	else
	{
		for (POSITION pos = m_lstControlBars.GetHeadPosition (); pos != NULL;)
		{
			CBCGPBaseControlBar* pNextControlBar = 
				(CBCGPBaseControlBar*) m_lstControlBars.GetNext (pos);
			ASSERT_VALID (pNextControlBar);
			if (pNextControlBar->IsBarVisible ())
			{
				pNextControlBar->AdjustLayout ();
			}
		}
	}

	AdjustDockingLayout ();
	m_bRecalcLayout = FALSE;
}
//------------------------------------------------------------------------//
void CBCGPDockManager::AdjustDockingLayout (HDWP hdwp)
{
	ASSERT_VALID (this);

	if (m_bDisableRecalcLayout)
	{
		return;
	}

	if (m_bAdjustingBarLayout)
	{
		return;
	}

	if (m_pParentWnd == NULL)
	{
		return;
	}

	m_pParentWnd->GetClientRect (m_rectClientAreaBounds);

	if (!m_bEnableAdjustLayout)
	{
		return;
	}

	if (m_lstControlBars.IsEmpty ())
	{
		return;
	}

	m_bAdjustingBarLayout = TRUE;

	CRect rectSaveOuterEdgeBounds = m_rectOuterEdgeBounds;

	BOOL bDeferWindowPosHere = FALSE;
	if (hdwp == NULL && !m_bIsPrintPreviewMode)
	{
		hdwp = BeginDeferWindowPos (m_lstControlBars.GetCount ());
		bDeferWindowPosHere = TRUE;
	}

	CRect rectCurrBounds = m_rectDockBarBounds;

	// temporary - may want to enable feature of independent bounds
	m_pParentWnd->GetClientRect (rectCurrBounds);
	m_pParentWnd->ClientToScreen (rectCurrBounds);


	if(m_bIsOLEInPlaceActivate)
	{
		//take into account container's statusbar Height
		rectCurrBounds.bottom -= 20;
	}


	CRect rectControlBar;
	
	// find position of the last dock bar in the list (actually, it will be position
	// of the next control bar right after the last dock bar in the list)

	for (POSITION posLastDockBar = m_lstControlBars.GetTailPosition (); 
		 posLastDockBar != NULL;)
	{
		CBCGPBaseControlBar* pDockBar = 
			(CBCGPBaseControlBar*) m_lstControlBars.GetPrev (posLastDockBar);
		if (posLastDockBar == NULL)
		{
			break;
		}

		if (pDockBar->IsKindOf (RUNTIME_CLASS (CBCGPDockBar)) ||
			pDockBar->IsKindOf (RUNTIME_CLASS (CBCGPAutoHideDockBar)))
		{
			m_lstControlBars.GetNext (posLastDockBar);
			if (posLastDockBar != NULL)
			{
				m_lstControlBars.GetNext (posLastDockBar);
			}
			break;
		}
	}

	POSITION posBar = NULL;
	for (POSITION pos = m_lstControlBars.GetHeadPosition (); pos != NULL;)
	{
		posBar = pos;

		CBCGPBaseControlBar* pNextControlBar = 
			(CBCGPBaseControlBar*) m_lstControlBars.GetNext (pos);
		ASSERT_VALID (pNextControlBar);


		if (!pNextControlBar->IsBarVisible() && 
			(pNextControlBar->IsKindOf (RUNTIME_CLASS (CBCGPControlBar)) ||
			pNextControlBar->IsKindOf (RUNTIME_CLASS (CBCGPSlider)) ||
			pNextControlBar->IsKindOf (RUNTIME_CLASS (CBCGPDockBar)) && 
			(m_bIsPrintPreviewMode || m_bIsOLEContainerMode)))
		{
			continue;
		}
		
		// let's see whether this control bar has enough space to be displayed,
		// has to be aligned differntly and so on. 

		pNextControlBar->GetWindowRect (rectControlBar);
		CRect rectSave = rectControlBar;
		
		DWORD dwAlignment = pNextControlBar->GetCurrentAlignment ();
		BOOL  bHorizontal = pNextControlBar->IsHorizontal ();
		BOOL  bResizable  = pNextControlBar->IsResizable ();

		if (pNextControlBar->IsKindOf (RUNTIME_CLASS (CBCGPDockingControlBar)))
		{
			CBCGPDockingControlBar* pDockingControlBar = 
				DYNAMIC_DOWNCAST (CBCGPDockingControlBar, pNextControlBar);
			if (pDockingControlBar->GetDefaultSlider () != NULL)
			{
				// resizable control bars with sliders will be aligned by slider itself!!!
				continue;
			}
		}

		CSize sizeRequered = pNextControlBar->CalcFixedLayout (FALSE, bHorizontal);

		if (bHorizontal)
		{
			dwAlignment & CBRS_ALIGN_TOP ? rectControlBar.bottom = rectControlBar.top + sizeRequered.cy : 
										   rectControlBar.top = rectControlBar.bottom - sizeRequered.cy;
		}
		else
		{
			dwAlignment & CBRS_ALIGN_LEFT ? rectControlBar.right = rectControlBar.left + sizeRequered.cx : 
											rectControlBar.left = rectControlBar.right - sizeRequered.cx;
		}

		
		AlignByRect (rectCurrBounds, rectControlBar, dwAlignment, bHorizontal, bResizable);	
		
	
		CRect rectControlBarScreen = rectControlBar;

		ASSERT_VALID (pNextControlBar->GetParent ());
		if (pNextControlBar->IsKindOf (RUNTIME_CLASS (CBCGPDockBar)))
		{
			pNextControlBar->ScreenToClient (rectControlBar);
			if (pNextControlBar->IsHorizontal () && rectControlBar.Width () > 0 ||
				!pNextControlBar->IsHorizontal () && rectControlBar.Height () > 0)
			{
				((CBCGPDockBar*) pNextControlBar)->RepositionBars (rectControlBar);
			}

			rectControlBar = rectControlBarScreen;
		}

		if (pNextControlBar->IsKindOf (RUNTIME_CLASS (CBCGPSlider)))
		{
			// the slider will change its position, as well as position of
			// its resizable control bars (container)
			((CBCGPSlider*) pNextControlBar)->RepositionBars (rectControlBar, hdwp);			
		}
		else
		{
			pNextControlBar->GetParent ()->ScreenToClient (rectControlBar);
			hdwp = pNextControlBar->SetWindowPos (NULL, rectControlBar.left, 
						rectControlBar.top, rectControlBar.Width (), rectControlBar.Height (), 
						SWP_NOZORDER | SWP_NOACTIVATE, hdwp);
		}

		if (dwAlignment & CBRS_ALIGN_TOP)
		{
			rectCurrBounds.top += rectControlBarScreen.Height ();
		}
		else if (dwAlignment & CBRS_ALIGN_BOTTOM)
		{
			rectCurrBounds.bottom -= rectControlBarScreen.Height ();
		}
		else if (dwAlignment & CBRS_ALIGN_LEFT)
		{
			rectCurrBounds.left += rectControlBarScreen.Width ();
		}
		else 
		{
			rectCurrBounds.right -= rectControlBarScreen.Width ();
		}

		if (posLastDockBar == pos)
		{
			m_rectOuterEdgeBounds = rectCurrBounds;
		}

	}

	m_rectClientAreaBounds = rectCurrBounds;

	if (m_rectOuterEdgeBounds.IsRectEmpty () || m_bIsOLEContainerMode)
	{
		m_rectOuterEdgeBounds = rectCurrBounds;
	}

	

	m_pParentWnd->ScreenToClient (m_rectClientAreaBounds);
	m_pParentWnd->ScreenToClient (m_rectOuterEdgeBounds);

	if (m_rectOuterEdgeBounds != rectSaveOuterEdgeBounds)
	{
		HideAutoHideBars (NULL, TRUE);
	}

	// special processing for autohide dock bars
	for (pos = m_lstControlBars.GetHeadPosition (); pos != NULL;)
	{
		CBCGPBaseControlBar* pBar = (CBCGPBaseControlBar*) m_lstControlBars.GetNext (pos);
		ASSERT_VALID (pBar);
		if (pBar->IsKindOf (RUNTIME_CLASS (CBCGPAutoHideDockBar)))
		{
			CBCGPAutoHideDockBar* pSlidingBar = (CBCGPAutoHideDockBar*) pBar;
			pSlidingBar->SetOffsetLeft (0);
			pSlidingBar->SetOffsetRight (0);
			CalcBarOffset ((CBCGPAutoHideDockBar*) pBar);
		}
	}

	if (bDeferWindowPosHere)
	{
		EndDeferWindowPos (hdwp);
	}

	m_bAdjustingBarLayout = FALSE;
}
//----------------------------------------------------------------------------------//
void CBCGPDockManager::CalcBarOffset (CBCGPAutoHideDockBar* pBar)
{
	ASSERT_VALID (pBar);
	DWORD dwBarAlignOrg = pBar->GetCurrentAlignment ();
	CRect rectBarOrg;
	pBar->GetWindowRect (rectBarOrg);	
	for (POSITION pos = m_lstControlBars.GetHeadPosition (); pos != NULL;)
	{
		CBCGPBaseControlBar* pBarNext = (CBCGPBaseControlBar*) m_lstControlBars.GetNext (pos);
		ASSERT_VALID (pBarNext);
		if (pBarNext->IsKindOf (RUNTIME_CLASS (CBCGPAutoHideDockBar)))
		{
			CBCGPAutoHideDockBar* pNextSlidingDockBar = 
				DYNAMIC_DOWNCAST (CBCGPAutoHideDockBar, pBarNext);

			if (pNextSlidingDockBar == pBar ||
				pNextSlidingDockBar->IsHorizontal () && pBar->IsHorizontal () ||
				!pNextSlidingDockBar->IsHorizontal () && !pBar->IsHorizontal ())
			{
				continue;
			}

			CRect rectBarNext;
			pNextSlidingDockBar->GetWindowRect (rectBarNext);
			if (rectBarNext.IsRectEmpty ())
			{
				continue;
			}

			DWORD dwBarAlignNext = pNextSlidingDockBar->GetCurrentAlignment ();
			
			if (dwBarAlignOrg & CBRS_ALIGN_LEFT && 
				dwBarAlignNext & CBRS_ALIGN_TOP)
			{
				if (rectBarOrg.top == rectBarNext.bottom)
				{
					pNextSlidingDockBar->SetOffsetLeft (rectBarOrg.Width ());
				}

				if (rectBarOrg.right == rectBarNext.left)
				{
					pBar->SetOffsetLeft (rectBarNext.Height ());
				}
			}
			else if (dwBarAlignOrg & CBRS_ALIGN_TOP && 
					 dwBarAlignNext & CBRS_ALIGN_RIGHT)
			{
				if (rectBarOrg.right == rectBarNext.left)
				{
					pNextSlidingDockBar->SetOffsetLeft (rectBarOrg.Height ());
				}

				if (rectBarOrg.bottom == rectBarNext.top)
				{
					pBar->SetOffsetRight (rectBarNext.Width ());
				}
			}
			else if (dwBarAlignOrg & CBRS_ALIGN_RIGHT && 
					 dwBarAlignNext & CBRS_ALIGN_BOTTOM)
			{
				if (rectBarOrg.bottom == rectBarNext.top)
				{
					pNextSlidingDockBar->SetOffsetRight (rectBarOrg.Width ());
				}

				if (rectBarOrg.left == rectBarNext.right)
				{
					pBar->SetOffsetRight (rectBarOrg.Width ());
				}
			}
			else if (dwBarAlignOrg & CBRS_ALIGN_LEFT && 
					 dwBarAlignNext & CBRS_ALIGN_BOTTOM)
			{
				if (rectBarOrg.bottom == rectBarNext.top)
				{
					pNextSlidingDockBar->SetOffsetLeft (rectBarOrg.Width ());
				}

				if (rectBarOrg.right == rectBarNext.left)
				{
					pBar->SetOffsetRight (rectBarNext.Height ());
				}
			}
		}
	}
} 
//----------------------------------------------------------------------------------//
void CBCGPDockManager::AlignByRect (const CRect& rectToAlignBy, 
										CRect& rectResult, DWORD dwAlignment, 
										BOOL bHorizontal, BOOL bResizable)
{
	ASSERT_VALID (this);

	int nCurrWidth = rectResult.Width ();
	int nCurrHeight = rectResult.Height ();


	DWORD dwCurrAlignment = dwAlignment & CBRS_ALIGN_ANY;
	switch (dwCurrAlignment)
	{
	case CBRS_ALIGN_LEFT:
		rectResult.TopLeft () = rectToAlignBy.TopLeft ();
		rectResult.bottom = rectResult.top + rectToAlignBy.Height ();
		rectResult.right = rectResult.left + nCurrWidth;
		break;

	case CBRS_ALIGN_TOP:
		rectResult.TopLeft () = rectToAlignBy.TopLeft ();
		rectResult.right = rectResult.left + rectToAlignBy.Width ();
		rectResult.bottom = rectResult.top + nCurrHeight;
		break;

	case CBRS_ALIGN_RIGHT:
		rectResult.BottomRight () = rectToAlignBy.BottomRight ();
		rectResult.top = rectResult.bottom - rectToAlignBy.Height ();
		rectResult.left = rectResult.right - nCurrWidth;
		break;
	case CBRS_ALIGN_BOTTOM:
		rectResult.BottomRight () = rectToAlignBy.BottomRight ();
		rectResult.left = rectResult.right - rectToAlignBy.Width ();
		rectResult.top = rectResult.bottom - nCurrHeight;	
		break;
	}

	
	if (bHorizontal)
	{		
		int nDelta = rectResult.Width () - rectToAlignBy.Width ();
		if (nDelta != 0)
		{
			rectResult.right += nDelta;
		}

		nDelta = rectResult.Height () - rectToAlignBy.Height ();
		if (nDelta > 0 && bResizable)
		{
			if (dwCurrAlignment & CBRS_ALIGN_TOP)
			{
				rectResult.bottom -= nDelta;
			}
			else if (dwCurrAlignment & CBRS_ALIGN_BOTTOM)
			{
				rectResult.top += nDelta;
			}
		}
	}
	else
	{
		int nDelta = rectResult.Height () - rectToAlignBy.Height ();
		if (nDelta != 0)
		{
			rectResult.bottom += nDelta;
		}

		nDelta = rectResult.Width () - rectToAlignBy.Width ();
		if (rectResult.Width () > rectToAlignBy.Width () && bResizable)
		{
			if (dwCurrAlignment & CBRS_ALIGN_LEFT)
			{
				rectResult.right -= nDelta;
			}
			else if (dwCurrAlignment & CBRS_ALIGN_RIGHT)
			{
				rectResult.left += nDelta;
			}
		}
	}
}
//----------------------------------------------------------------------------------//
BOOL CBCGPDockManager::SaveState (LPCTSTR lpszProfileName, UINT uiID)
{
	ASSERT_VALID (this);

	CString strProfileName = ::BCGPGetRegPath (strDockManagerProfile, lpszProfileName);

	BOOL bResult = FALSE;


	CString strSection;
	strSection.Format (REG_SECTION_FMT, strProfileName, uiID);

	for (POSITION pos = m_lstControlBars.GetHeadPosition (); pos != NULL;)
	{
		CBCGPBaseControlBar* pBarNext = (CBCGPBaseControlBar*) m_lstControlBars.GetNext (pos);
		ASSERT_VALID (pBarNext);

		if (pBarNext->IsKindOf (RUNTIME_CLASS (CBCGPDockingControlBar)) ||
			pBarNext->IsKindOf (RUNTIME_CLASS (CBCGPControlBar)) && 
			!pBarNext->IsKindOf (RUNTIME_CLASS (CBCGPToolBar)))
		{
			pBarNext->SaveState (lpszProfileName);
		}
	}

	for (pos = m_lstMiniFrames.GetHeadPosition (); pos != NULL;)
	{
		CBCGPMiniFrameWnd* pWnd = 
			DYNAMIC_DOWNCAST (CBCGPMiniFrameWnd, m_lstMiniFrames.GetNext (pos));

		ASSERT_VALID (pWnd);

		pWnd->SaveState (lpszProfileName);
	}

	try

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -