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

📄 bcgpvisualmanagerxp.cpp

📁 远程网络监视程序的源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
//*******************************************************************************
// COPYRIGHT NOTES
// ---------------
// This is a part of the BCGControlBar Library
// Copyright (C) 1998-2000 BCGSoft Ltd.
// All rights reserved.
//
// This source code can be used, distributed or modified
// only under terms and conditions 
// of the accompanying license agreement.
//*******************************************************************************
// BCGPVisualManagerXP.cpp: implementation of the CBCGPVisualManagerXP class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"

#include "BCGPVisualManagerXP.h"
#include "BCGPDrawManager.h"
#include "BCGPMenuBar.h"
#include "BCGPPopupMenu.h"
#include "BCGPToolbarMenuButton.h"
#include "BCGPOutlookBarPane.h"
#include "BCGPColorBar.h"
#include "BCGPBaseTabWnd.h"
#include "BCGPDockingControlBar.h"
#include "BCGPAutoHideDockBar.h"
#include "BCGGlobals.h"
#include "BCGPOutlookButton.h"
#include "BCGPMiniFrameWnd.h"
#include "BCGPTaskPaneMiniFrameWnd.h"
#include "BCGPToolbarEditBoxButton.h"
#include "BCGPTasksPane.h"
#include "BCGPCalendarBar.h"

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

IMPLEMENT_DYNCREATE(CBCGPVisualManagerXP, CBCGPVisualManager)

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CBCGPVisualManagerXP::CBCGPVisualManagerXP(BOOL bIsTemporary) :
		CBCGPVisualManager (bIsTemporary)
{
	m_bConnectMenuToParent = TRUE;

	m_nVertMargin = 4;
	m_nHorzMargin = 4;
	m_nGroupVertOffset = 4;
	m_nGroupCaptionHeight = 0;
	m_nGroupCaptionHorzOffset = 0;
	m_nGroupCaptionVertOffset = 0;
	m_nTasksHorzOffset = 12;
	m_nTasksIconHorzOffset = 5;
	m_nTasksIconVertOffset = 4;
	m_bActiveCaptions = FALSE;
	
	m_bMenuFlatLook = TRUE;
	m_bShadowHighlightedImage = TRUE;
	m_bEmbossDisabledImage = FALSE;
	m_bFadeInactiveImage = TRUE;
	m_bLook2000 = TRUE;
	m_nMenuShadowDepth = 4;
	m_nMenuBorderSize = 1;

	m_bOfficeXPStyleMenus = TRUE;

	globalData.UpdateSysColors ();
	OnUpdateSystemColors ();
}
//**********************************************************************************
CBCGPVisualManagerXP::~CBCGPVisualManagerXP()
{
}
//****************************************************************************************
void CBCGPVisualManagerXP::OnUpdateSystemColors ()
{
	m_brBarBkgnd.DeleteObject ();
	m_brMenuLight.DeleteObject ();
	m_brHighlight.DeleteObject ();
	m_brHighlightDn.DeleteObject ();
	m_brHighlightChecked.DeleteObject ();

	m_brFloatToolBarBorder.DeleteObject ();

	m_penSeparator.DeleteObject ();
	m_brTabBack.DeleteObject ();

	COLORREF clrTabBack;
	COLORREF clrSeparator;
	COLORREF clrFloatToolBarBorder;

	if (globalData.m_nBitsPerPixel > 8)
	{
		COLORREF clrWindow = globalData.clrBarWindow;
		COLORREF clrFace = globalData.clrBarFace;

		m_clrMenuLight = CBCGPDrawManager::PixelAlpha (
			clrWindow, .976, .973, .969);

		double H, S, L;
		CBCGPDrawManager::RGBtoHSL (clrFace, &H, &S, &L);

		double S1;
		double L1;

		if (S < 0.1)
		{
			L1 = min (1., L + (1. - L) * .5);
			S1 = S == 0 ? 0 : min (1., S + .1);
		}
		else
		{
			L1 = min (1., 0.5 * L + 0.5);
			S1 = min (1., S * 2);
		}

		clrTabBack = CBCGPDrawManager::HLStoRGB_ONE (H, L1, S1);
		if (L > .9)
		{
			m_clrBarBkgnd = clrFace;
		}
		else
		{
			m_clrBarBkgnd = CBCGPDrawManager::HLStoRGB_ONE (H, L * 1.03, S);
		}
		m_clrInactiveTabText = CBCGPDrawManager::HLStoRGB_ONE (H, L * .4, S);

		COLORREF clrHL = globalData.clrHilite;
		m_clrHighlight = CBCGPDrawManager::PixelAlpha (RGB (
			(GetRValue (clrHL) + 2 * GetRValue (m_clrMenuLight)) / 3,
			(GetGValue (clrHL) + 2 * GetGValue (m_clrMenuLight)) / 3,
			(GetBValue (clrHL) + 2 * GetBValue (m_clrMenuLight)) / 3), 
			105);

		m_clrHighlightDn = CBCGPDrawManager::PixelAlpha (
			m_clrHighlight, .87, .87, .87);

		m_clrHighlightChecked = CBCGPDrawManager::PixelAlpha (RGB (
			(GetRValue (clrHL) + 5 * GetRValue (m_clrMenuLight)) / 6,
			(GetGValue (clrHL) + 5 * GetGValue (m_clrMenuLight)) / 6,
			(GetBValue (clrHL) + 5 * GetBValue (m_clrMenuLight)) / 6), 
			100);

		clrSeparator = CBCGPDrawManager::PixelAlpha (
			globalData.clrBarFace, .86, .86, .86);

		m_clrPaneBorder = globalData.clrBarShadow;

		m_clrMenuBorder = CBCGPDrawManager::PixelAlpha (
			clrFace, 55);

		clrFloatToolBarBorder = CBCGPDrawManager::PixelAlpha (
			globalData.clrBarShadow, .85, .85, .85);

		m_clrGripper = CBCGPDrawManager::PixelAlpha (
			globalData.clrBarShadow, 110);
	}
	else
	{
		m_clrMenuLight = globalData.clrWindow;

		m_clrBarBkgnd = globalData.clrBtnFace;
		m_clrHighlight = globalData.clrBtnFace;
		m_clrHighlightDn = globalData.clrBtnFace;
		m_clrHighlightChecked = globalData.clrWindow;
		clrTabBack = globalData.clrBtnFace;
		m_clrInactiveTabText = globalData.clrBtnDkShadow;
		clrSeparator = globalData.clrBtnShadow;
		m_clrGripper = globalData.clrBtnShadow;
		m_clrPaneBorder = globalData.clrBtnShadow;
		m_clrMenuBorder = globalData.clrBtnDkShadow;
		clrFloatToolBarBorder = globalData.clrBtnShadow;
	}

	m_brBarBkgnd.CreateSolidBrush (m_clrBarBkgnd);
	m_brMenuLight.CreateSolidBrush (m_clrMenuLight);

	m_brHighlight.CreateSolidBrush (m_clrHighlight);
	m_brHighlightDn.CreateSolidBrush (m_clrHighlightDn);
	m_brHighlightChecked.CreateSolidBrush (m_clrHighlightChecked);
	m_brTabBack.CreateSolidBrush (clrTabBack);
	m_penSeparator.CreatePen (PS_SOLID, 1, clrSeparator);

	m_clrMenuItemBorder = globalData.clrHilite;

	m_brFloatToolBarBorder.CreateSolidBrush (clrFloatToolBarBorder);

	m_clrMenuShadowBase = (COLORREF)-1;	// Used in derived classes
}
//***************************************************************************************
void CBCGPVisualManagerXP::OnDrawBarGripper (CDC* pDC, CRect rectGripper, BOOL bHorz,
									   CBCGPBaseControlBar* pBar)
{
	ASSERT_VALID (pDC);

	if (pBar != NULL && pBar->IsDialogControl ())
	{
		CBCGPVisualManager::OnDrawBarGripper (pDC, rectGripper, bHorz, pBar);
		return;
	}

	if (m_brGripperHorz.GetSafeHandle () == NULL)
	{
		CreateGripperBrush ();
	}

	BOOL bSideBar = pBar->IsKindOf (RUNTIME_CLASS (CBCGPDockingControlBar));
	BOOL bMenuBar = pBar->IsKindOf (RUNTIME_CLASS (CBCGPMenuBar));

	CRect rectFill = rectGripper;

	if (!bSideBar)
	{
		if (bHorz)
		{
			int xCenter = rectFill.CenterPoint ().x;
			rectFill.left = xCenter - 1;
			rectFill.right = xCenter + 2;
			rectFill.DeflateRect (0, 5);
		}
		else
		{
			int yCenter = rectFill.CenterPoint ().y;
			rectFill.top = yCenter - 1;
			rectFill.bottom = yCenter + 2;
			rectFill.DeflateRect (5, 0);
		}
	}
	else
	{
		if (bHorz)
		{
			rectFill.DeflateRect (4, 0);
		}
		else
		{
			rectFill.DeflateRect (4, 0);
		}

		bHorz = !bHorz;
	}

	COLORREF clrTextOld = pDC->SetTextColor (m_clrGripper);
	COLORREF clrBkOld = pDC->SetBkColor (bSideBar || bMenuBar ? 
		globalData.clrBarFace : m_clrBarBkgnd);

	pDC->FillRect (rectFill, bHorz ? &m_brGripperHorz : &m_brGripperVert);

	if (bSideBar)
	{
		//------------------
		// Draw bar caption:
		//------------------
		int nOldBkMode = pDC->SetBkMode (OPAQUE);
		pDC->SetTextColor (globalData.clrBarText);

		const CFont& font = CBCGPMenuBar::GetMenuFont (bHorz);

		CFont* pOldFont = pDC->SelectObject ((CFont*) &font);

		CString strCaption;
		pBar->GetWindowText (strCaption);
		strCaption = _T(" ") + strCaption + _T(" ");

		CRect rectText = rectGripper;
		UINT uiTextFormat = 0;

		TEXTMETRIC tm;
		pDC->GetTextMetrics (&tm);

		CPoint ptTextOffset (0, 0);
		if (bHorz)
		{
			ptTextOffset.y = (rectGripper.Height () - tm.tmHeight - 1) / 2;
		}
		else
		{
			ptTextOffset.x = (rectGripper.Width () - tm.tmHeight + 1) / 2;
		}

		if (bHorz)
		{
			rectText.top += ptTextOffset.y;
			pDC->DrawText (strCaption, &rectText, uiTextFormat);
		}
		else
		{
			rectText.left = rectText.right - ptTextOffset.x;
			rectText.top = rectGripper.top + ptTextOffset.y;
			rectText.bottom = rectGripper.top + 3 * ptTextOffset.y;

			uiTextFormat |= DT_NOCLIP;

			pDC->DrawText (strCaption, &rectText, uiTextFormat);
		}

		pDC->SelectObject(pOldFont);
		pDC->SetBkMode(nOldBkMode);
	}

	pDC->SetTextColor (clrTextOld);
	pDC->SetBkColor (clrBkOld);
}
//****************************************************************************************
void CBCGPVisualManagerXP::OnDrawMenuBorder (CDC* pDC, CBCGPPopupMenu* pMenu, CRect rect)
{
	ASSERT_VALID (pDC);
	ASSERT_VALID (pMenu);

	pDC->Draw3dRect (rect, m_clrMenuBorder, m_clrMenuBorder);
	rect.DeflateRect (1, 1);
	pDC->Draw3dRect (rect, m_clrMenuLight, m_clrMenuLight);

	CRect rectLeft (1, 1, 2, rect.bottom - 1);
	pDC->FillRect (rectLeft, &m_brBarBkgnd);

	//------------------------------------------------
	// Quick Customize Office XP like draw popup menu
	//------------------------------------------------
	CBCGPPopupMenu* pParentPopup = pMenu->GetParentPopupMenu();
	if (pParentPopup != NULL)
	{
		if (pParentPopup->IsQuickCustomize())
		{
			CBCGPToolbarMenuButton* pParentBtn = pMenu->GetParentButton();
			if ((pParentBtn != NULL) && (pParentBtn->IsQuickMode()))
			{
				CBCGPPopupMenu* pParent = (CBCGPPopupMenu*)pMenu->GetParentPopupMenu();

				CRect rcParent;
				pParent->GetWindowRect(rcParent);

				CRect rcCurrent;
				pMenu->GetWindowRect(rcCurrent);

				CBCGPToolbarMenuButton* pBtn = pMenu->GetMenuItem(0);
				CRect rcButton = pBtn->Rect();

				CRect rectBorder;
				rectBorder.SetRectEmpty();

				if (rcParent.left > rcCurrent.left) 
				{
					rectBorder.SetRect(rect.right-1 , rect.top, rect.right+ 1, rcButton.bottom - 4);
				}
				else
				{
					rectBorder.SetRect(rect.left - 1 , rect.top, rect.left + 1 , rcButton.bottom - 4);
				}
				
				pDC->FillRect (rectBorder, &m_brBarBkgnd);
			}
		}
	}

	if (!CBCGPToolBar::IsCustomizeMode ())
	{
		//-------------------------------------
		// "Connect" menu to the parent button:
		//-------------------------------------
		CBCGPToolbarMenuButton* pParentMenuBtn = pMenu->GetParentButton ();
		if (m_bConnectMenuToParent &&
			pParentMenuBtn != NULL && pMenu->GetParentPopupMenu () == NULL && 
			pParentMenuBtn->IsBorder ())
		{
			CRect rectConnect;
			rectConnect.SetRectEmpty ();

			CRect rectParent = pParentMenuBtn->Rect ();
			CWnd* pWnd = pParentMenuBtn->GetParentWnd();
			pWnd->ClientToScreen(rectParent);
			pMenu->ScreenToClient(&rectParent);

			switch (pMenu->GetDropDirection ())
			{
			case CBCGPPopupMenu::DROP_DIRECTION_BOTTOM:
				rectConnect = CRect (rectParent.left + 1, rect.top - 1, rectParent.right - 2, rect.top);
				
				if (rectConnect.Width () > rect.Width () + 2)
				{
					return;
				}

				break;

			case CBCGPPopupMenu::DROP_DIRECTION_TOP:
				rectConnect = CRect (rectParent.left + 1, rect.bottom, rectParent.right - 2, rect.bottom + 1);

				if (rectConnect.Width () > rect.Width () + 2)
				{
					return;
				}

				break;

			case CBCGPPopupMenu::DROP_DIRECTION_RIGHT:
				rectConnect = CRect (rect.left - 1, rectParent.top + 1, rect.left, rectParent.bottom - 2);

				if (rectConnect.Height () > rect.Height () + 2)
				{
					return;
				}

				break;

			case CBCGPPopupMenu::DROP_DIRECTION_LEFT:
				rectConnect = CRect (rect.right, rectParent.top + 1, rect.right + 1, rectParent.bottom - 2);

				if (rectConnect.Height () > rect.Height () + 2)
				{
					return;
				}

				break;
			}

			CRect rectBorder = rect;
			rectBorder.InflateRect (1, 1);
			rectConnect.IntersectRect (&rectConnect, &rectBorder);
			rectParent.InflateRect (1, 1);
			rectConnect.IntersectRect (&rectConnect, &rectParent);

			pDC->FillRect (rectConnect, &m_brBarBkgnd);
		}
	}
}
//****************************************************************************************
void CBCGPVisualManagerXP::OnDrawMenuShadow (CDC* pPaintDC, const CRect& rectClient, const CRect& rectExclude,
								int nDepth,  int iMinBrightness,  int iMaxBrightness,  
								CBitmap* pBmpSaveBottom,  CBitmap* pBmpSaveRight)
{
	ASSERT_VALID (pPaintDC);
	ASSERT_VALID (pBmpSaveBottom);
	ASSERT_VALID (pBmpSaveRight);

	if (rectExclude.IsRectNull())
	{
		//------------------------
		// Simple draw the shadow:
		//------------------------
		CBCGPDrawManager dm (*pPaintDC);
		dm.DrawShadow (rectClient, nDepth, iMinBrightness, iMaxBrightness,
					pBmpSaveBottom, pBmpSaveRight, m_clrMenuShadowBase);
	}
	else
	{
		//--------------------------------------------
		// Copy screen content into the memory bitmap:
		//--------------------------------------------
		CDC dcMem;
		if (!dcMem.CreateCompatibleDC (pPaintDC))
		{
			ASSERT (FALSE);
			return;
		}

		//--------------------------------------------
		// Gets the whole menu and changes the shadow.
		//--------------------------------------------
		CRect rectBmp (0, 0, rectClient.Width(), rectClient.Height());
		int cx = rectBmp.Width() + nDepth;
		int cy = rectBmp.Height() + nDepth;
		CBitmap	bmpMem;
		if (!bmpMem.CreateCompatibleBitmap (pPaintDC, cx, cy))
		{
			ASSERT (FALSE);
			return;
		}

		CBitmap* pOldBmp = dcMem.SelectObject(&bmpMem);
		ASSERT (pOldBmp != NULL);

		dcMem.BitBlt (0, 0, cx, cy, pPaintDC, rectClient.left, rectClient.top, SRCCOPY);

		//-----------------
		// Draw the shadow:
		//-----------------
		CBCGPDrawManager dm (dcMem);
		dm.DrawShadow (rectBmp, nDepth, iMinBrightness, iMaxBrightness,
					pBmpSaveBottom, pBmpSaveRight, m_clrMenuShadowBase);

		//------------------------------------------
		// Do not cover rectExclude with the shadow:
		//------------------------------------------
		dcMem.BitBlt (rectExclude.left - rectClient.left, rectExclude.top - rectClient.top,
			rectExclude.Width(), rectExclude.Height(), 
			pPaintDC, rectExclude.left, rectExclude.top, SRCCOPY);

		//-----------------------------------------
		// Copy shadowed bitmap back to the screen:
		//-----------------------------------------
		pPaintDC->BitBlt (rectClient.left, rectClient.top, cx, cy, &dcMem, 0, 0, SRCCOPY);

		dcMem.SelectObject(pOldBmp);
	}
}
//****************************************************************************************
void CBCGPVisualManagerXP::OnDrawBarBorder (CDC* pDC, CBCGPBaseControlBar* pBar, CRect& rect)
{
	ASSERT_VALID(pBar);
	ASSERT_VALID(pDC);

	if (pBar->IsDialogControl ())
	{
		CBCGPVisualManager::OnDrawBarBorder (pDC, pBar, rect);
		return;
	}

	DWORD dwBarStyle = pBar->GetBarStyle ();
	if (!(dwBarStyle & CBRS_BORDER_ANY))
	{
		return;
	}

	COLORREF clrBckOld = pDC->GetBkColor ();	// FillSolidRect changes it

⌨️ 快捷键说明

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