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

📄 bcgpmultiminiframewnd.cpp

📁 远程网络监视程序的源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
}
//********************************************************************************
void CBCGPMultiMiniFrameWnd::OnSizing(UINT fwSide, LPRECT pRect) 
{
	CWnd::OnSizing(fwSide, pRect);
}
//********************************************************************************
void CBCGPMultiMiniFrameWnd::OnBarRecalcLayout ()
{
	ASSERT_VALID (this);

	CRect rect;
	GetClientRect (rect);
	HDWP hdwp = ::BeginDeferWindowPos (20);
	m_barContainerManager.ResizeBarContainers (rect, hdwp);
	EndDeferWindowPos (hdwp);	
}
//********************************************************************************
void CBCGPMultiMiniFrameWnd::RemoveControlBar (CBCGPBaseControlBar* pBar, BOOL bDestroy,
											   BOOL bNoDelayedDestroy)
{
	ASSERT_VALID (this);
	ASSERT_VALID (pBar);

	if (pBar->IsKindOf (RUNTIME_CLASS (CBCGPDockingControlBar)))
	{
		m_barContainerManager.RemoveControlBarFromContainer ((CBCGPDockingControlBar*) pBar);
		if (!m_barContainerManager.IsEmpty ())
		{
			CBCGPMiniFrameWnd::ReplaceControlBar (pBar, m_barContainerManager.GetFirstBar ());
		}
		else
		{
			// do not destroy the miniframe in the base class
			CBCGPMiniFrameWnd::RemoveControlBar (pBar, FALSE);

			// if embedded bar has became NULL set it to the first bar in the container
			CWnd* pEmbeddedWnd = CWnd::FromHandlePermanent (m_hEmbeddedBar);
			if (pEmbeddedWnd == NULL)
			{
				m_hEmbeddedBar = m_barContainerManager.GetFirstBar ()->GetSafeHwnd ();
			}
		}
	}
	
	if (bDestroy && GetControlBarCount () == 0)
	{
		PostMessage (BCGPM_CHECKEMPTYMINIFRAME);
	}
	else
	{
		CheckGripperVisibility ();
		OnBarRecalcLayout ();
		SendMessage (WM_NCPAINT);
	}

	OnKillRollUpTimer ();
}
//********************************************************************************
BOOL CBCGPMultiMiniFrameWnd::SetPreDockState (BCGP_PREDOCK_STATE preDockState, 
											  CBCGPBaseControlBar* pBarToDock, 
											  BCGP_DOCK_METHOD dockMethod)
{
	ASSERT_VALID (this);

	if (preDockState == PDS_NOTHING || 
		preDockState == PDS_DOCK_TO_TAB && 
		pBarToDock != NULL && 
		!pBarToDock->CanBeAttached ())
	{
		return TRUE;
	}


	CBCGPDockingControlBar* pTargetDockBar = 
		DYNAMIC_DOWNCAST (CBCGPDockingControlBar, pBarToDock);


	CBCGPDockManager* pDockManager = globalUtils.GetDockManager (GetParent ());
	if (pDockManager == NULL)
	{
		ASSERT (FALSE);
		return TRUE;
	}

	CWnd* pFirstDockedBar = m_barContainerManager.GetFirstVisibleBar ();

	// determine dock alignment and edge
	CPoint pt;
	GetCursorPos (&pt);

	DWORD dwAlignment = 0;

	CObList lstControlBars; 
	m_barContainerManager.AddControlBarsToList (&lstControlBars, NULL);

	for (POSITION pos = lstControlBars.GetHeadPosition (); pos != NULL;)
	{
		CBCGPDockingControlBar* pNextBar = 
			DYNAMIC_DOWNCAST (CBCGPDockingControlBar, lstControlBars.GetNext (pos));
		ASSERT_VALID (pNextBar);
		
		pNextBar->StoreRecentDockInfo ();
	}
	
	if (pTargetDockBar != NULL)
	{
		CBCGPBaseControlBar* pHeadBar = m_barContainerManager.GetFirstBar ();
		
		if (pHeadBar == NULL || !pTargetDockBar->CanAcceptBar (pHeadBar) || 
			!pHeadBar->CanAcceptBar (pTargetDockBar))
		{
			return TRUE;
		}

		if (!pHeadBar->IsBarVisible () && m_barContainerManager.GetBarCount () == 1 && 
			pHeadBar->GetDockMode () == DT_STANDARD)
		{
			// the head bar is unvisible and there is only one bar in container manager
			// means that this bar was torn off from the tab window and its parent miniframe
			// is hidden
			pHeadBar->ModifyStyle (0, WS_VISIBLE);
		}


		BOOL bOuterEdge = FALSE;
		if (preDockState == PDS_DOCK_REGULAR && 
			!globalUtils.CheckAlignment (pt, pTargetDockBar, 
										 CBCGPDockManager::m_nDockSencitivity, 
										 bOuterEdge, dwAlignment))
		{
			// unable for some reason to determine alignment
			return TRUE;
		}

		if (preDockState == PDS_DOCK_REGULAR)
		{
			if (!pTargetDockBar->DockContainer (m_barContainerManager, dwAlignment, dockMethod))
			{
				return TRUE;
			}
		}
		else if (preDockState == PDS_DOCK_TO_TAB)
		{
			for (pos = lstControlBars.GetHeadPosition (); pos != NULL;)
			{
				CBCGPDockingControlBar* pNextBar = 
					DYNAMIC_DOWNCAST (CBCGPDockingControlBar, lstControlBars.GetNext (pos));
				ASSERT_VALID (pNextBar);
				
				AddRemoveBarFromGlobalList (pNextBar, FALSE);
				pNextBar->AttachToTabWnd (pTargetDockBar, dockMethod);
			}

			ShowWindow (SW_HIDE);
			MoveWindow (GetRecentFloatingRect ());
			CBCGPMiniFrameWnd::OnCancelMode(); 
			SendMessage (BCGPM_CHECKEMPTYMINIFRAME);
			return TRUE;
		}
		else
		{
			return TRUE;
		}
	}
	else // dock to frame window - need to create a new default slider
	{
		BOOL bOuterEdge = FALSE;
		if (!pDockManager->IsPointNearDockBar (pt, dwAlignment, bOuterEdge))
		{
			return TRUE;
		}

		CBCGPSlider* pSlider = 
			CBCGPDockingControlBar::CreateDefaultSlider (dwAlignment, GetParent ());

		if (pSlider == NULL)
		{
			return TRUE;
		}

		pSlider->SetBarAlignment (dwAlignment);

		CRect rectContainer;
		m_barContainerManager.GetWindowRect (rectContainer);
		pDockManager->AdjustRectToClientArea (rectContainer, dwAlignment);
		HDWP hdwp = NULL;
		m_barContainerManager.ResizeBarContainers (rectContainer, hdwp);

		if (bOuterEdge)
		{
			// register slider with the dock manager
			pDockManager->AddControlBar (pSlider, !bOuterEdge, FALSE, bOuterEdge);
			pSlider->AddContainer (m_barContainerManager, bOuterEdge);
		}
		else
		{
			pSlider->AddContainer (m_barContainerManager, FALSE);
			pDockManager->AddControlBar (pSlider);
		}
	}

	// FINALLY destroy the frame - 
	// all its bars should have been docked (and therefore removed)
	HWND hwndSave = m_hWnd;
	SendMessage (BCGPM_CHECKEMPTYMINIFRAME);

	if (IsWindow (hwndSave))
	{
		MoveWindow (m_rectRecentFloatingRect);
	}
	

	if (pFirstDockedBar != NULL && dockMethod == DM_MOUSE)
	{
		pFirstDockedBar->ScreenToClient (&pt);
		if (pFirstDockedBar->IsKindOf (RUNTIME_CLASS (CBCGPDockingControlBar)))
		{
			((CBCGPDockingControlBar*)pFirstDockedBar)->EnterDragMode (FALSE);
		}
		else
		{
			pFirstDockedBar->SendMessage (WM_LBUTTONDOWN, 0, MAKELPARAM (pt.x, pt.y));
		}
	}

	// adjust the docking layout
	if (pTargetDockBar != NULL)
	{
		pTargetDockBar->RecalcLayout ();
	}
	else if (pFirstDockedBar != NULL)
	{
		CBCGPDockingControlBar* pDockingBar = 
			DYNAMIC_DOWNCAST (CBCGPDockingControlBar, pFirstDockedBar);
		if (pDockingBar != NULL)
		{
			pDockingBar->AdjustDockingLayout ();
			pDockingBar->SetFocus ();
		}
	}

	OnSetRollUpTimer ();

	return FALSE;
}
//*************************************************************************************
BOOL CBCGPMultiMiniFrameWnd::SaveState (LPCTSTR lpszProfileName, UINT uiID)
{
	ASSERT_VALID (this);
	CObList& lstControlBars = m_barContainerManager.m_lstControlBars;
	for (POSITION pos = lstControlBars.GetHeadPosition (); pos != NULL;)
	{
		CBCGPDockingControlBar* pNextBar = 
			DYNAMIC_DOWNCAST (CBCGPDockingControlBar, lstControlBars.GetNext (pos));
		ASSERT_VALID (pNextBar);

		pNextBar->SaveState (lpszProfileName, uiID);
	}	
	return TRUE;
}
//*************************************************************************************
BOOL CBCGPMultiMiniFrameWnd::LoadState (LPCTSTR lpszProfileName, UINT uiID)
{
	ASSERT_VALID (this);
	CObList& lstControlBars = m_barContainerManager.m_lstControlBars;
	for (POSITION pos = lstControlBars.GetHeadPosition (); pos != NULL;)
	{
		CBCGPDockingControlBar* pNextBar = 
			DYNAMIC_DOWNCAST (CBCGPDockingControlBar, lstControlBars.GetNext (pos));
		ASSERT_VALID (pNextBar);

		pNextBar->LoadState (lpszProfileName, uiID);
	}	
	return TRUE;
}
//********************************************************************************
void CBCGPMultiMiniFrameWnd::Serialize (CArchive& ar)
{
	ASSERT_VALID (this);
	CBCGPMiniFrameWnd::Serialize (ar);
	m_barContainerManager.Serialize (ar);
}
//********************************************************************************
void CBCGPMultiMiniFrameWnd::SetDockState (CBCGPDockManager* pDockManager)
{
	ASSERT_VALID (this);
	ASSERT_VALID (pDockManager);

	CObList lstBarsToRemove;
	if (!m_barContainerManager.IsEmpty ())
	{
		// float each control bar, reparent it and set its window position
		CObList& lstControlBars = m_barContainerManager.m_lstControlBars;
		for (POSITION pos = lstControlBars.GetHeadPosition (); pos != NULL;)
		{
			CBCGPDockingControlBar* pNextBar = 
				DYNAMIC_DOWNCAST (CBCGPDockingControlBar, lstControlBars.GetNext (pos));
			ASSERT_VALID (pNextBar);

			if (pNextBar->IsKindOf (RUNTIME_CLASS (CBCGPBaseTabbedBar)))
			{
				BOOL bLeftBar = FALSE;
				CBCGPBarContainer* pContainer = 
					m_barContainerManager.FindContainer (pNextBar, bLeftBar);

				ASSERT (pContainer != NULL);

				CList<UINT, UINT>* pListBarIDs = 
					pContainer->GetAssociatedSiblingBarIDs (pNextBar);

				if (pListBarIDs != NULL)
				{
					for (POSITION pos = pListBarIDs->GetHeadPosition (); pos != NULL;)
					{
						UINT nIDNext = pListBarIDs->GetNext (pos);
						CBCGPBaseControlBar* pBarToAttach = pDockManager->FindBarByID (nIDNext, TRUE);

						if (pBarToAttach == NULL)
						{
							continue;
						}

						if (pBarToAttach->IsKindOf (RUNTIME_CLASS (CBCGPDockingControlBar)) && 
							((CBCGPDockingControlBar*)pBarToAttach)->IsAutoHideMode ())
						{
							((CBCGPDockingControlBar*)pBarToAttach)->SetAutoHideMode (FALSE, CBRS_ALIGN_ANY);
						}

						if (pBarToAttach->IsTabbed ())
						{
							CBCGPBaseTabWnd* pTabWnd = 
									(CBCGPBaseTabWnd*) pBarToAttach->GetParent ();
							CBCGPBaseTabbedBar* pTabBar = (CBCGPBaseTabbedBar*)
									pTabWnd->GetParent ();	
							ASSERT_VALID (pTabBar);

							pBarToAttach->SetParent (this);
							pTabBar->RemoveControlBar (pBarToAttach);
						}
						else
						{
							// float this bar in case if was docked somewhere else
							pBarToAttach->FloatControlBar (CRect (0, 0, 10, 10), DM_SHOW, false);
						}
						CBCGPMiniFrameWnd* pParentMiniFrame = pBarToAttach->GetParentMiniFrame ();

						if (pParentMiniFrame != NULL && pParentMiniFrame != this)
						{
							pParentMiniFrame->RemoveControlBar (pBarToAttach);	
						}

						((CBCGPDockingControlBar*) pBarToAttach)->
							AttachToTabWnd (pNextBar, DM_UNKNOWN, FALSE);

						pParentMiniFrame->PostMessage (BCGPM_CHECKEMPTYMINIFRAME);
					}
				}

				if (((CBCGPBaseTabbedBar*)pNextBar)->GetTabsNum () == 0)
				{
					lstBarsToRemove.AddTail (pNextBar);
				}
				else
				{
					((CBCGPBaseTabbedBar*)pNextBar)->ApplyRestoredTabInfo ();
					pNextBar->RecalcLayout ();
				}
				continue;
			}

⌨️ 快捷键说明

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