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

📄 bcgpcolorbutton.cpp

📁 远程网络监视程序的源码
💻 CPP
字号:
// BCGColorButton.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 "BCGCBPro.h"
#include "BCGPColorButton.h"
#include "BCGPColorBar.h"
#include "ColorPopup.h"
#include "MenuImages.h"
#include "BCGPWinXPVisualManager.h"
#include "BCGPToolbarComboBoxButton.h"

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

static const int nImageHorzMargin = 8;

/////////////////////////////////////////////////////////////////////////////
// CBCGPColorButton

IMPLEMENT_DYNAMIC(CBCGPColorButton, CBCGPButton)

CBCGPColorButton::CBCGPColorButton()
{
	m_Color = RGB (0, 0, 0);
	m_ColorAutomatic = (COLORREF)-1;
	m_nColumns = -1;
	m_pPopup = NULL;
	m_bAltColorDlg = TRUE;
	m_pPalette = NULL;
	m_bEnabledInCustomizeMode = FALSE;
	m_bAutoSetFocus = TRUE;
}

CBCGPColorButton::~CBCGPColorButton()
{
	if (m_pPalette != NULL)
	{
		delete m_pPalette;
	}
}


BEGIN_MESSAGE_MAP(CBCGPColorButton, CBCGPButton)
	//{{AFX_MSG_MAP(CBCGPColorButton)
	ON_WM_KEYDOWN()
	ON_WM_LBUTTONDOWN()
	ON_WM_GETDLGCODE()
	ON_WM_SYSCOLORCHANGE()
	ON_WM_MOUSEMOVE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBCGPColorButton message handlers

CSize CBCGPColorButton::SizeToContent (BOOL bCalcOnly)
{
	CSize size = CBCGPButton::SizeToContent (FALSE);
	size.cx += CMenuImages::Size ().cx;

	if (!bCalcOnly)
	{
		SetWindowPos (NULL, -1, -1, size.cx, size.cy,
			SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
	}

	return size;
}
//*****************************************************************************************
void CBCGPColorButton::OnFillBackground (CDC* pDC, const CRect& rectClient)
{
	if (!IsDrawXPTheme ())
	{
		CBCGPButton::OnFillBackground (pDC, rectClient);
		return;
	}

	ASSERT_VALID (pDC);
	pDC->FillRect (rectClient, &globalData.brWindow);
}
//*****************************************************************************************
void CBCGPColorButton::OnDraw (CDC* pDC, const CRect& rect, UINT uiState)
{
	ASSERT_VALID (pDC);

	if (m_pPalette == NULL)
	{
		RebuildPalette (NULL);
	}

	CPalette* pCurPalette = pDC->SelectPalette (m_pPalette, FALSE);
	pDC->RealizePalette();

	CSize sizeArrow = CMenuImages::Size ();

	CRect rectColor = rect;
	rectColor.right -= sizeArrow.cx + nImageHorzMargin;

	CRect rectArrow = rect;
	rectArrow.left = rectColor.right;

	COLORREF color = m_Color;
	if (color == (COLORREF) -1)	// Automatic
	{
		//---------------------------
		// Draw automatic text label:
		//---------------------------
		color = m_ColorAutomatic;
		
		if (!m_strAutoColorText.IsEmpty ())
		{
			rectColor.right = rectColor.left + rectColor.Height ();

			CRect rectText = rect;
			rectText.left = rectColor.right;
			rectText.right = rectArrow.left;

			CFont* pOldFont = SelectFont (pDC);
			ASSERT(pOldFont != NULL);

			pDC->SetBkMode (TRANSPARENT);
			pDC->SetTextColor (globalData.clrBtnText);

			pDC->DrawText (m_strAutoColorText, rectText,
							DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS);

			pDC->SelectObject (pOldFont);
		}
	}

	//----------------
	// Draw color box:
	//----------------
	rectColor.DeflateRect (2, 2);
	pDC->Draw3dRect (rectColor, globalData.clrBtnHilite, globalData.clrBtnHilite);
	rectColor.DeflateRect (1, 1);
	pDC->Draw3dRect (rectColor, globalData.clrBtnDkShadow, globalData.clrBtnDkShadow);
	rectColor.DeflateRect (1, 1);

	if (color != (COLORREF)-1 && (uiState & ODS_DISABLED) == 0)
	{
		if (globalData.m_nBitsPerPixel == 8) // 256 colors
		{
			ASSERT_VALID (m_pPalette);
			color =  PALETTEINDEX (m_pPalette->GetNearestPaletteIndex (color));
		}

		CBrush br (color);
		pDC->FillRect (rectColor, &br);
	}

	//----------------------
	// Draw drop-down arrow:
	//----------------------
	if (IsDrawXPTheme ())
	{
		CBCGPToolbarComboBoxButton buttonDummy;
		rectArrow.DeflateRect (2, 2);
		CBCGPVisualManager::GetInstance ()->OnDrawComboDropButton (pDC, rectArrow,
											(uiState & ODS_DISABLED),
											m_bPushed,
											m_bHighlighted,
											&buttonDummy);
	}
	else
	{
		pDC->FillRect (rectArrow, &globalData.brBtnFace);

		CPoint pointImage (
			rectArrow.left + (rectArrow.Width () - sizeArrow.cx) / 2,
			rectArrow.top + (rectArrow.Height () - sizeArrow.cy) / 2);

		CMenuImages::Draw (pDC, CMenuImages::IdArowDownLarge, pointImage,
			(uiState & ODS_DISABLED) ? CMenuImages::ImageGray : CMenuImages::ImageBlack);

		pDC->Draw3dRect (rectArrow, globalData.clrBtnLight, globalData.clrBtnDkShadow);
		rectArrow.DeflateRect (1, 1);
		pDC->Draw3dRect (rectArrow, globalData.clrBtnHilite, globalData.clrBtnShadow);
	}

	if (pCurPalette != NULL)
	{
		pDC->SelectPalette (pCurPalette, FALSE);
	}
}
//*****************************************************************************************
void CBCGPColorButton::OnDrawBorder (CDC* pDC, CRect& rectClient, UINT /*uiState*/)
{
	ASSERT_VALID (pDC);
	ASSERT (m_nFlatStyle != BUTTONSTYLE_NOBORDERS);	// Always has borders

	if (IsDrawXPTheme ())
	{
		CBCGPToolbarComboBoxButton buttonDummy;
		CBCGPVisualManager::GetInstance ()->OnDrawComboBorder (pDC, rectClient,
											!IsWindowEnabled (),
											FALSE,
											TRUE,
											&buttonDummy);
	}
	else
	{
		pDC->Draw3dRect (rectClient,
					globalData.clrBtnDkShadow, globalData.clrBtnHilite);

		rectClient.DeflateRect (1, 1);

		if (m_nFlatStyle == BUTTONSTYLE_3D || m_bHighlighted)
		{
			pDC->Draw3dRect (rectClient,
						globalData.clrBtnShadow, globalData.clrBtnLight);
		}
	}
}
//*****************************************************************************************
void CBCGPColorButton::OnDrawFocusRect (CDC* pDC, const CRect& rectClient)
{
	CSize sizeArrow = CMenuImages::Size ();

	CRect rectColor = rectClient;
	rectColor.right -= sizeArrow.cx + nImageHorzMargin;

	CBCGPButton::OnDrawFocusRect (pDC, rectColor);
}
//*****************************************************************************************
void CBCGPColorButton::OnShowColorPopup () 
{
	if (m_pPopup != NULL)
	{
		m_pPopup->SendMessage (WM_CLOSE);
		m_pPopup = NULL;
		return;
	}

	if (m_Colors.GetSize () == 0)
	{
		// Use default pallete:
		CBCGPColorBar::InitColors (NULL, m_Colors);
	}

	m_pPopup = new CColorPopup (this, m_Colors, m_Color,
		m_strAutoColorText, m_strOtherText, m_strDocColorsText, m_lstDocColors,
		m_nColumns, m_ColorAutomatic);
	m_pPopup->m_bEnabledInCustomizeMode = m_bEnabledInCustomizeMode;

	CRect rectWindow;
	GetWindowRect (rectWindow);

	if (!m_pPopup->Create (this, rectWindow.left, rectWindow.bottom, NULL,
		m_bEnabledInCustomizeMode))
	{
		ASSERT (FALSE);
		m_pPopup = NULL;

		TRACE(_T ("Color menu can't be used in the customization mode. You need to set CBCGPColorButton::m_bEnabledInCustomizeMode\n"));
	}
	else
	{
		if (m_bEnabledInCustomizeMode)
		{
			CBCGPColorBar* pColorBar = DYNAMIC_DOWNCAST (
				CBCGPColorBar, m_pPopup->GetMenuBar());

			if (pColorBar != NULL)
			{
				ASSERT_VALID (pColorBar);
				pColorBar->m_bInternal = TRUE;
			}
		}

		if (m_bAutoSetFocus)
		{
			m_pPopup->GetMenuBar()->SetFocus ();
		}
	}

	if (m_bCaptured)
	{
		ReleaseCapture ();
		m_bCaptured = FALSE;
	}
}
//*****************************************************************************************
void CBCGPColorButton::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	if (nChar == VK_SPACE || nChar == VK_DOWN)
	{
		OnShowColorPopup ();
		return;
	}
	
	CButton::OnKeyDown(nChar, nRepCnt, nFlags);
}
//*****************************************************************************************
void CBCGPColorButton::OnLButtonDown(UINT /*nFlags*/, CPoint /*point*/) 
{
	SetFocus ();
	OnShowColorPopup ();
}
//****************************************************************************************
void CBCGPColorButton::OnMouseMove(UINT nFlags, CPoint point) 
{
	FlatStyle nFlatStyle = m_nFlatStyle;
	if (IsDrawXPTheme ())
	{
		m_nFlatStyle = BUTTONSTYLE_SEMIFLAT;
	}

	CBCGPButton::OnMouseMove(nFlags, point);
	m_nFlatStyle = nFlatStyle;
}
//*****************************************************************************************
UINT CBCGPColorButton::OnGetDlgCode() 
{
	return DLGC_WANTARROWS;
}
//*****************************************************************************************
void CBCGPColorButton::EnableAutomaticButton (LPCTSTR lpszLabel, COLORREF colorAutomatic, BOOL bEnable)
{
	m_strAutoColorText = (bEnable && lpszLabel == NULL) ? _T("") : lpszLabel;
	m_ColorAutomatic = colorAutomatic;
}
//*****************************************************************************************
void CBCGPColorButton::EnableOtherButton (LPCTSTR lpszLabel, BOOL bAltColorDlg, BOOL bEnable)
{
	m_strOtherText = (bEnable && lpszLabel == NULL) ? _T("") : lpszLabel;
	m_bAltColorDlg = bAltColorDlg;
}
//*****************************************************************************************
void CBCGPColorButton::SetDocumentColors (LPCTSTR lpszLabel, CList<COLORREF,COLORREF>& lstColors)
{
	m_lstDocColors.RemoveAll ();
	m_strDocColorsText = (lpszLabel == NULL) ? _T("") : lpszLabel;

	if (!m_strDocColorsText.IsEmpty ())
	{
		m_lstDocColors.AddTail (&lstColors);
	}
}
//*****************************************************************************************
void CBCGPColorButton::SetPalette (CPalette* pPalette)
{
	if (m_Colors.GetSize () != 0)
	{
		m_Colors.SetSize (0);
		m_Colors.FreeExtra ();
	}

	CBCGPColorBar::InitColors (pPalette, m_Colors);
	RebuildPalette (pPalette);
}
//*****************************************************************************************
void CBCGPColorButton::SetColor (COLORREF color /* -1 - automatic*/)
{
	m_Color = color;

	if (GetSafeHwnd () != NULL)
	{
		Invalidate ();
		UpdateWindow ();
	}
}
//*****************************************************************************************
void CBCGPColorButton::UpdateColor (COLORREF color)
{
	SetColor (color);

		//-------------------------------------------------------
	// Trigger mouse up event (to button click notification):
	//-------------------------------------------------------
	CWnd* pParent = GetParent ();
	if (pParent != NULL)
	{
		pParent->SendMessage (	WM_COMMAND,
								MAKEWPARAM (GetDlgCtrlID (), BN_CLICKED),
								(LPARAM) m_hWnd);
	}
}
//****************************************************************************************
void CBCGPColorButton::RebuildPalette (CPalette* pPal)
{
	if (m_pPalette != NULL)
	{
		delete m_pPalette;
	}

	m_pPalette = new CPalette ();

	// Create palette:
	CClientDC dc (this);

	if (pPal == NULL)
	{
		int nColors = 256;	// Use 256 first entries
		UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
		LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];

		::GetSystemPaletteEntries (dc.GetSafeHdc (), 0, nColors, pLP->palPalEntry);

		pLP->palVersion = 0x300;
		pLP->palNumEntries = (USHORT) nColors;

		m_pPalette->CreatePalette (pLP);

		delete[] pLP;
	}
	else
	{
		ASSERT_VALID (pPal);
		int nColors = pPal->GetEntryCount ();
		UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
		LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];

		pPal->GetPaletteEntries (0, nColors, pLP->palPalEntry);

		pLP->palVersion = 0x300;
		pLP->palNumEntries = (USHORT) nColors;

		m_pPalette->CreatePalette (pLP);

		delete[] pLP;
	}
}
//*****************************************************************************************
void CBCGPColorButton::OnSysColorChange() 
{
	CBCGPButton::OnSysColorChange();
	RebuildPalette (NULL);

	Invalidate ();
	UpdateWindow ();
}
//*****************************************************************************************
BOOL CBCGPColorButton::IsDrawXPTheme () const
{
	return	m_bWinXPTheme &&
			DYNAMIC_DOWNCAST (CBCGPWinXPVisualManager, CBCGPVisualManager::GetInstance ()) != NULL &&
			CBCGPWinXPVisualManager::IsWinXPThemeAvailible ();
}

#endif // BCG_NO_COLOR

⌨️ 快捷键说明

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