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

📄 bcgptoolbar.cpp

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

// bcgtoolbar.cpp : definition of CBCGPToolBar
//
// This code is based on the Microsoft Visual C++ sample file
// TOOLBAR.C from the OLDBARS example
//

#include "stdafx.h"

#include "bcgprores.h"
#include "BCGPToolBar.h"
#include "BCGPMenuBar.h"
#include "BCGPToolbarButton.h"
#include "BCGPToolbarDropSource.h"
#include "ButtonAppearanceDlg.h"
#include "BCGPToolbarCustomize.h"
#include "BCGPLocalResource.h"
#include "BCGPRegistry.h"
#include "BCGPMDIFrameWnd.h"
#include "BCGPMDIChildWnd.h"
#include "BCGPFrameWnd.h"
#include "BCGPKeyboardManager.h"
#include "BCGPToolbarMenuButton.h"
#include "BCGPToolbarSystemMenuButton.h"
#include "BCGPPopupMenu.h"
#include "CustomizeButton.h"
#include "BCGPCommandManager.h"
#include "RegPath.h"
#include "trackmouse.h"
#include "BCGPOleIPFrameWnd.h"
#include "BCGPUserToolsManager.h"
#include "bcgpsound.h"
#include "BCGPVisualManager.h"
#include "BCGPDropDown.h"
#include "BCGPWorkspace.h"

#include "BCGPDockBar.h"
#include "BCGPDockBarRow.h"
#include "BCGPMiniFrameWnd.h"
#include "BCGPReBar.h"

#include "BCGPCustomizeMenuButton.h"

extern CBCGPWorkspace*	g_pWorkspace;

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

#define TEXT_MARGIN			3
#define STRETCH_DELTA		6
#define BUTTON_MIN_WIDTH	5


#define REG_SECTION_FMT					_T("%sBCGToolBar-%d")
#define REG_SECTION_FMT_EX				_T("%sBCGToolBar-%d%x")
#define REG_PARAMS_FMT					_T("%sBCGToolbarParameters")
#define REG_ENTRY_NAME					_T("Name")
#define REG_ENTRY_BUTTONS				_T("Buttons")
#define REG_ENTRY_ORIG_ITEMS			_T("OriginalItems")
#define REG_ENTRY_TOOLTIPS				_T("Tooltips")
#define REG_ENTRY_KEYS					_T("ShortcutKeys")
#define REG_ENTRY_LARGE_ICONS			_T("LargeIcons")
#define REG_ENTRY_ANIMATION				_T("MenuAnimation")
#define REG_ENTRY_RU_MENUS				_T("RecentlyUsedMenus")
#define REG_ENTRY_MENU_SHADOWS			_T("MenuShadows")
#define REG_ENTRY_SHOW_ALL_MENUS_DELAY	_T("ShowAllMenusAfterDelay")
#define REG_ENTRY_CMD_USAGE_COUNT		_T("CommandsUsage")
#define REG_ENTRY_LOOK2000				_T("Look2000")
#define REG_ENTRY_RESET_ITEMS			_T("OrigResetItems")

static const CString strToolbarProfile	= _T("BCGToolBars");

#ifdef AFX_INIT_SEG
#pragma code_seg(AFX_INIT_SEG)
#endif

/////////////////////////////////////////////////////////////////////////////
// CBCGPToolBar notification messages:

UINT BCGM_TOOLBARMENU		= ::RegisterWindowMessage (_T("BCGTOOLBAR_POPUPMENU"));
UINT BCGM_CUSTOMIZETOOLBAR	= ::RegisterWindowMessage (_T("BCGTOOLBAR_CUSTOMIZE"));
UINT BCGM_CREATETOOLBAR		= ::RegisterWindowMessage (_T("BCGTOOLBAR_CREATE"));
UINT BCGM_DELETETOOLBAR		= ::RegisterWindowMessage (_T("BCGTOOLBAR_DELETE"));
UINT BCGM_CUSTOMIZEHELP		= ::RegisterWindowMessage (_T("BCGTOOLBAR_CUSTOMIZEHELP"));
UINT BCGM_RESETTOOLBAR		= ::RegisterWindowMessage (_T("BCGTOOLBAR_RESETTOOLBAR"));
UINT BCGM_RESETMENU			= ::RegisterWindowMessage (_T("BCGTOOLBAR_RESETMENU"));
UINT BCGM_SHOWREGULARMENU	= ::RegisterWindowMessage (_T("BCGTOOLBAR_SHOWREGULARMENU"));
UINT BCGM_RESETCONTEXTMENU	= ::RegisterWindowMessage (_T("BCGTOOLBAR_RESETCONTEXTMENU"));
UINT BCGM_RESETKEYBOARD		= ::RegisterWindowMessage (_T("BCGTOOLBAR_RESETKEYBAORD"));
UINT BCGM_RESETRPROMPT		= ::RegisterWindowMessage (_T("BCGTOOLBAR_RESETRPROMPT"));

/////////////////////////////////////////////////////////////////////////////
// All CBCGPToolBar collection:
CObList	gAllToolbars;

BOOL CBCGPToolBar::m_bCustomizeMode = FALSE;
BOOL CBCGPToolBar::m_bAltCustomizeMode = FALSE;
BOOL CBCGPToolBar::m_bShowTooltips = TRUE;
BOOL CBCGPToolBar::m_bShowShortcutKeys = TRUE;
BOOL CBCGPToolBar::m_bLargeIcons = FALSE;

BOOL CBCGPToolBar::m_bDisableLabelsEdit = FALSE;

#ifndef BCG_NO_CUSTOMIZATION

CBCGPToolbarDropSource CBCGPToolBar::m_DropSource;

#endif // BCG_NO_CUSTOMIZATION

CBCGPToolBarImages	CBCGPToolBar::m_Images;
CBCGPToolBarImages	CBCGPToolBar::m_ColdImages;
CBCGPToolBarImages	CBCGPToolBar::m_MenuImages;
CBCGPToolBarImages	CBCGPToolBar::m_DisabledImages;
CBCGPToolBarImages	CBCGPToolBar::m_DisabledMenuImages;
CBCGPToolBarImages	CBCGPToolBar::m_LargeImages;
CBCGPToolBarImages	CBCGPToolBar::m_LargeColdImages;
CBCGPToolBarImages	CBCGPToolBar::m_LargeDisabledImages;

CBCGPToolBarImages*	CBCGPToolBar::m_pUserImages = NULL;

CSize CBCGPToolBar::m_sizeButton = CSize (23, 22);
CSize CBCGPToolBar::m_sizeImage	= CSize (16, 15);
CSize CBCGPToolBar::m_sizeCurButton = CSize (23, 22);
CSize CBCGPToolBar::m_sizeCurImage	= CSize (16, 15);
CSize CBCGPToolBar::m_sizeMenuImage	= CSize (-1, -1);
CSize CBCGPToolBar::m_sizeMenuButton	= CSize (-1, -1);

BOOL CBCGPToolBar::m_bExtCharTranslation = FALSE;

CMap<UINT, UINT, int, int> CBCGPToolBar::m_DefaultImages;

COLORREF CBCGPToolBar::m_clrTextHot = (COLORREF) -1;
extern CBCGPToolbarCustomize* g_pWndCustomize;

HHOOK CBCGPToolBar::m_hookMouseHelp = NULL;
CBCGPToolBar* CBCGPToolBar::m_pLastHookedToolbar = NULL;

CList<UINT, UINT> CBCGPToolBar::m_lstUnpermittedCommands;
CList<UINT, UINT> CBCGPToolBar::m_lstBasicCommands;

CCmdUsageCount	CBCGPToolBar::m_UsageCount;

BOOL CBCGPToolBar::m_bAltCustomization = FALSE;
CBCGPToolBar* CBCGPToolBar::m_pSelToolbar = NULL;

static inline BOOL IsSystemCommand (UINT uiCmd)
{
	return (uiCmd >= 0xF000 && uiCmd < 0xF1F0);
}

void BCGPToolBarImagesCleanUp ();

CBCGPToolBarParams::CBCGPToolBarParams()
{
	m_uiColdResID = 0;
	m_uiHotResID = 0;
	m_uiDisabledResID = 0;
	m_uiLargeColdResID = 0;
	m_uiLargeHotResID = 0;
	m_uiLargeDisabledResID = 0;
	m_uiMenuResID = 0;
	m_uiMenuDisabledResID = 0;
}

/////////////////////////////////////////////////////////////////////////////
// CBCGPToolBar

IMPLEMENT_SERIAL(CBCGPToolBar, CBCGPBaseToolBar, VERSIONABLE_SCHEMA | 1)

#pragma warning (disable : 4355)

CBCGPToolBar::CBCGPToolBar() :
	m_bMenuMode (FALSE),
	m_Impl (this),
	m_bIgnoreSetText (FALSE)
{
	m_iButtonCapture = -1;      // nothing captured
	m_iHighlighted = -1;
	m_iSelected = -1;
	m_iHot = -1;

	m_iDragIndex = -1;
	m_rectDrag.SetRectEmpty ();
	m_pDragButton = NULL;
	m_ptStartDrag = CPoint (-1, -1);
	m_bIsDragCopy = FALSE;

	m_bMasked = FALSE;
	m_bPermament = FALSE;

	m_pCustomizeBtn = NULL;

	//---------------------
	// UISG standard sizes:
	//---------------------
	m_cyTopBorder = m_cyBottomBorder = 1;   // 1 pixel for top/bottom gaps

	m_sizeCurButtonLocked = CSize (23, 22);
	m_sizeCurImageLocked = CSize (16, 15);
	m_sizeButtonLocked = CSize (23, 22);
	m_sizeImageLocked = CSize (16, 15);

	m_bStretchButton = FALSE;
	m_rectTrack.SetRectEmpty ();

	m_iImagesOffset = 0;
	m_uiOriginalResID = 0;

	m_bTracked = FALSE;
	m_ptLastMouse = CPoint (-1, -1);
	m_pWndLastCapture = NULL;
	m_hwndLastFocus = NULL;

	m_bLocked = FALSE;
	m_bShowHotBorder = TRUE;
	m_bGrayDisabledButtons = TRUE;
	m_bLargeIconsAreEnbaled = TRUE;

	m_bTextLabels = FALSE;
	m_bDrawTextLabels = FALSE;
	m_nMaxBtnHeight = 0;

	m_bDisableControlsIfNoHandler = TRUE;
	m_bRouteCommandsViaFrame = TRUE;

	m_bResourceWasChanged = FALSE;

	m_nTooltipsCount = 0;

	m_nMaxLen = 0;

	m_sizeLast = CSize (0, 0);
	m_bLeaveFocus = TRUE;
	m_bDisableCustomize   = FALSE;

	m_bHasBrother         = FALSE;
	m_bElderBrother		  = FALSE;
	m_pBrotherToolBar     = NULL;
}

#pragma warning (default : 4355)

//******************************************************************************************
CBCGPToolBar::~CBCGPToolBar()
{
	while (!m_OrigButtons.IsEmpty ())
	{
		delete m_OrigButtons.RemoveHead ();
	}

	while(!m_OrigResetButtons.IsEmpty())
	{
		delete m_OrigResetButtons.RemoveHead ();
	}

	RemoveAllButtons ();
}
//******************************************************************************************
BOOL CBCGPToolBar::Create(CWnd* pParentWnd, DWORD dwStyle, UINT nID)
{
	return CBCGPToolBar::CreateEx (pParentWnd, TBSTYLE_FLAT,
							dwStyle,
							CRect(1, 1, 1, 1),
							nID);
}
//******************************************************************************************
BOOL CBCGPToolBar::CreateEx (CWnd* pParentWnd, 
							DWORD dwCtrlStyle,
							DWORD dwStyle,
							CRect rcBorders,
							UINT nID)
{
	dwStyle |= CBRS_GRIPPER; 

	if (pParentWnd != NULL)
	{
		ASSERT_VALID(pParentWnd);   // must have a parent
	}

	if (rcBorders.left < 1)
	{
		rcBorders.left = 1;	// Otherwise, I have a problem with a "double" grippers
	}

	if (rcBorders.top < 1)
	{
		rcBorders.top = 1;	// Otherwise, I have a problem with a "double" grippers
	}

	SetBorders (rcBorders);

	//----------------
	// Save the style:
	//----------------
	m_dwStyle = (dwStyle & CBRS_ALL);

	SetBarAlignment (m_dwStyle);
	if (nID == AFX_IDW_TOOLBAR)
	{
		m_dwStyle |= CBRS_HIDE_INPLACE;
	}

	BOOL bFixed = FALSE;

	dwStyle &= ~CBRS_ALL;

	if (dwStyle & CBRS_SIZE_FIXED)
	{
		bFixed = TRUE;
	}

	dwStyle |= CCS_NOPARENTALIGN|CCS_NOMOVEY|CCS_NODIVIDER|CCS_NORESIZE;
	dwStyle |= dwCtrlStyle;

	if (!bFixed)
	{
		dwStyle &= ~CBRS_SIZE_FIXED;
	}

	//----------------------------
	// Initialize common controls:
	//----------------------------
	VERIFY (AfxDeferRegisterClass (AFX_WNDCOMMCTLS_REG));

	//-----------------
	// Create the HWND:
	//-----------------
	CRect rect;
	rect.SetRectEmpty();

	//-----------------------------
	// Register a new window class:
	//-----------------------------
	HINSTANCE hInst = AfxGetInstanceHandle();
	UINT uiClassStyle = CS_DBLCLKS;
	HCURSOR hCursor = ::LoadCursor (NULL, IDC_ARROW);
	HBRUSH hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);

	CString strClassName;
	strClassName.Format (_T("BCGToolBar:%x:%x:%x:%x"), 
		(UINT)hInst, uiClassStyle, (UINT)hCursor, (UINT)hbrBackground);

	//---------------------------------
	// See if the class already exists:
	//---------------------------------
	WNDCLASS wndcls;
	if (::GetClassInfo (hInst, strClassName, &wndcls))
	{
		//-----------------------------------------------
		// Already registered, assert everything is good:
		//-----------------------------------------------
		ASSERT (wndcls.style == uiClassStyle);
	}
	else
	{
		//-------------------------------------------
		// Otherwise we need to register a new class:
		//-------------------------------------------
		wndcls.style = uiClassStyle;
		wndcls.lpfnWndProc = ::DefWindowProc;
		wndcls.cbClsExtra = wndcls.cbWndExtra = 0;
		wndcls.hInstance = hInst;
		wndcls.hIcon = NULL;
		wndcls.hCursor = hCursor;
		wndcls.hbrBackground = hbrBackground;
		wndcls.lpszMenuName = NULL;
		wndcls.lpszClassName = strClassName;
		
		if (!AfxRegisterClass (&wndcls))
		{
			AfxThrowResourceException();
		}
	}

	if (!CBCGPBaseToolBar::Create (strClassName, dwStyle, rect, pParentWnd, nID, 0))
	{
		return FALSE;
	}

	return TRUE;
}
//******************************************************************************************
void CBCGPToolBar::SetSizes (SIZE sizeButton, SIZE sizeImage)
{
	ASSERT(sizeButton.cx > 0 && sizeButton.cy > 0);

	m_sizeButton = sizeButton;
	m_sizeImage = sizeImage;

	m_sizeCurButton = sizeButton;
	m_sizeCurImage = sizeImage;

	m_Images.SetImageSize (m_sizeImage);
	m_ColdImages.SetImageSize (m_sizeImage);
	m_DisabledImages.SetImageSize (m_sizeImage);

	CSize sizeImageLarge (m_sizeImage.cx * 2, m_sizeImage.cy * 2);

	m_LargeImages.SetImageSize (sizeImageLarge);
	m_LargeColdImages.SetImageSize (sizeImageLarge);
	m_LargeDisabledImages.SetImageSize (sizeImageLarge);

	if (m_bLargeIcons)
	{
		m_sizeCurButton.cx *= 2;
		m_sizeCurButton.cy *= 2;

		m_sizeCurImage.cx *= 2;
		m_sizeCurImage.cy *= 2;
	}

	if (m_pUserImages != NULL)
	{
		m_pUserImages->SetImageSize (m_sizeImage);
	}
}
//******************************************************************************************
void CBCGPToolBar::SetLockedSizes (SIZE sizeButton, SIZE sizeImage)
{
	ASSERT(sizeButton.cx > 0 && sizeButton.cy > 0);

	m_sizeButtonLocked = sizeButton;
	m_sizeImageLocked = sizeImage;

	m_sizeCurButtonLocked = sizeButton;
	m_sizeCurImageLocked = sizeImage;

	m_ImagesLocked.SetImageSize (m_sizeImageLocked);
	m_ColdImagesLocked.SetImageSize (m_sizeImageLocked);
	m_DisabledImagesLocked.SetImageSize (m_sizeImageLocked);

	CSize sizeImageLarge (m_sizeImageLocked.cx * 2, m_sizeImageLocked.cy * 2);

	m_LargeImagesLocked.SetImageSize (sizeImageLarge);
	m_LargeColdImagesLocked.SetImageSize (sizeImageLarge);
	m_LargeDisabledImagesLocked.SetImageSize (sizeImageLarge);

	if (m_bLargeIcons)
	{
		m_sizeCurButtonLocked.cx *= 2;
		m_sizeCurButtonLocked.cy *= 2;

		m_sizeCurImageLocked.cx *= 2;
		m_sizeCurImageLocked.cy *= 2;
	}
}
//******************************************************************************************
void CBCGPToolBar::SetHeight(int cyHeight)
{
	ASSERT_VALID (this);

	int nHeight = cyHeight;
	
	if (m_dwStyle & CBRS_BORDER_TOP)
	{
		cyHeight -= afxData.cyBorder2;
	}

	if (m_dwStyle & CBRS_BORDER_BOTTOM)
	{
		cyHeight -= afxData.cyBorder2;
	}

	m_cyBottomBorder = (cyHeight - GetRowHeight ()) / 2;
	
	//-------------------------------------------------------
	// If there is an extra pixel, m_cyTopBorder will get it:
	//-------------------------------------------------------
	m_cyTopBorder = cyHeight - GetRowHeight () - m_cyBottomBorder;
	
	if (m_cyTopBorder < 0)
	{
		TRACE(_T("Warning: CBCGPToolBar::SetHeight(%d) is smaller than button.\n"),
			nHeight);
		m_cyBottomBorder += m_cyTopBorder;
		m_cyTopBorder = 0;  // will clip at bottom
	}

	if (GetSafeHwnd () != NULL)
	{
		RedrawWindow (NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
	}
}
//******************************************************************************************
BOOL CBCGPToolBar::SetUserImages (CBCGPToolBarImages* pUserImages)
{
	ASSERT (pUserImages != NULL);
	if (!pUserImages->IsValid ())
	{
		ASSERT (FALSE);
		return FALSE;
	}

	if (m_sizeImage != pUserImages->GetImageSize ())
	{
		ASSERT (FALSE);
		return FALSE;
	}

	m_pUserImages = pUserImages;
	return TRUE;
}
//******************************************************************************************
BOOL CBCGPToolBar::SetButtons(const UINT* lpIDArray, int nIDCount, BOOL bRemapImages)
{
	ASSERT_VALID(this);
	ASSERT(nIDCount >= 1);  // must be at least one of them
	ASSERT(lpIDArray == NULL ||

⌨️ 快捷键说明

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