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

📄 bcgpdockmanager.cpp

📁 远程网络监视程序的源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// BCGPDockManager.cpp: implementation of the CBCGPDockManager class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"

#include "BCGPGlobalUtils.h"
#include "BCGPDockBar.h"
#include "BCGPDockingControlBar.h"
#include "BCGPSlider.h"

#include "BCGPAutoHideDockBar.h"
#include "BCGPAutoHideToolBar.h"
#include "BCGPAutoHideButton.h"

#include "BCGPDockManager.h"
#include "BCGPMiniFrameWnd.h"
#include "BCGPMultiMiniFrameWnd.h"
#include "BCGPTabbedControlBar.h"
#include "BCGPMDIChildWnd.h"

#include "BCGPCaptionBar.h"

#include "RegPath.h"
#include "BCGPRegistry.h"

#include "BCGPStatusBar.h"
#include "BCGPDockBarRow.h"

#include "BCGPReBar.h"

#pragma warning (disable : 4706)

#include "multimon.h"

#pragma warning (default : 4706)


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

#define REG_SECTION_FMT						_T("%sBCGPDockManager-%d")
#define REG_ENTRY_DOCKING_CB_AND_SLIDERS	_T ("DockingCBAndSliders")

static const CString strDockManagerProfile	= _T("BCGPDockManagers");

const DWORD dwDockBarMap[4][2] =
{
	{ AFX_IDW_DOCKBAR_TOP,      CBRS_TOP    },
	{ AFX_IDW_DOCKBAR_BOTTOM,   CBRS_BOTTOM },
	{ AFX_IDW_DOCKBAR_LEFT,     CBRS_LEFT   },
	{ AFX_IDW_DOCKBAR_RIGHT,    CBRS_RIGHT  },
};

UINT CBCGPDockManager::g_nTimeOutBeforeToolBarDock = 200;
UINT CBCGPDockManager::g_nTimeOutBeforeDockingBarDock = 220;

BCGP_DOCK_TYPE	CBCGPDockManager::m_dockModeGlobal = DT_STANDARD;
UINT			CBCGPDockManager::m_ahSlideModeGlobal = BCGP_AHSM_MOVE;
int				CBCGPDockManager::m_nDockSencitivity = 15;
BOOL			CBCGPDockManager::m_bRestoringDockState = FALSE;
BOOL			CBCGPDockManager::m_bHideDockingBarsInContainerMode = TRUE;
BOOL			CBCGPDockManager::m_bDisableRecalcLayout = FALSE;
BOOL			CBCGPDockManager::m_bFullScreenMode = FALSE;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CBCGPDockManager::CBCGPDockManager() : m_pParentWnd (NULL)
{
	m_dwEnabledDockBars = 0;
	m_dwEnabledSlideBars = 0;
	m_pActiveSlidingWnd = NULL;

	m_pLastTargetBar = NULL;
	m_pLastMultiMiniFrame = NULL;
	m_clkLastTime = 0;
	m_statusLast = CS_NOTHING;

	m_rectDockBarBounds.SetRectEmpty ();
	m_rectClientAreaBounds.SetRectEmpty ();
	m_rectOuterEdgeBounds.SetRectEmpty ();

	m_bIsPrintPreviewMode = FALSE;
	m_bEnableAdjustLayout = TRUE;

	m_bLockUpdate = FALSE;
	m_bAdjustingBarLayout = FALSE;
	m_bRecalcLayout = FALSE;
	m_bSizeFrame = FALSE;

	m_bIsOLEContainerMode = FALSE;
	m_bDisableSetDockState = FALSE;

	m_bIsOLEInPlaceActivate = FALSE;
}
//------------------------------------------------------------------------//
CBCGPDockManager::~CBCGPDockManager()
{

}
//------------------------------------------------------------------------//
BOOL CBCGPDockManager::Create (CFrameWnd* pParentWnd)
{
	ASSERT_VALID (this);
	ASSERT_VALID (pParentWnd);
	m_pParentWnd = pParentWnd;

	return TRUE;
}
//------------------------------------------------------------------------//
BOOL CBCGPDockManager::EnableDocking (DWORD dwStyle)
{
	BCGP_DOCKBAR_INFO info;
	if (dwStyle & CBRS_ALIGN_TOP && (m_dwEnabledDockBars & CBRS_ALIGN_TOP) == 0)
	{
		info.m_dwBarAlignment = CBRS_ALIGN_TOP;
		info.pDockBarRTC = RUNTIME_CLASS (CBCGPDockBar);
		if (!AddDockBar (info))
		{
			return FALSE;
		}
		m_dwEnabledDockBars |= CBRS_ALIGN_TOP;
	}

	if (dwStyle & CBRS_ALIGN_BOTTOM && (m_dwEnabledDockBars & CBRS_ALIGN_BOTTOM) == 0)
	{
		info.m_dwBarAlignment = CBRS_ALIGN_BOTTOM;
		info.pDockBarRTC = RUNTIME_CLASS (CBCGPDockBar);
		if (!AddDockBar (info))
		{
			return FALSE;
		}
		m_dwEnabledDockBars |= CBRS_ALIGN_BOTTOM;
	}

	if (dwStyle & CBRS_ALIGN_LEFT && (m_dwEnabledDockBars & CBRS_ALIGN_LEFT) == 0)
	{
		info.m_dwBarAlignment = CBRS_ALIGN_LEFT;
		info.pDockBarRTC = RUNTIME_CLASS (CBCGPDockBar);
		if (!AddDockBar (info))
		{
			return FALSE;
		}
		m_dwEnabledDockBars |= CBRS_ALIGN_LEFT;
	}

	if (dwStyle & CBRS_ALIGN_RIGHT && (m_dwEnabledDockBars & CBRS_ALIGN_RIGHT) == 0)
	{
		info.m_dwBarAlignment = CBRS_ALIGN_RIGHT;
		info.pDockBarRTC = RUNTIME_CLASS (CBCGPDockBar);
		if (!AddDockBar (info))
		{
			return FALSE;
		}
		m_dwEnabledDockBars |= CBRS_ALIGN_RIGHT;
	}
	AdjustDockingLayout ();

	return TRUE;
}
//------------------------------------------------------------------------//
BOOL CBCGPDockManager::EnableAutoHideBars (DWORD dwStyle)
{
	BCGP_DOCKBAR_INFO info;

	if (dwStyle & CBRS_ALIGN_TOP && (m_dwEnabledSlideBars & CBRS_ALIGN_TOP) == 0)
	{
		if ((m_dwEnabledDockBars & CBRS_ALIGN_TOP) == 0)
		{
			EnableDocking (CBRS_ALIGN_TOP);
		}
		info.m_dwBarAlignment = CBRS_ALIGN_TOP;
		info.pDockBarRTC = RUNTIME_CLASS (CBCGPAutoHideDockBar);
		if (!AddDockBar (info))
		{
			return FALSE;
		}
		m_dwEnabledSlideBars |= CBRS_ALIGN_TOP;
	}

	if (dwStyle & CBRS_ALIGN_BOTTOM  && (m_dwEnabledSlideBars & CBRS_ALIGN_BOTTOM) == 0)
	{
		if ((m_dwEnabledDockBars & CBRS_ALIGN_BOTTOM) == 0)
		{
			EnableDocking (CBRS_ALIGN_BOTTOM);
		}

		info.m_dwBarAlignment = CBRS_ALIGN_BOTTOM;
		info.pDockBarRTC = RUNTIME_CLASS (CBCGPAutoHideDockBar);
		if (!AddDockBar (info))
		{
			return FALSE;
		}
		m_dwEnabledSlideBars |= CBRS_ALIGN_BOTTOM;
	}

	if (dwStyle & CBRS_ALIGN_LEFT && (m_dwEnabledSlideBars & CBRS_ALIGN_LEFT) == 0)
	{
		if ((m_dwEnabledDockBars & CBRS_ALIGN_LEFT) == 0)
		{
			EnableDocking (CBRS_ALIGN_LEFT);
		}

		info.m_dwBarAlignment = CBRS_ALIGN_LEFT;
		info.pDockBarRTC = RUNTIME_CLASS (CBCGPAutoHideDockBar);
		if (!AddDockBar (info))
		{
			return FALSE;
		}
		m_dwEnabledSlideBars |= CBRS_ALIGN_LEFT;
	}

	if (dwStyle & CBRS_ALIGN_RIGHT && (m_dwEnabledSlideBars & CBRS_ALIGN_RIGHT) == 0)
	{
		if ((m_dwEnabledDockBars & CBRS_ALIGN_RIGHT) == 0)
		{
			EnableDocking (CBRS_ALIGN_RIGHT);
		}

		info.m_dwBarAlignment = CBRS_ALIGN_RIGHT;
		info.pDockBarRTC = RUNTIME_CLASS (CBCGPAutoHideDockBar);
		if (!AddDockBar (info))
		{
			return FALSE;
		}
		m_dwEnabledSlideBars |= CBRS_ALIGN_RIGHT;
	}
	
	AdjustDockingLayout ();
	return TRUE;
}
//------------------------------------------------------------------------//
BOOL CBCGPDockManager::AddDockBar (const BCGP_DOCKBAR_INFO& info, 
										 CBCGPDockBar** ppDockBar)
{
	ASSERT_VALID (this);

	if (ppDockBar != NULL)
	{
		*ppDockBar = NULL;
	}

	CBCGPDockBar* pDockBar = (CBCGPDockBar*) info.pDockBarRTC->CreateObject ();
	ASSERT_VALID (pDockBar);
	if (pDockBar->Create (info.m_dwBarAlignment, CRect (0, 0, 0, 0), m_pParentWnd, 0))
	{
		m_lstControlBars.AddTail (pDockBar);
	}
	else
	{
		TRACE0 ("Failed to create DockBar");
		delete pDockBar;
		return FALSE;
	}

	if (ppDockBar != NULL)
	{
		*ppDockBar = pDockBar;
	}

	return TRUE;
}
//------------------------------------------------------------------------//
BOOL CBCGPDockManager::InsertDockBar (const BCGP_DOCKBAR_INFO& info, 
										 DWORD dwAlignToInsertAfter, 
										 CBCGPDockBar** ppDockBar)
{
	ASSERT_VALID (this);

	if (ppDockBar != NULL)
	{
		*ppDockBar = NULL;
	}

	CBCGPDockBar* pDockBar = (CBCGPDockBar*) info.pDockBarRTC->CreateObject ();
	ASSERT_VALID (pDockBar);
	if (pDockBar->Create (info.m_dwBarAlignment, CRect (0, 0, 0, 0), m_pParentWnd, 0))
	{
		BOOL bInserted = FALSE;
		for (POSITION pos = m_lstControlBars.GetHeadPosition (); pos != NULL;)
		{
			CBCGPBaseControlBar* pNextBar = (CBCGPBaseControlBar*) m_lstControlBars.GetNext (pos);
			ASSERT_VALID (pNextBar);
			
			if (pNextBar->IsKindOf (RUNTIME_CLASS (CBCGPDockBar)) &&
				pNextBar->GetCurrentAlignment () == (dwAlignToInsertAfter & CBRS_ALIGN_ANY) && 
				pos != NULL)
			{
				m_lstControlBars.InsertBefore (pos, pDockBar);
				bInserted = TRUE;
				break;
			}
		}

		if (!bInserted)
		{
			m_lstControlBars.AddTail (pDockBar);
		}				
	}
	else
	{
		TRACE0 ("Failed to create DockBar");
		delete pDockBar;
		return FALSE;
	}

	if (ppDockBar != NULL)
	{
		*ppDockBar = pDockBar;
	}

	return TRUE;
}
//------------------------------------------------------------------------//
BOOL CBCGPDockManager::AddControlBar (CBCGPBaseControlBar* pWnd, BOOL bTail, BOOL bAutoHide, 
									  BOOL bInsertForOuterEdge)
{
	ASSERT_VALID (this);
	ASSERT_VALID (pWnd);

	CObList& lstBars = bAutoHide ? m_lstAutoHideBars : m_lstControlBars;

	if (lstBars.Find (pWnd))
	{
		TRACE0 ("Control bar already added!!!\n");
		ASSERT (FALSE);
		return FALSE;
	}

	if (bTail)
	{
		lstBars.AddTail (pWnd);
	}
	else if (bInsertForOuterEdge)
	{
		// find first control bar with the same alignment and insert before it
		for (POSITION pos = lstBars.GetHeadPosition (); pos != NULL;)
		{
			POSITION posSave = pos;
			CBCGPBaseControlBar* pNextBar = 
				DYNAMIC_DOWNCAST (CBCGPBaseControlBar, m_lstControlBars.GetNext (pos));
			ASSERT_VALID (pNextBar);

			if (pNextBar->DoesAllowDynInsertBefore ())
			{
				lstBars.InsertBefore (posSave, pWnd);
				return TRUE;
			}
		}

		lstBars.AddTail (pWnd);
	}
	else
	{
		lstBars.AddHead (pWnd);
	}

	pWnd->m_pDockSite = m_pParentWnd;

	return TRUE;
}
//------------------------------------------------------------------------//
BOOL CBCGPDockManager::InsertControlBar (CBCGPBaseControlBar* pControlBar, 
										     CBCGPBaseControlBar* pTarget, BOOL bAfter)
{
	ASSERT_VALID (this);
	ASSERT_VALID (pControlBar);	

	if (m_lstControlBars.Find (pControlBar))
	{
		TRACE0 ("Control bar already added!!!\n");
		ASSERT (FALSE);
		return FALSE;
	}

	POSITION pos = m_lstControlBars.Find (pTarget);
	if (pos == NULL)
	{
		TRACE0 ("Control bar does not exist in the control container!!!\n");
		ASSERT (FALSE);
		return FALSE;
	}

	if (bAfter)
	{
		m_lstControlBars.InsertAfter (pos, pControlBar);
	}
	else
	{
		m_lstControlBars.InsertBefore (pos, pControlBar);
	}
	return TRUE;
}
//------------------------------------------------------------------------//
void CBCGPDockManager::RemoveControlBarFromDockManager (CBCGPBaseControlBar* pWnd, BOOL bDestroy,
										 BOOL bAdjustLayout, BOOL bAutoHide)
{
	CObList& lstBars = bAutoHide ? m_lstAutoHideBars : m_lstControlBars;

	POSITION pos = lstBars.Find (pWnd);
	if (pos != NULL)
	{
		lstBars.RemoveAt (pos);
		if (bDestroy)
		{
			pWnd->DestroyWindow ();
		}

		if (bAdjustLayout)
		{
			AdjustDockingLayout ();
		}
	}
}
//------------------------------------------------------------------------//
BOOL CBCGPDockManager::AddMiniFrame (CBCGPMiniFrameWnd* pWnd)
{
	ASSERT_VALID (this);
	ASSERT_VALID (pWnd);

	POSITION pos = m_lstMiniFrames.Find (pWnd);

	if (pos != NULL)
	{
		return FALSE;
	}

	m_lstMiniFrames.AddTail (pWnd);
	return TRUE;
}
//------------------------------------------------------------------------//
BOOL CBCGPDockManager::RemoveMiniFrame (CBCGPMiniFrameWnd* pWnd)
{
	ASSERT_VALID (this);

	POSITION pos = m_lstMiniFrames.Find (pWnd);
	if (pos != NULL)
	{
		m_lstMiniFrames.RemoveAt (pos);
		return TRUE;
	}

	return FALSE;
}
//------------------------------------------------------------------------//
CBCGPBaseControlBar* CBCGPDockManager::ControlBarFromPoint (CPoint point, int nSensitivity, 
															   bool bExactBar, 
															   CRuntimeClass* pRTCBarType, 
															   BOOL bCheckVisibility, 
															   const CBCGPBaseControlBar* pBarToIgnore) const
{
	ASSERT_VALID (this);
	
	CBCGPMiniFrameWnd* pFrame = FrameFromPoint (point, NULL, TRUE);
	if (pFrame != NULL)
	{
		CBCGPBaseControlBar* pBar = 
			pFrame->ControlBarFromPoint (point, nSensitivity, bCheckVisibility);
		if (pBar != NULL && pBar != pBarToIgnore && 
			(pRTCBarType == NULL || pBar->IsKindOf (pRTCBarType)))
		{
			return pBar;
		}
	}

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

		if ((pRTCBarType == NULL || pNextBar->IsKindOf (pRTCBarType)))  
		{
			if (bCheckVisibility && !pNextBar->IsBarVisible () ||
				pNextBar == pBarToIgnore)
			{
				continue;
			}
			
			CRect rectWnd;
			pNextBar->GetWindowRect (rectWnd);
			if (!bExactBar)
			{
				rectWnd.InflateRect (nSensitivity, nSensitivity);
			}

⌨️ 快捷键说明

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