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

📄 bcgpcolorbar.cpp

📁 远程网络监视程序的源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// BCGColorBar.cpp : implementation file
// 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.
//

#include "stdafx.h"

#ifndef BCG_NO_COLOR

#include <math.h>
#include "BCGCBPro.h"
#include "BCGPColorBar.h"
#include "BCGPColorMenuButton.h"
#include "BCGPPopupMenu.h"
#include "BCGPColorDialog.h"
#include "BCGPColorButton.h"
#include "trackmouse.h"
#include "BCGPVisualManager.h"
#include "BCGPPropList.h"

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

static const int SEPARATOR_SIZE = 2;

/////////////////////////////////////////////////////////////////////////////
// CColorButton

class CColorButton : public CBCGPToolbarButton  
{
	friend class CBCGPColorBar;
	friend class CBCGPColorMenuButton;

	DECLARE_SERIAL(CColorButton)

protected:
	CColorButton(COLORREF color = RGB (0, 0, 0), 
				BOOL bIsAutomatic = FALSE, BOOL bIsOther = FALSE,
				LPCTSTR lpszColorName = NULL, BOOL bHighlight = FALSE,
				BOOL bIsDocument = FALSE,
				BOOL bIsOtherColor = FALSE)
	{
		m_Color = color;
		m_bHighlight = bHighlight;
		m_strText = (lpszColorName == NULL) ? _T("") : lpszColorName;
		m_bIsAutomatic = bIsAutomatic;
		m_bIsOther = bIsOther;
		m_bIsLabel = FALSE;
		m_bIsDocument = bIsDocument;
		m_bIsOtherColor = bIsOtherColor;
		m_pParentBar = NULL;
	}

	CColorButton(LPCTSTR lpszColorName, BOOL bIsDocument = FALSE)
	{
		ASSERT (lpszColorName != NULL);

		m_Color = (COLORREF)-1;
		m_bHighlight = FALSE;
		m_strText = lpszColorName;
		m_bIsAutomatic = FALSE;
		m_bIsOther = FALSE;
		m_bIsLabel = TRUE;
		m_bIsDocument = bIsDocument;
		m_bIsOtherColor = FALSE;
		m_pParentBar = NULL;
	}

	virtual void OnDraw (CDC* pDC, const CRect& rect, CBCGPToolBarImages* pImages,
						BOOL bHorz = TRUE, BOOL bCustomizeMode = FALSE,
						BOOL bHighlight = FALSE,
						BOOL bDrawBorder = TRUE,
						BOOL bGrayDisabledButtons = TRUE);

	virtual BOOL OnToolHitTest(const CWnd* /*pWnd*/, TOOLINFO* pTI)
	{
		if (m_nStyle & TBBS_DISABLED)
		{
			return FALSE;
		}

		if (!CBCGPToolBar::GetShowTooltips ())
		{
			return FALSE;
		}

		ASSERT (pTI != NULL);

		CString str = m_strText;
		if (!m_bIsAutomatic && !m_bIsOther && !m_bIsLabel)
		{
			if (!CBCGPColorBar::m_ColorNames.Lookup (m_Color, str))
			{
				str.Format (_T("Hex={%02X,%02X,%02X}"), 
					GetRValue (m_Color), GetGValue (m_Color), GetBValue (m_Color));
			}
		}

		pTI->lpszText = (LPTSTR) ::calloc ((str.GetLength () + 1), sizeof (TCHAR));
		_tcscpy (pTI->lpszText, str);

		return TRUE;
	}

	virtual void OnChangeParentWnd (CWnd* pWndParent)
	{
		CBCGPToolbarButton::OnChangeParentWnd (pWndParent);
		m_pParentBar = DYNAMIC_DOWNCAST (CBCGPColorBar, pWndParent);
	}

	COLORREF		m_Color;
	BOOL			m_bHighlight;
	BOOL			m_bIsAutomatic;
	BOOL			m_bIsOther;
	BOOL			m_bIsLabel;
	BOOL			m_bIsDocument;
	BOOL			m_bIsOtherColor;
	CBCGPColorBar*	m_pParentBar;
};

IMPLEMENT_SERIAL(CColorButton, CBCGPToolbarButton, 1)

void CColorButton::OnDraw (CDC* pDC, const CRect& rect, CBCGPToolBarImages* /*pImages*/,
								BOOL bHorz, BOOL bCustomizeMode, BOOL bHighlight,
								BOOL bDrawBorder, BOOL /*bGrayDisabledButtons*/)
{
	ASSERT_VALID (pDC);
	ASSERT_VALID (this);

    CPalette* pOldPalette = NULL;

	if (m_pParentBar != NULL)
	{
		pOldPalette = m_pParentBar->SelectPalette (pDC);
	}

	BOOL bDisabled = (m_nStyle & TBBS_DISABLED);

	UINT nStyle = m_nStyle;

	if (m_bHighlight)
	{
		m_nStyle |= TBBS_CHECKED;
	}

	//----------------------
	// Fill button interior:
	//----------------------
	FillInterior (pDC, rect, bHighlight && !m_bIsDocument);

	//--------------------
	// Draw button border:
	//--------------------
	if (!bDisabled && !m_bIsLabel && HaveHotBorder () && bDrawBorder && !bCustomizeMode)
	{
		if (m_nStyle & (TBBS_PRESSED | TBBS_CHECKED))
		{
			//-----------------------
			// Pressed in or checked:
			//-----------------------
			CBCGPVisualManager::GetInstance ()->OnDrawButtonBorder (
				pDC, this, rect, CBCGPVisualManager::ButtonsIsPressed);
		}
		else if (bHighlight &&
			!(m_nStyle & (TBBS_CHECKED | TBBS_INDETERMINATE)))
		{
			CBCGPVisualManager::GetInstance ()->OnDrawButtonBorder (
				pDC, this, rect, CBCGPVisualManager::ButtonsIsHighlighted);
		}
	}

	CRect rectFrame = rect;
	rectFrame.DeflateRect (afxData.cxBorder2, afxData.cyBorder2);

	if (m_bIsOther || m_bIsAutomatic || m_bIsLabel)
	{
		CRect rectText = rect;

		if (m_bIsAutomatic && m_Color != (COLORREF)-1)
		{
			CRect rectColor = rectFrame;
			rectColor.DeflateRect (afxData.cxBorder2 + 1, afxData.cyBorder2 + 1);
			rectColor.right = rectColor.left + rectColor.Height ();

			if (!bDisabled)
			{
				CBrush br (PALETTERGB(GetRValue (m_Color),
									GetGValue(m_Color), 
									GetBValue(m_Color)));
				CPen pen (PS_SOLID, 1, globalData.clrBarShadow);

				CBrush* pOldBrush = pDC->SelectObject (&br);
				CPen* pOldPen = pDC->SelectObject (&pen);
		
				pDC->Rectangle (rectColor);

				pDC->SelectObject (pOldPen);
				pDC->SelectObject (pOldBrush);
			}
			else
			{
				pDC->Draw3dRect (rectColor, globalData.clrBarHilite,
											globalData.clrBarShadow);
				rectColor.OffsetRect (1, 1);
				pDC->Draw3dRect (rectColor, globalData.clrBarShadow,
											globalData.clrBarHilite);
			}


			rectText.left = rectColor.right + afxData.cxBorder2;
		}

		//------------
		// Draw label:
		//------------
		pDC->SetTextColor ((m_nStyle & TBBS_DISABLED) && !m_bIsLabel ? 
			globalData.clrGrayedText :
			globalData.clrBarText);

		UINT nFormat = DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS;
		if (!m_bIsLabel)
		{
			nFormat |= DT_CENTER;
		}

		CFont* pCurrFont = NULL;
		if (!bHorz)
		{
			pCurrFont = pDC->SelectObject (&globalData.fontRegular);
			ASSERT (pCurrFont != NULL);
		}

		pDC->DrawText (m_strText, &rectText, nFormat);

		if (pCurrFont != NULL)
		{
			pDC->SelectObject (pCurrFont);
		}
	}
	else if (!bDisabled)
	{
		//----------------
		// Draw color box:
		//----------------
		CBrush br (PALETTERGB(GetRValue(m_Color),
                            GetGValue(m_Color), 
                            GetBValue(m_Color)));

		CBrush* pOldBrush = pDC->SelectObject(&br);
		CPen* pOldPen = (CPen*) pDC->SelectStockObject (NULL_PEN);
		
		pDC->Rectangle (rectFrame);

		pDC->SelectObject (pOldPen);
		pDC->SelectObject (pOldBrush);
	}

	//------------
	// Draw frame:
	//------------
	if (!m_bIsOther && !m_bIsLabel)
	{
		if (!bDisabled)
		{
			pDC->Draw3dRect (rectFrame, globalData.clrBarShadow,
										globalData.clrBarShadow);
		}
		else
		{
			pDC->Draw3dRect (rectFrame, globalData.clrBarHilite,
										globalData.clrBarShadow);
			rectFrame.OffsetRect (1, 1);
			pDC->Draw3dRect (rectFrame, globalData.clrBarShadow,
										globalData.clrBarHilite);
		}
	}

    if (pOldPalette != NULL)
	{
        pDC->SelectPalette (pOldPalette, FALSE);
	}

	m_nStyle = nStyle;
}

/////////////////////////////////////////////////////////////////////////////
// CBCGPColorBar

IMPLEMENT_SERIAL(CBCGPColorBar, CBCGPPopupMenuBar, 1)

CMap<COLORREF,COLORREF,CString, LPCTSTR> CBCGPColorBar::m_ColorNames;

CBCGPColorBar::CBCGPColorBar()
{
    m_nNumColumns = 0;
	m_nNumRowsHorz = 0;
	m_nNumColumnsVert = 0;
	m_BoxSize = CSize (0, 0);
	m_nRowHeight = 0;
	m_ColorSelected = (COLORREF) -1;
	m_ColorAutomatic = (COLORREF) -1;
	m_nCommandID = 0;
	m_bStdColorDlg = FALSE;
	m_bIsTearOff = TRUE;
	m_bShowDocColorsWhenDocked = FALSE;
	m_bLocked = TRUE;
	m_bIsEnabled = TRUE;
	m_pParentBtn = NULL;
	m_pWndPropList = NULL;
	m_nHorzOffset = m_nVertOffset = 0;
	m_bInternal = FALSE;
	m_nVertMargin = 4;
	m_nHorzMargin = 4;
}
//**************************************************************************************
CBCGPColorBar::CBCGPColorBar (const CArray<COLORREF, COLORREF>& colors,
				COLORREF color, 
				LPCTSTR lpszAutoColor,
				LPCTSTR lpszOtherColor,
				LPCTSTR lpszDocColors,
				CList<COLORREF,COLORREF>& lstDocColors,
				int nColumns,
				int	nRowsDockHorz,
				int	nColDockVert,
				COLORREF colorAutomatic,
				UINT nCommandID,
				CBCGPColorButton* pParentBtn) :
	m_ColorSelected (color),
	m_strAutoColor (lpszAutoColor = NULL ? _T("") : lpszAutoColor),
	m_strOtherColor (lpszOtherColor == NULL ? _T("") : lpszOtherColor),
	m_strDocColors (lpszDocColors == NULL ? _T("") : lpszDocColors),
	m_nNumColumns (nColumns),
	m_nNumRowsHorz (nRowsDockHorz),
	m_nNumColumnsVert (nColDockVert),
	m_ColorAutomatic (colorAutomatic),
	m_bIsTearOff (FALSE),
	m_bStdColorDlg (FALSE),
	m_nCommandID (nCommandID),
	m_pParentBtn (pParentBtn)
{
	m_pWndPropList = NULL;

	m_colors.SetSize (colors.GetSize ());

	for (int i = 0; i < colors.GetSize (); i++)
	{
		m_colors [i] = colors [i];
	}

	m_lstDocColors.AddTail (&lstDocColors);
	m_bLocked = TRUE;
	m_bIsEnabled = TRUE;
	m_bShowDocColorsWhenDocked = TRUE;

	if (m_pParentBtn != NULL)
	{
		m_bStdColorDlg = !m_pParentBtn->m_bAltColorDlg;
	}

	m_nHorzOffset = m_nVertOffset = 0;
	m_bInternal = FALSE;
	m_nVertMargin = 4;
	m_nHorzMargin = 4;
}
//**************************************************************************************
CBCGPColorBar::CBCGPColorBar (CBCGPColorBar& src, UINT uiCommandID) :
		m_ColorSelected (src.m_ColorSelected),
		m_strAutoColor (src.m_strAutoColor),
		m_strOtherColor (src.m_strOtherColor),
		m_strDocColors (src.m_strDocColors),
		m_ColorAutomatic (src.m_ColorAutomatic),
		m_nNumColumns (src.m_nNumColumns),
		m_nNumRowsHorz (src.m_nNumRowsHorz),
		m_nNumColumnsVert (src.m_nNumColumnsVert),
		m_bIsTearOff (TRUE),
		m_nCommandID (uiCommandID),
		m_bStdColorDlg (src.m_bStdColorDlg)
{
	m_colors.SetSize (src.m_colors.GetSize ());

	for (int i = 0; i < src.m_colors.GetSize (); i++)
	{
		m_colors [i] = src.m_colors [i];
	}

	m_lstDocColors.AddTail (&src.m_lstDocColors);
	m_bLocked = TRUE;
	m_bIsEnabled = TRUE;
	m_bShowDocColorsWhenDocked = FALSE;
	m_pParentBtn = NULL;
	m_pWndPropList = NULL;
	m_nHorzOffset = m_nVertOffset = 0;
	m_bInternal = FALSE;
	m_nVertMargin = 4;
	m_nHorzMargin = 4;
}
//**************************************************************************************
CBCGPColorBar::~CBCGPColorBar()
{
}
//*************************************************************************************
void CBCGPColorBar::AdjustLocations ()
{
	if (GetSafeHwnd () == NULL || !::IsWindow (m_hWnd))
	{
		return;
	}

	ASSERT_VALID(this);

	CRect rectClient;	// Client area rectangle
	GetClientRect (&rectClient);

	rectClient.DeflateRect (m_nHorzMargin + m_nHorzOffset, m_nVertMargin + m_nVertOffset);

	int x = rectClient.left;
	int y = rectClient.top;
	int i = 0;

	BOOL bPrevSeparator = FALSE;
	BOOL bIsOtherColor =	(m_strAutoColor.IsEmpty () || 
							m_ColorSelected != (COLORREF)-1);

	for (POSITION pos = m_Buttons.GetHeadPosition (); pos != NULL; i ++)
	{
		CRect rectButton (0, 0, 0, 0);

		CBCGPToolbarButton* pButton = (CBCGPToolbarButton*) m_Buttons.GetNext (pos);
		if (pButton->m_nStyle & TBBS_SEPARATOR)
		{
			if (bPrevSeparator)
			{
				rectButton.SetRectEmpty ();
			}
			else
			{
				if (x > rectClient.left)
				{
					// Next line
					x = rectClient.left;
					y += m_BoxSize.cy + m_nVertMargin;
				}

				rectButton = CRect (
					CPoint (x, y),
					CSize (rectClient.Width (), SEPARATOR_SIZE));

				y += SEPARATOR_SIZE + 2;
				x = rectClient.left;
			}

			bPrevSeparator = TRUE;
		}
		else
		{
			CColorButton* pColorButton = DYNAMIC_DOWNCAST (CColorButton, pButton);
			if (pColorButton == NULL)
			{
				continue;
			}

			ASSERT_VALID (pColorButton);

			if (pColorButton->m_bIsDocument &&
				!m_bShowDocColorsWhenDocked && !IsFloating ())
			{
				rectButton.SetRectEmpty ();
			}
			else if (pColorButton->m_bIsAutomatic || pColorButton->m_bIsOther ||
				pColorButton->m_bIsLabel)
			{
				if (x > rectClient.left)
				{
					// Next line
					x = rectClient.left;
					y += m_BoxSize.cy + m_nVertMargin;
				}

				if (pColorButton->m_bIsOther && bIsOtherColor)
				{
					rectButton = CRect (
						CPoint (x, y),
						CSize (rectClient.Width () - m_BoxSize.cx, 
								m_nRowHeight - m_nVertMargin / 2));
					x = rectButton.right;
					y += (rectButton.Height () - m_BoxSize.cy) / 2;
				}
				else
				{
					rectButton = CRect (
						CPoint (x, y),
						CSize (rectClient.Width (), m_nRowHeight - m_nVertMargin / 2));
					y += m_nRowHeight - m_nVertMargin / 2;
					x = rectClient.left;
				}

				if (pColorButton->m_bIsOther)
				{
					rectButton.DeflateRect (m_nHorzMargin / 2, m_nVertMargin / 2);
				}

				bPrevSeparator = FALSE;
			}
			else
			{
				if (x + m_BoxSize.cx > rectClient.right)
				{
					x = rectClient.left;
					y += m_BoxSize.cy;
				}

				if (pColorButton->m_bIsOtherColor && !bIsOtherColor)
				{
					rectButton.SetRectEmpty ();
				}
				else
				{
					rectButton = CRect (CPoint (x, y), m_BoxSize);
					x += m_BoxSize.cx;

					bPrevSeparator = FALSE;
				}

				if (pColorButton->m_Color == m_ColorSelected &&
					!pColorButton->m_bIsOtherColor)
				{
					bIsOtherColor = FALSE;
				}
			}
		}

		pButton->SetRect (rectButton);
	}

	UpdateTooltips ();
}
//***************************************************************************************
CSize CBCGPColorBar::CalcSize (BOOL bVertDock)
{
	CSize sizeGrid = GetColorGridSize (bVertDock);

	return CSize(
		sizeGrid.cx * m_BoxSize.cx + 2 * m_nVertMargin, 
		sizeGrid.cy * m_BoxSize.cy + GetExtraHeight (sizeGrid.cx) + 2 * m_nHorzMargin);
}
//*************************************************************************************
CSize CBCGPColorBar::GetColorGridSize (BOOL bVertDock) const
//
// Calculate number of columns and rows in the color grid
//
{
	int nNumColumns = 0;
	int nNumRows = 0;

⌨️ 快捷键说明

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