📄 bcgtoolbar.cpp
字号:
return FALSE;
}
if (uiColdResID != 0)
{
if (!m_ColdImagesLocked.Load (uiColdResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
ASSERT (m_ImagesLocked.GetCount () == m_ColdImagesLocked.GetCount ());
}
if (uiMenuResID != 0)
{
if (!m_MenuImagesLocked.Load (uiMenuResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
ASSERT (m_ImagesLocked.GetCount () == m_MenuImagesLocked.GetCount ());
}
if (uiDisabledResID != 0)
{
if (!m_DisabledImagesLocked.Load (uiDisabledResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
ASSERT (m_ImagesLocked.GetCount () == m_DisabledImagesLocked.GetCount ());
}
if (uiMenuDisabledResID != 0)
{
if (!m_MenuImagesLocked.Load (uiMenuResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
ASSERT (m_ImagesLocked.GetCount () == m_MenuImagesLocked.GetCount ());
}
return TRUE;
}
if (!m_Images.Load (uiResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
m_iImagesOffset = m_Images.GetResourceOffset (uiResID);
ASSERT (m_iImagesOffset >= 0);
if (uiColdResID != 0)
{
if (!m_ColdImages.Load (uiColdResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
ASSERT (m_Images.GetCount () == m_ColdImages.GetCount ());
ASSERT (m_Images.GetImageSize ().cy == m_ColdImages.GetImageSize ().cy);
}
if (uiMenuResID != 0)
{
if (!m_MenuImages.Load (uiMenuResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
ASSERT (m_Images.GetCount () == m_MenuImages.GetCount ());
ASSERT (m_MenuImages.GetImageSize ().cy == m_sizeMenuImage.cy);
}
if (uiDisabledResID != 0)
{
if (!m_DisabledImages.Load (uiDisabledResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
ASSERT (m_Images.GetCount () == m_DisabledImages.GetCount ());
}
if (uiMenuDisabledResID != 0)
{
if (!m_DisabledMenuImages.Load (uiMenuDisabledResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
ASSERT (m_Images.GetCount () == m_DisabledMenuImages.GetCount ());
}
ASSERT (m_Images.GetImageSize ().cy == m_sizeImage.cy);
return TRUE;
}
//******************************************************************************************
BOOL CBCGToolBar::LoadToolBar(UINT uiResID, UINT uiColdResID, UINT uiMenuResID,
BOOL bLocked,
UINT uiDisabledResID, UINT uiMenuDisabledResID)
{
struct CToolBarData
{
WORD wVersion;
WORD wWidth;
WORD wHeight;
WORD wItemCount;
WORD* items()
{ return (WORD*)(this+1); }
};
ASSERT_VALID(this);
LPCTSTR lpszResourceName = MAKEINTRESOURCE (uiResID);
ASSERT(lpszResourceName != NULL);
//---------------------------------------------------
// determine location of the bitmap in resource fork:
//---------------------------------------------------
HINSTANCE hInst = AfxFindResourceHandle(lpszResourceName, RT_TOOLBAR);
HRSRC hRsrc = ::FindResource(hInst, lpszResourceName, RT_TOOLBAR);
if (hRsrc == NULL)
return FALSE;
HGLOBAL hGlobal = LoadResource(hInst, hRsrc);
if (hGlobal == NULL)
return FALSE;
CToolBarData* pData = (CToolBarData*)LockResource(hGlobal);
if (pData == NULL)
return FALSE;
ASSERT(pData->wVersion == 1);
UINT* pItems = new UINT[pData->wItemCount];
ASSERT (pItems != NULL);
if (bLocked)
{
SetLockedSizes (CSize (pData->wWidth + 6, pData->wHeight + 6),
CSize (pData->wWidth, pData->wHeight));
}
else
{
SetSizes ( CSize (pData->wWidth + 6, pData->wHeight + 6),
CSize (pData->wWidth, pData->wHeight));
}
BOOL bResult = TRUE;
if (m_uiOriginalResID != 0 ||
LoadBitmap (uiResID, uiColdResID, uiMenuResID, bLocked,
uiDisabledResID, uiMenuDisabledResID))
{
int iImageIndex = m_iImagesOffset;
for (int i = 0; i < pData->wItemCount; i++)
{
pItems[i] = pData->items()[i];
if (!bLocked && pItems [i] > 0)
{
m_DefaultImages.SetAt (pItems[i], iImageIndex ++);
}
}
m_uiOriginalResID = uiResID;
bResult = SetButtons(pItems, pData->wItemCount);
if (!bResult)
{
m_uiOriginalResID = 0;
}
}
delete[] pItems;
UnlockResource(hGlobal);
FreeResource(hGlobal);
return bResult;
}
//*****************************************************************************************
int CBCGToolBar::InsertButton (const CBCGToolbarButton& button, int iInsertAt)
{
CRuntimeClass* pClass = button.GetRuntimeClass ();
ASSERT (pClass != NULL);
CBCGToolbarButton* pButton = (CBCGToolbarButton*) pClass->CreateObject ();
ASSERT_VALID(pButton);
pButton->CopyFrom (button);
int iIndex = InsertButton (pButton, iInsertAt);
if (iIndex < 0)
{
delete pButton;
}
return iIndex;
}
//******************************************************************************************
BOOL CBCGToolBar::ReplaceButton (UINT uiCmd, const CBCGToolbarButton& button)
{
ASSERT_VALID (this);
int iIndex = CommandToIndex (uiCmd);
if (iIndex < 0)
{
TRACE(_T("ReplaceButton: Can't find command %d\n"), uiCmd);
return FALSE;
}
RemoveButton (iIndex);
if (iIndex > GetCount ())
{
iIndex = GetCount ();
}
return InsertButton (button, iIndex) >= 0;
}
//******************************************************************************************
int CBCGToolBar::InsertButton (CBCGToolbarButton* pButton, int iInsertAt)
{
ASSERT (pButton != NULL);
if (!IsCommandPermitted (pButton->m_nID))
{
return -1;
}
if (iInsertAt != -1 &&
(iInsertAt < 0 || iInsertAt > m_Buttons.GetCount ()))
{
return -1;
}
if (iInsertAt == -1 || iInsertAt == m_Buttons.GetCount ())
{
if (m_pCustomizeBtn != NULL)
{
ASSERT_VALID (m_pCustomizeBtn);
ASSERT (m_pCustomizeBtn == m_Buttons.GetTail ()); // Should be last!
iInsertAt = m_Buttons.GetCount () - 1;
}
else
{
//-------------------------
// Add to the toolbar tail:
//-------------------------
m_Buttons.AddTail (pButton);
pButton->OnChangeParentWnd (this);
return m_Buttons.GetCount () - 1;
}
}
POSITION pos = m_Buttons.FindIndex (iInsertAt);
ASSERT (pos != NULL);
m_Buttons.InsertBefore (pos, pButton);
pButton->OnChangeParentWnd (this);
return iInsertAt;
}
//******************************************************************************************
int CBCGToolBar::InsertSeparator (int iInsertAt)
{
CBCGToolbarButton* pButton = new CBCGToolbarButton;
ASSERT (pButton != NULL);
pButton->m_nStyle = TBBS_SEPARATOR;
int iNewButtonOndex = InsertButton (pButton, iInsertAt);
if (iNewButtonOndex == -1)
{
delete pButton;
}
return iNewButtonOndex;
}
//******************************************************************************************
void CBCGToolBar::RemoveAllButtons ()
{
m_iButtonCapture = -1; // nothing captured
m_iHighlighted = -1;
m_iSelected = -1;
while (!m_Buttons.IsEmpty ())
{
CBCGToolbarButton* pButton = (CBCGToolbarButton*) m_Buttons.RemoveHead ();
ASSERT_VALID (pButton);
pButton->OnCancelMode ();
delete pButton;
}
m_pCustomizeBtn = NULL;
}
//******************************************************************************************
BOOL CBCGToolBar::RemoveButton (int iIndex)
{
POSITION pos = m_Buttons.FindIndex (iIndex);
if (pos == NULL)
{
return FALSE;
}
if (iIndex == m_Buttons.GetCount () - 1 && m_pCustomizeBtn != NULL)
{
//-------------------------------------
// Unable to remove "Customize" button:
//-------------------------------------
ASSERT_VALID (m_pCustomizeBtn);
ASSERT (m_pCustomizeBtn == m_Buttons.GetTail ()); // Should be last!
ASSERT (FALSE);
return FALSE;
}
CBCGToolbarButton* pButton = (CBCGToolbarButton*) m_Buttons.GetAt (pos);
ASSERT_VALID (pButton);
m_Buttons.RemoveAt (pos);
pButton->OnCancelMode ();
delete pButton;
if (iIndex == m_iSelected)
{
m_iSelected = -1;
}
else if (iIndex < m_iSelected && m_iSelected >= 0)
{
m_iSelected --;
}
if (iIndex == m_iButtonCapture)
{
m_iButtonCapture = -1;
}
else if (iIndex < m_iButtonCapture && m_iButtonCapture >= 0)
{
m_iButtonCapture --;
}
if (iIndex == m_iHighlighted)
{
m_iHighlighted = -1;
OnChangeHot (m_iHighlighted);
}
else if (iIndex < m_iHighlighted && m_iHighlighted >= 0)
{
m_iHighlighted --;
OnChangeHot (m_iHighlighted);
}
//-----------------------------------------
// If last button is separator - remove it:
//-----------------------------------------
while (!m_Buttons.IsEmpty ())
{
CBCGToolbarButton* pLastButton = (CBCGToolbarButton*) m_Buttons.GetTail ();
ASSERT_VALID (pLastButton);
if (pLastButton->m_nStyle & TBBS_SEPARATOR)
{
delete m_Buttons.RemoveTail ();
}
else
{
//----------------------
// Regular button, stop!
//----------------------
break;
}
}
//----------------------------
// Don't leave two separators:
//----------------------------
if (iIndex > 0 && iIndex < m_Buttons.GetCount ())
{
CBCGToolbarButton* pPrevButton = GetButton (iIndex - 1);
ASSERT_VALID (pPrevButton);
CBCGToolbarButton* pNextButton = GetButton (iIndex);
ASSERT_VALID (pNextButton);
if ((pPrevButton->m_nStyle & TBBS_SEPARATOR) &&
(pNextButton->m_nStyle & TBBS_SEPARATOR))
{
RemoveButton (iIndex);
}
}
RebuildAccelerationKeys ();
return TRUE;
}
#ifdef AFX_CORE3_SEG
#pragma code_seg(AFX_CORE3_SEG)
#endif
/////////////////////////////////////////////////////////////////////////////
// CBCGToolBar attribute access
int CBCGToolBar::CommandToIndex(UINT nIDFind) const
{
ASSERT_VALID(this);
int i = 0;
for (POSITION pos = m_Buttons.GetHeadPosition (); pos != NULL; i ++)
{
CBCGToolbarButton* pButton = (CBCGToolbarButton*) m_Buttons.GetNext (pos);
ASSERT (pButton != NULL);
if (pButton->m_nID == nIDFind)
{
return i;
}
}
return -1;
}
//*****************************************************************
UINT CBCGToolBar::GetItemID(int nIndex) const
{
ASSERT_VALID(this);
CBCGToolbarButton* pButton = GetButton (nIndex);
if (pButton == NULL)
{
ASSERT (FALSE);
return 0;
}
return pButton->m_nID;
}
//*****************************************************************
void CBCGToolBar::GetItemRect(int nIndex, LPRECT lpRect) const
{
ASSERT_VALID(this);
ASSERT(nIndex >= 0 && nIndex < m_Buttons.GetCount ());
ASSERT(AfxIsValidAddress(lpRect, sizeof(RECT)));
CBCGToolbarButton* pButton = GetButton (nIndex);
if (pButton == NULL)
{
ASSERT (FALSE);
*lpRect = CRect (0, 0, 0, 0);
}
else
{
*lpRect = pButton->Rect ();
}
}
//*****************************************************************
void CBCGToolBar::GetInvalidateItemRect(int nIndex, LPRECT lpRect) const
{
//----------------
// By Guy Hachlili
//----------------
ASSERT_VALID(this);
ASSERT(nIndex >= 0 && nIndex < m_Buttons.GetCount ());
ASSERT(AfxIsValidAddress(lpRect, sizeof(RECT)));
CBCGToolbarButton* pButton = GetButton (nIndex);
if (pButton == NULL)
{
ASSERT (FALSE);
*lpRect = CRect (0, 0, 0, 0);
}
else
{
*lpRect = pButton->GetInvalidateRect ();
}
}
//***************************************************************************
UINT CBCGToolBar::GetButtonStyle(int nIndex) const
{
CBCGToolbarButton* pButton = GetButton (nIndex);
if (pButton == NULL)
{
ASSERT (FALSE);
return 0;
}
return pButton->m_nStyle;
}
//*****************************************************************
int CBCGToolBar::ButtonToIndex (const CBCGToolbarButton* pButton) const
{
ASSERT_VALID (this);
ASSERT_VALID (pButton);
int i = 0;
for (POSITION pos = m_Buttons.GetHeadPosition (); pos != NULL; i ++)
{
CBCGToolbarButton* pListButton = (CBCGToolbarButton*) m_Buttons.GetNext (pos);
ASSERT (pListButton != NULL);
if (pListButton == pButton)
{
return i;
}
}
return -1;
}
//*****************************************************************
void CBCGToolBar::SetButtonStyle(int nIndex, UINT nStyle)
{
CBCGToolbarButton* pButton = GetButton (nIndex);
if (pButton == NULL)
{
ASSERT (FALSE);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -