www.pudn.com > ÍøÂç¶Ë¿Ú¼àÊÓ.rar > BCGPColorBar.cpp


// 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  
#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 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& colors, 
				COLORREF color,  
				LPCTSTR lpszAutoColor, 
				LPCTSTR lpszOtherColor, 
				LPCTSTR lpszDocColors, 
				CList& 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; 
 
	int nColors = m_colors.GetSize (); 
 
	if (!m_bIsTearOff || IsFloating () || bVertDock || m_nNumRowsHorz <= 0) 
	{ 
		nNumColumns = !m_bIsTearOff || IsFloating () || m_nNumColumnsVert <= 0 ? 
			m_nNumColumns : m_nNumColumnsVert; 
 
		if (nNumColumns <= 0) 
		{ 
			nNumColumns = (int) (sqrt ((double) nColors)) + 1; 
		} 
 
		nNumRows = nColors / nNumColumns; 
		if ((nColors % nNumColumns) != 0) 
		{ 
			nNumRows ++; 
		} 
	} 
	else	// Horz dock 
	{ 
		nNumRows = m_nNumRowsHorz; 
		nNumColumns = nColors / nNumRows; 
 
		if ((nColors % nNumRows) != 0) 
		{ 
			nNumColumns ++; 
		} 
	} 
 
	return CSize (nNumColumns, nNumRows); 
} 
//************************************************************************************** 
int CBCGPColorBar::GetExtraHeight (int nNumColumns) const 
// 
// Calculate additional height required by the misc. elements such 
// as "Other" button, document colors, e.t.c 
// 
{ 
	int nExtraHeight = 0; 
 
	if (!m_strAutoColor.IsEmpty ()) 
	{ 
		nExtraHeight += m_nRowHeight; 
	} 
	else if (!m_strOtherColor.IsEmpty ()) 
	{ 
		nExtraHeight += m_nVertMargin; 
	} 
 
	if (!m_strOtherColor.IsEmpty ()) 
	{ 
		nExtraHeight += m_nRowHeight; 
	} 
 
	if (!m_strDocColors.IsEmpty () && !m_lstDocColors.IsEmpty () && 
		(m_bShowDocColorsWhenDocked || IsFloating ())) 
	{ 
		int nDocColorRows = m_lstDocColors.GetCount () / nNumColumns; 
		if ((m_lstDocColors.GetCount () % nNumColumns) != 0) 
		{ 
			nDocColorRows++; 
		} 
 
		nExtraHeight += m_nRowHeight + nDocColorRows * m_BoxSize.cy + 2 * SEPARATOR_SIZE + m_nVertMargin; 
	} 
 
	return nExtraHeight; 
} 
 
BEGIN_MESSAGE_MAP(CBCGPColorBar, CBCGPPopupMenuBar) 
	//{{AFX_MSG_MAP(CBCGPColorBar) 
	ON_WM_CREATE() 
	ON_WM_QUERYNEWPALETTE() 
	ON_WM_PALETTECHANGED() 
	ON_WM_NCCALCSIZE() 
	ON_WM_NCPAINT() 
	ON_WM_MOUSEMOVE() 
	ON_WM_LBUTTONDOWN() 
	ON_WM_LBUTTONUP() 
	ON_WM_LBUTTONDBLCLK() 
	ON_WM_DESTROY() 
	//}}AFX_MSG_MAP 
	ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CBCGPColorBar message handlers 
 
void CBCGPColorBar::SetDocumentColors (LPCTSTR lpszCaption, 
						CList& lstDocColors, 
						BOOL bShowWhenDocked) 
{ 
	m_strDocColors = lpszCaption == NULL ? _T("") : lpszCaption; 
 
	if (m_lstDocColors.GetCount () == lstDocColors.GetCount ()) 
	{ 
		BOOL bChanged = FALSE; 
 
		POSITION posCur = m_lstDocColors.GetHeadPosition (); 
		POSITION posNew = lstDocColors.GetHeadPosition (); 
 
		while (posCur != NULL && posNew != NULL) 
		{ 
			if (m_lstDocColors.GetNext (posCur) != 
				lstDocColors.GetNext (posNew)) 
			{ 
				bChanged = TRUE; 
				break; 
			} 
		} 
 
		if (!bChanged) 
		{ 
			return; 
		} 
	} 
 
	m_lstDocColors.RemoveAll (); 
	m_lstDocColors.AddTail (&lstDocColors); 
 
	m_bShowDocColorsWhenDocked = bShowWhenDocked; 
 
	Rebuild (); 
	AdjustLayout (); 
} 
//************************************************************************************** 
void CBCGPColorBar::ContextToSize (BOOL bSquareButtons, BOOL bCenterButtons) 
{ 
	ASSERT (GetSafeHwnd () != NULL); 
 
	CRect rectClient; 
	GetClientRect (rectClient); 
 
	// First, adjust height: 
	int nCurrHeight = CalcSize (TRUE).cy; 
	int yDelta = nCurrHeight < rectClient.Height () ? 1 : -1; 
 
	while ((nCurrHeight = CalcSize (TRUE).cy) != rectClient.Height ()) 
	{ 
		if (yDelta < 0) 
		{ 
			if (nCurrHeight < rectClient.Height ()) 
			{ 
				break; 
			} 
		} 
		else if (nCurrHeight > rectClient.Height ()) 
		{ 
			m_BoxSize.cy -= yDelta; 
			m_nRowHeight = m_BoxSize.cy * 3 / 2; 
			break; 
		} 
 
		m_BoxSize.cy += yDelta; 
		m_nRowHeight = m_BoxSize.cy * 3 / 2; 
	} 
 
	// Now, adjust width: 
	int nCurrWidth = CalcSize (TRUE).cx; 
	int xDelta = nCurrWidth < rectClient.Width () ? 1 : -1; 
 
	while ((nCurrWidth = CalcSize (TRUE).cx) != rectClient.Width ()) 
	{ 
		if (xDelta < 0) 
		{ 
			if (nCurrWidth < rectClient.Width ()) 
			{ 
				break; 
			} 
		} 
		else if (nCurrWidth > rectClient.Width ()) 
		{ 
			m_BoxSize.cy -= xDelta; 
			break; 
		} 
 
		m_BoxSize.cx += xDelta; 
	} 
 
	m_BoxSize.cx--; 
	m_BoxSize.cy--; 
 
	if (bSquareButtons) 
	{ 
		m_BoxSize.cx = m_BoxSize.cy = min (m_BoxSize.cx, m_BoxSize.cy); 
		m_nRowHeight = m_BoxSize.cy * 3 / 2; 
	} 
 
	if (bCenterButtons) 
	{ 
		// Finaly, calculate offset to center buttons area: 
		CSize size = CalcSize (TRUE); 
 
		m_nHorzOffset = (rectClient.Width () - size.cx) / 2; 
		m_nVertOffset = (rectClient.Height () - size.cy) / 2; 
	} 
	else 
	{ 
		m_nHorzOffset = m_nVertOffset = 0; 
	} 
 
	AdjustLocations (); 
} 
//************************************************************************************** 
void CBCGPColorBar::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp)  
{ 
	if (m_bIsTearOff) 
	{ 
		CBCGPToolBar::OnNcCalcSize(bCalcValidRects, lpncsp); 
	} 
	else 
	{ 
		CBCGPPopupMenuBar::OnNcCalcSize(bCalcValidRects, lpncsp); 
	} 
} 
//************************************************************************************** 
void CBCGPColorBar::OnNcPaint()  
{ 
	if (m_bIsTearOff) 
	{ 
		CBCGPToolBar::OnNcPaint(); 
	} 
	else 
	{ 
		CBCGPPopupMenuBar::OnNcPaint(); 
	} 
} 
//************************************************************************************** 
int CBCGPColorBar::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	if (CBCGPPopupMenuBar::OnCreate(lpCreateStruct) == -1) 
		return -1; 
 
	m_BoxSize = GetMenuImageSize (); 
	m_BoxSize.cx ++; 
	m_BoxSize.cy ++; 
 
	m_bLeaveFocus = FALSE; 
	m_nRowHeight = m_BoxSize.cy * 3 / 2; 
	Rebuild (); 
 
	if (m_pParentBtn != NULL) 
	{ 
		SetCapture (); 
		m_pParentBtn->m_bCaptured = FALSE; 
	} 
	else if (m_pWndPropList != NULL) 
	{ 
		SetCapture (); 
	} 
 
	return 0; 
} 
//************************************************************************************* 
void CBCGPColorBar::Rebuild () 
{ 
	if (GetSafeHwnd () == NULL) 
	{ 
		return; 
	} 
 
	RemoveAllButtons (); 
 
	BOOL bAlreadySelected = FALSE; 
	if (!m_strAutoColor.IsEmpty ())	// Automatic 
	{ 
		InsertButton ( 
			new CColorButton (m_ColorAutomatic, 
				TRUE, FALSE, m_strAutoColor, 
				m_ColorSelected == (COLORREF) -1)); 
 
		if (!bAlreadySelected) 
		{ 
			bAlreadySelected = (m_ColorSelected == (COLORREF) -1); 
		} 
	} 
	 
	for (int i = 0; i < m_colors.GetSize (); i ++) 
	{ 
		InsertButton ( 
			new CColorButton (m_colors [i], FALSE, FALSE, NULL, m_ColorSelected == m_colors [i])); 
 
		if (!bAlreadySelected) 
		{ 
			bAlreadySelected = (m_ColorSelected == m_colors [i]); 
		} 
	} 
	 
	if (!m_strDocColors.IsEmpty () && !m_lstDocColors.IsEmpty ()) 
	{ 
		InsertSeparator (); 
		InsertButton (new CColorButton (m_strDocColors, TRUE));	// Label 
 
		for (POSITION pos = m_lstDocColors.GetHeadPosition (); pos != NULL;) 
		{ 
			COLORREF color = m_lstDocColors.GetNext (pos); 
 
			InsertButton ( 
				new CColorButton (color, 
					FALSE, FALSE, NULL, 
					!bAlreadySelected && m_ColorSelected == color, 
					TRUE)); 
		} 
	} 
 
	if (!m_strOtherColor.IsEmpty ())	// Other color button 
	{ 
		InsertSeparator (); 
		InsertButton ( 
			new CColorButton ((COLORREF) -1,FALSE, TRUE, m_strOtherColor)); 
		InsertButton ( 
			new CColorButton (m_ColorSelected, 
				FALSE, FALSE, NULL, 
				!bAlreadySelected, 
				FALSE, TRUE)); 
	} 
} 
 
class CBCGPColorCCmdUI : public CCmdUI 
{ 
public: 
	CBCGPColorCCmdUI(); 
 
public: // re-implementations only 
	virtual void Enable(BOOL bOn); 
	BOOL m_bEnabled; 
}; 
 
CBCGPColorCCmdUI::CBCGPColorCCmdUI() 
{ 
	m_bEnabled = TRUE;  // assume it is enabled 
} 
//************************************************************************************* 
void CBCGPColorCCmdUI::Enable(BOOL bOn) 
{ 
	m_bEnabled = bOn; 
	m_bEnableChanged = TRUE; 
} 
//************************************************************************************* 
void CBCGPColorBar::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler) 
{ 
	ASSERT_VALID (this); 
 
	if (m_nCommandID == 0 || m_nCommandID == (UINT)-1) 
	{ 
		CBCGPPopupMenuBar::OnUpdateCmdUI (pTarget, bDisableIfNoHndler); 
		return; 
	} 
 
	CBCGPColorCCmdUI state; 
	state.m_pOther = this; 
	state.m_nIndexMax = 1; 
	state.m_nID = m_nCommandID; 
 
	BOOL bIsEnabled = FALSE; 
	if (pTarget->OnCmdMsg (m_nCommandID, CN_UPDATE_COMMAND_UI, &state, NULL)) 
	{ 
		bIsEnabled = state.m_bEnabled; 
	} 
	else if (bDisableIfNoHndler && !state.m_bEnableChanged) 
	{ 
		AFX_CMDHANDLERINFO info; 
		info.pTarget = NULL; 
 
		bIsEnabled = pTarget->OnCmdMsg (m_nCommandID, CN_COMMAND, &state, &info); 
	} 
 
	if (bIsEnabled != m_bIsEnabled) 
	{ 
		m_bIsEnabled = bIsEnabled; 
 
		for (POSITION pos = m_Buttons.GetHeadPosition (); pos != NULL;) 
		{ 
			CColorButton* pColorButton = DYNAMIC_DOWNCAST (CColorButton, m_Buttons.GetNext (pos)); 
			if (pColorButton != NULL) 
			{ 
				pColorButton->m_nStyle &= ~TBBS_DISABLED; 
				if (!bIsEnabled) 
				{ 
					pColorButton->m_nStyle |= TBBS_DISABLED; 
				} 
			} 
		} 
 
		Invalidate (); 
		UpdateWindow (); 
	} 
 
	CBCGPPopupMenuBar::OnUpdateCmdUI (pTarget, bDisableIfNoHndler); 
} 
//************************************************************************************* 
void CBCGPColorBar::DoPaint (CDC* pDC) 
{ 
    CPalette* pOldPalette = SelectPalette (pDC); 
 
	CBCGPPopupMenuBar::DoPaint (pDC); 
 
    if (pOldPalette != NULL) 
	{ 
        pDC->SelectPalette (pOldPalette, FALSE); 
	} 
} 
//************************************************************************************* 
BOOL CBCGPColorBar::OnQueryNewPalette()  
{ 
    Invalidate();     
	UpdateWindow (); 
	return CBCGPPopupMenuBar::OnQueryNewPalette(); 
} 
//************************************************************************************* 
void CBCGPColorBar::OnPaletteChanged(CWnd* pFocusWnd)  
{ 
	CBCGPPopupMenuBar::OnPaletteChanged(pFocusWnd); 
	 
    if (pFocusWnd->GetSafeHwnd() != GetSafeHwnd()) 
	{ 
        Invalidate(); 
		UpdateWindow (); 
	} 
} 
//************************************************************************************* 
BOOL CBCGPColorBar::OnSendCommand (const CBCGPToolbarButton* pButton) 
{ 
	if (m_pParentBtn != NULL || m_pWndPropList != NULL) 
	{ 
		ReleaseCapture (); 
	} 
 
	COLORREF color = (COLORREF) -1; 
 
	CBCGPColorMenuButton* pColorMenuButton = NULL; 
 
	CBCGPPopupMenu* pParentMenu = DYNAMIC_DOWNCAST (CBCGPPopupMenu, GetParent ()); 
	if (pParentMenu != NULL) 
	{ 
		pColorMenuButton = DYNAMIC_DOWNCAST (CBCGPColorMenuButton, pParentMenu->GetParentButton ()); 
	} 
 
	CColorButton* pColorButton = DYNAMIC_DOWNCAST (CColorButton, pButton); 
	if (pColorButton == NULL) 
	{ 
		ASSERT (FALSE); 
	} 
	else if (pColorButton->m_bIsLabel) 
	{ 
		return FALSE; 
	} 
	else if (pColorButton->m_bIsOther) 
	{ 
		SetInCommand (); 
 
		if (pParentMenu != NULL) 
		{ 
			pParentMenu->ShowWindow	(SW_HIDE); 
		} 
 
		HWND hwnd = GetSafeHwnd (); 
 
		InvalidateRect (pButton->Rect ()); 
		UpdateWindow (); 
 
		// Invoke color dialog: 
		if (!OpenColorDialog (m_ColorSelected == (COLORREF)-1 ? 
			m_ColorAutomatic : m_ColorSelected, color)) 
		{ 
			if (!::IsWindow (hwnd)) 
			{ 
				return TRUE; 
			} 
 
			SetInCommand (FALSE); 
 
			if (m_pParentBtn != NULL || m_pWndPropList != NULL) 
			{ 
				GetParent ()->SendMessage (WM_CLOSE); 
			} 
			else if (pColorMenuButton != NULL) 
			{ 
				InvokeMenuCommand (0, pColorMenuButton); 
			} 
			else if (BCGCBProGetTopLevelFrame (this) != NULL) 
			{ 
				BCGCBProGetTopLevelFrame (this)->SetFocus (); 
			} 
 
			return TRUE; 
		} 
 
		if (!::IsWindow (hwnd)) 
		{ 
			return TRUE; 
		} 
 
		SetInCommand (FALSE); 
	} 
	else if (pColorButton->m_bIsAutomatic) 
	{ 
		color = (COLORREF) -1; 
	} 
	else 
	{ 
		color = pColorButton->m_Color; 
	} 
 
	if (pColorMenuButton != NULL) 
	{ 
		pColorMenuButton->SetColor (color); 
		InvokeMenuCommand (pColorMenuButton->m_nID, pColorMenuButton); 
	} 
	else if (m_pParentBtn != NULL) 
	{ 
		m_pParentBtn->UpdateColor (color); 
		GetParent ()->SendMessage (WM_CLOSE); 
	} 
	else if (m_pWndPropList != NULL) 
	{ 
		m_pWndPropList->UpdateColor (color); 
		GetParent ()->SendMessage (WM_CLOSE); 
	} 
	else 
	{ 
		ASSERT (m_nCommandID != 0); 
 
		SetColor (color); 
 
		CObList listButtons; 
		if (CBCGPToolBar::GetCommandButtons (m_nCommandID, listButtons) > 0) 
		{ 
			for (POSITION pos = listButtons.GetHeadPosition (); pos != NULL;) 
			{ 
				CBCGPColorMenuButton* pButton =  
					DYNAMIC_DOWNCAST (CBCGPColorMenuButton, listButtons.GetNext (pos)); 
				if (pButton != NULL) 
				{ 
					pButton->SetColor (color, FALSE); 
				} 
			} 
		} 
 
		CBCGPColorMenuButton::SetColorByCmdID (m_nCommandID, color); 
		GetOwner()->SendMessage (WM_COMMAND, m_nCommandID);    // send command 
 
		if (BCGCBProGetTopLevelFrame (this) != NULL) 
		{ 
			BCGCBProGetTopLevelFrame (this)->SetFocus (); 
		} 
	} 
 
	return TRUE; 
} 
//************************************************************************************* 
BOOL CBCGPColorBar::Create( 
			CWnd*		pParentWnd, 
			DWORD		dwStyle, 
			UINT		nID, 
			CPalette*	pPalette/* = NULL*/, 
			int			nColumns/* = 0*/, 
			int			nRowsDockHorz/* = 0*/, 
			int			nColDockVert/* = 0*/) 
{ 
	if (m_colors.GetSize () != NULL) 
	{ 
		return CBCGPPopupMenuBar::Create (pParentWnd, dwStyle, nID); 
	} 
 
	m_nNumColumns = nColumns; 
	m_nNumColumnsVert = nColDockVert; 
	m_nNumRowsHorz = nRowsDockHorz; 
 
	InitColors (pPalette, m_colors); 
	return CBCGPPopupMenuBar::Create (pParentWnd, dwStyle, nID); 
} 
//************************************************************************************ 
BOOL CBCGPColorBar::CreateControl ( 
				CWnd*			pParentWnd, 
				const CRect&	rect, 
				UINT			nID, 
				int				nColumns, 
				CPalette*		pPalette/* = NULL*/ 
				) 
{ 
	ASSERT_VALID (pParentWnd); 
 
	EnableLargeIcons (FALSE); 
 
	if (nColumns <= 0) 
	{ 
		const int nColorsCount = (pPalette == NULL) ? 20 : pPalette->GetEntryCount (); 
		ASSERT (nColorsCount > 0); 
 
		// Optimal fill 
		for (nColumns = nColorsCount; nColumns > 0; nColumns--) 
		{ 
			int nCellSize = (rect.Width () - 2 * m_nHorzMargin) / nColumns; 
			if (nCellSize == 0) 
			{ 
				continue; 
			} 
 
			int nRows = nColorsCount / nColumns; 
			if (nRows * nCellSize > rect.Height () - 2 * m_nVertMargin) 
			{ 
				nColumns++; 
				break; 
			} 
		} 
 
		if (nColumns <= 0) 
		{ 
			nColumns = -1; 
		} 
	} 
 
	if (!Create (pParentWnd, WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP, nID, pPalette, nColumns)) 
	{ 
		return FALSE; 
	} 
 
	SetBarStyle ( 
		GetBarStyle () &  
			~(CBRS_GRIPPER | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT)); 
 
	CRect rectWnd = rect; 
	MoveWindow (rectWnd); 
	ContextToSize (); 
 
	SetWindowPos (&wndTop, -1, -1, -1, -1, 
		SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); 
 
	SetOwner (pParentWnd); 
	SetCommandID (nID); 
 
	// All commands will be routed via this dialog, not via the parent frame: 
	SetRouteCommandsViaFrame (FALSE); 
	return TRUE; 
} 
//************************************************************************************* 
int CBCGPColorBar::InitColors (CPalette* pPalette, CArray& arColors) 
{ 
	int nColorsCount = (pPalette == NULL) ? 20 : pPalette->GetEntryCount (); 
	arColors.SetSize (nColorsCount); 
 
	if (pPalette == NULL) 
	{ 
		// Use system palette: 
		pPalette = CPalette::FromHandle ((HPALETTE) ::GetStockObject (DEFAULT_PALETTE)); 
		ASSERT_VALID (pPalette); 
	} 
 
	PALETTEENTRY palEntry; 
	for (int i = 0; i < nColorsCount; i++) 
	{ 
		pPalette->GetPaletteEntries (i, 1, &palEntry); 
		arColors [i] = RGB (palEntry.peRed, palEntry.peGreen, palEntry.peBlue); 
	} 
 
	return nColorsCount; 
} 
//************************************************************************************* 
void CBCGPColorBar::Serialize (CArchive& ar) 
{ 
	CBCGPPopupMenuBar::Serialize (ar); 
 
	if (ar.IsLoading ()) 
	{ 
		ar >> m_nNumColumns; 
		ar >> m_nNumRowsHorz; 
		ar >> m_nNumColumnsVert; 
		ar >> m_ColorAutomatic; 
		ar >> m_strAutoColor; 
		ar >> m_strOtherColor; 
		ar >> m_strDocColors; 
		ar >> m_bIsTearOff; 
		ar >> m_nCommandID; 
		ar >> m_bStdColorDlg; 
 
		int nColors = 0; 
		ar >> nColors; 
 
		m_colors.SetSize (nColors); 
 
		for (int i = 0; i < nColors; i ++) 
		{ 
			COLORREF color; 
			ar >> color; 
			 
			m_colors [i] = color; 
		} 
 
		Rebuild (); 
		AdjustLocations (); 
	} 
	else 
	{ 
		ar << m_nNumColumns; 
		ar << m_nNumRowsHorz; 
		ar << m_nNumColumnsVert; 
		ar << m_ColorAutomatic; 
		ar << m_strAutoColor; 
		ar << m_strOtherColor; 
		ar << m_strDocColors; 
		ar << m_bIsTearOff; 
		ar << m_nCommandID; 
		ar << m_bStdColorDlg; 
 
		ar << m_colors.GetSize (); 
 
		for (int i = 0; i < m_colors.GetSize (); i ++) 
		{ 
			ar << m_colors [i]; 
		} 
	} 
} 
//************************************************************************************* 
void CBCGPColorBar::ShowCommandMessageString (UINT /*uiCmdId*/) 
{ 
	GetOwner()->SendMessage (WM_SETMESSAGESTRING, 
		m_nCommandID == (UINT) -1 ? AFX_IDS_IDLEMESSAGE : (WPARAM) m_nCommandID); 
} 
//************************************************************************************* 
BOOL CBCGPColorBar::OpenColorDialog (const COLORREF colorDefault, COLORREF& colorRes) 
{ 
	CBCGPColorMenuButton* pColorMenuButton = NULL; 
 
	CBCGPPopupMenu* pParentMenu = DYNAMIC_DOWNCAST (CBCGPPopupMenu, GetParent ()); 
	if (pParentMenu != NULL) 
	{ 
		pColorMenuButton = DYNAMIC_DOWNCAST (CBCGPColorMenuButton, pParentMenu->GetParentButton ()); 
		if (pColorMenuButton != NULL) 
		{ 
			return pColorMenuButton->OpenColorDialog (colorDefault, colorRes); 
		} 
	} 
 
	BOOL bResult = FALSE; 
 
	if (m_bStdColorDlg) 
	{ 
		CColorDialog dlg (colorDefault, CC_FULLOPEN | CC_ANYCOLOR); 
		if (dlg.DoModal () == IDOK) 
		{ 
			colorRes = dlg.GetColor (); 
			bResult = TRUE; 
		} 
	} 
	else 
	{ 
		CBCGPColorDialog dlg (colorDefault); 
		if (dlg.DoModal () == IDOK) 
		{ 
			colorRes = dlg.GetColor (); 
			bResult = TRUE; 
		} 
	} 
 
	return bResult; 
} 
//************************************************************************************* 
void CBCGPColorBar::EnableAutomaticButton (LPCTSTR lpszLabel, COLORREF colorAutomatic, BOOL bEnable) 
{ 
	m_ColorAutomatic = colorAutomatic; 
	m_strAutoColor = (!bEnable || lpszLabel == NULL) ? _T("") : lpszLabel; 
 
	Rebuild (); 
	AdjustLayout (); 
} 
//************************************************************************************* 
void CBCGPColorBar::EnableOtherButton (LPCTSTR lpszLabel, BOOL bAltColorDlg, BOOL bEnable) 
{ 
	m_bStdColorDlg = !bAltColorDlg; 
	m_strOtherColor = (!bEnable || lpszLabel == NULL) ? _T("") : lpszLabel; 
 
	Rebuild (); 
	AdjustLayout (); 
} 
//************************************************************************************* 
void CBCGPColorBar::SetColor (COLORREF color) 
{ 
	if (m_ColorSelected == color) 
	{ 
		return; 
	} 
 
	m_ColorSelected = color; 
 
	if (GetSafeHwnd () == NULL) 
	{ 
		return; 
	} 
 
	BOOL bIsOtherColor = !(m_ColorAutomatic != (UINT)-1 && m_ColorSelected == (COLORREF)-1); 
	BOOL bWasOtherColor = FALSE; 
 
	m_iHighlighted = -1; 
	int iButton = 0; 
 
	for (POSITION pos = m_Buttons.GetHeadPosition (); pos != NULL; iButton++) 
	{ 
		CRect rectButton; 
 
		CBCGPToolbarButton* pButton = (CBCGPToolbarButton*) m_Buttons.GetNext (pos); 
		if (pButton->m_nStyle & TBBS_SEPARATOR) 
		{ 
			continue; 
		} 
 
		CColorButton* pColorButton = DYNAMIC_DOWNCAST (CColorButton, pButton); 
		if (pColorButton == NULL) 
		{ 
			continue; 
		} 
 
		ASSERT_VALID (pColorButton); 
 
		if (pColorButton->m_bIsOther || pColorButton->m_bIsLabel) 
		{ 
			continue; 
		} 
 
		if (pColorButton->m_bHighlight) 
		{ 
			pColorButton->m_bHighlight = FALSE; 
			InvalidateRect (pColorButton->Rect ()); 
		} 
 
		if (pColorButton->m_bIsAutomatic && color == (COLORREF)-1) 
		{ 
			pColorButton->m_bHighlight = TRUE; 
			m_iHighlighted = iButton; 
			InvalidateRect (pColorButton->Rect ()); 
		} 
		else if (pColorButton->m_Color == color) 
		{ 
			pColorButton->m_bHighlight = TRUE; 
			m_iHighlighted = iButton; 
			InvalidateRect (pColorButton->Rect ()); 
			bIsOtherColor = FALSE; 
		} 
 
		if (pColorButton->m_bIsOtherColor) 
		{ 
			pColorButton->m_Color = m_ColorSelected; 
			pColorButton->m_bHighlight = TRUE; 
 
			InvalidateRect (pColorButton->Rect ()); 
			bWasOtherColor = !(pColorButton->Rect ().IsRectEmpty ()); 
		} 
	} 
 
	if (bWasOtherColor != bIsOtherColor) 
	{ 
		AdjustLocations (); 
		Invalidate (); 
	} 
 
	UpdateWindow (); 
} 
//*************************************************************************************** 
void CBCGPColorBar::OnMouseMove(UINT nFlags, CPoint point)  
{ 
	if (!IsCustomizeMode () || m_bInternal) 
	{ 
		CBCGPToolBar::OnMouseMove(nFlags, point); 
	} 
} 
//*************************************************************************************** 
void CBCGPColorBar::OnLButtonDown(UINT nFlags, CPoint point)  
{ 
	if (IsCustomizeMode () && !m_bInternal) 
	{ 
		return; 
	} 
 
	if (HitTest (point) == -1) 
	{ 
		CBCGPToolBar::OnLButtonDown(nFlags, point); 
	} 
} 
//*************************************************************************************** 
void CBCGPColorBar::OnLButtonUp(UINT nFlags, CPoint point)  
{ 
	if (!IsCustomizeMode () || m_bInternal) 
	{ 
		int iHit = HitTest (point); 
		if (iHit >= 0) 
		{ 
			m_iButtonCapture = iHit; 
		} 
 
		CBCGPToolBar::OnLButtonUp(nFlags, point); 
	} 
} 
//*************************************************************************************** 
void CBCGPColorBar::OnLButtonDblClk(UINT nFlags, CPoint point)  
{ 
	if (!IsCustomizeMode () || m_bInternal) 
	{ 
		CBCGPToolBar::OnLButtonDblClk(nFlags, point); 
	} 
} 
//*************************************************************************************** 
BOOL CBCGPColorBar::PreTranslateMessage(MSG* pMsg) 
{ 
	if ((m_pParentBtn != NULL || m_pWndPropList != NULL) && !m_bInCommand) 
	{ 
		switch (pMsg->message) 
		{ 
		case WM_LBUTTONDOWN: 
		case WM_RBUTTONDOWN: 
		case WM_MBUTTONDOWN: 
			{ 
				CRect rect; 
				GetClientRect (rect); 
 
				CPoint pt (BCG_GET_X_LPARAM (pMsg->lParam), BCG_GET_Y_LPARAM (pMsg->lParam)); 
				if (!rect.PtInRect (pt)) 
				{ 
					GetParent ()->SendMessage (WM_CLOSE); 
					return TRUE; 
				} 
			} 
			break; 
 
		case WM_SYSKEYDOWN: 
		case WM_CONTEXTMENU: 
			GetParent ()->SendMessage (WM_CLOSE); 
			return TRUE; 
 
		case WM_KEYDOWN: 
			if (pMsg->wParam == VK_ESCAPE) 
			{ 
				GetParent ()->SendMessage (WM_CLOSE); 
				return TRUE; 
			} 
		} 
	} 
 
	return CBCGPPopupMenuBar::PreTranslateMessage(pMsg); 
} 
//************************************************************************************* 
void CBCGPColorBar::OnDestroy()  
{ 
	if (m_pParentBtn != NULL) 
	{ 
		m_pParentBtn->m_pPopup = NULL; 
		m_pParentBtn->SetFocus (); 
	} 
	else if (m_pWndPropList != NULL) 
	{ 
		m_pWndPropList->CloseColorPopup (); 
		m_pWndPropList->SetFocus (); 
	} 
 
	CBCGPPopupMenuBar::OnDestroy(); 
} 
//**************************************************************************************** 
BOOL CBCGPColorBar::OnKey(UINT nChar) 
{ 
	POSITION posSel =  
		(m_iHighlighted < 0) ? NULL : m_Buttons.FindIndex (m_iHighlighted); 
	CBCGPToolbarButton* pSelButton =  
		(posSel == NULL) ? NULL : (CBCGPToolbarButton*) m_Buttons.GetAt (posSel); 
 
	switch (nChar) 
	{ 
	case VK_RETURN: 
		if (pSelButton != NULL) 
		{ 
			GetOwner()->SendMessage(WM_SETMESSAGESTRING, AFX_IDS_IDLEMESSAGE); 
			OnSendCommand (pSelButton); 
			return TRUE; 
		} 
		break; 
	} 
 
	return CBCGPPopupMenuBar::OnKey (nChar); 
} 
//**************************************************************************************** 
afx_msg LRESULT CBCGPColorBar::OnMouseLeave(WPARAM wp,LPARAM lp) 
{ 
	if (m_pParentBtn == NULL && m_pWndPropList == NULL) 
	{ 
		return CBCGPToolBar::OnMouseLeave (wp, lp); 
	} 
 
	if (m_hookMouseHelp != NULL ||  
		(m_bMenuMode && !IsCustomizeMode () && GetDroppedDownMenu () != NULL)) 
	{ 
		return 0; 
	} 
 
	m_bTracked = FALSE; 
	m_ptLastMouse = CPoint (-1, -1); 
 
	if (m_iHighlighted >= 0) 
	{ 
		int iButton = m_iHighlighted; 
		m_iHighlighted = -1; 
 
		OnChangeHot (m_iHighlighted); 
 
		InvalidateButton (iButton); 
		UpdateWindow(); // immediate feedback 
 
		GetOwner()->SendMessage(WM_SETMESSAGESTRING, AFX_IDS_IDLEMESSAGE); 
	} 
 
	return 0; 
} 
//************************************************************************************** 
BOOL CBCGPColorBar::CreatePalette (const CArray& arColors, 
								CPalette& palette) 
{ 
	if (palette.GetSafeHandle () != NULL) 
	{ 
		::DeleteObject (palette.Detach ()); 
		ASSERT (palette.GetSafeHandle () == NULL); 
	} 
 
	if (globalData.m_nBitsPerPixel != 8) 
	{ 
		return FALSE; 
	} 
 
	#define MAX_COLOURS 100 
	int nNumColours = arColors.GetSize (); 
	if (nNumColours == 0) 
	{ 
		ASSERT (FALSE); 
		return FALSE; 
	} 
 
	ASSERT (nNumColours <= MAX_COLOURS); 
	if (nNumColours > MAX_COLOURS) 
	{ 
		nNumColours = MAX_COLOURS; 
	} 
 
	// Create the palette 
	struct  
	{ 
		LOGPALETTE    LogPalette; 
		PALETTEENTRY  PalEntry [MAX_COLOURS]; 
	} 
	pal; 
 
	LOGPALETTE* pLogPalette = (LOGPALETTE*) &pal; 
	pLogPalette->palVersion    = 0x300; 
	pLogPalette->palNumEntries = (WORD) nNumColours;  
 
	for (int i = 0; i < nNumColours; i++) 
	{ 
		pLogPalette->palPalEntry[i].peRed   = GetRValue (arColors[i]); 
		pLogPalette->palPalEntry[i].peGreen = GetGValue (arColors[i]); 
		pLogPalette->palPalEntry[i].peBlue  = GetBValue (arColors[i]); 
		pLogPalette->palPalEntry[i].peFlags = 0; 
	} 
 
	palette.CreatePalette (pLogPalette); 
	return TRUE; 
} 
//************************************************************************************** 
CPalette* CBCGPColorBar::SelectPalette (CDC* pDC) 
{ 
	ASSERT_VALID (pDC); 
 
	if (globalData.m_nBitsPerPixel != 8) 
	{ 
		if (m_Palette.GetSafeHandle () != NULL) 
		{ 
			::DeleteObject (m_Palette.Detach ()); 
		} 
 
		return NULL; 
	} 
 
	CPalette* pOldPalette = NULL; 
 
	if (m_pParentBtn != NULL && m_pParentBtn->m_pPalette != NULL) 
	{ 
		pOldPalette = pDC->SelectPalette (m_pParentBtn->m_pPalette, FALSE); 
	} 
	else 
	{ 
		if (m_Palette.GetSafeHandle () == NULL) 
		{ 
			//---------------------------------------- 
			// Palette not created yet; create it now 
			//---------------------------------------- 
			CreatePalette (m_colors, m_Palette); 
		} 
 
		pOldPalette = pDC->SelectPalette (&m_Palette, FALSE); 
	} 
 
	ASSERT (pOldPalette != NULL); 
	pDC->RealizePalette (); 
 
	return pOldPalette; 
} 
//**************************************************************************************** 
void CBCGPColorBar::SetVertMargin (int nVertMargin) 
{ 
	ASSERT_VALID (this); 
 
	m_nVertMargin = nVertMargin; 
	AdjustLayout (); 
} 
//***************************************************************************************** 
void CBCGPColorBar::SetHorzMargin (int nHorzMargin) 
{ 
	ASSERT_VALID (this); 
 
	m_nHorzMargin = nHorzMargin; 
	AdjustLayout (); 
} 
 
#endif // BCG_NO_COLOR