📄 bcgptoolbar.cpp
字号:
//*******************************************************************************
// 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 + -