📄 bcgptoolbar.cpp
字号:
AfxIsValidAddress(lpIDArray, sizeof(UINT) * nIDCount, FALSE));
//-----------------------
// Save customize button:
//-----------------------
CCustomizeButton* pCustomizeBtn = NULL;
if (m_pCustomizeBtn != NULL)
{
ASSERT_VALID (m_pCustomizeBtn);
ASSERT (m_pCustomizeBtn == m_Buttons.GetTail ()); // Should be last
pCustomizeBtn = new CCustomizeButton;
pCustomizeBtn->CopyFrom (*m_pCustomizeBtn);
}
RemoveAllButtons ();
while (!m_OrigButtons.IsEmpty ())
{
delete m_OrigButtons.RemoveHead ();
}
if (lpIDArray == NULL)
{
while (nIDCount-- > 0)
{
InsertSeparator ();
}
return TRUE;
}
int iImage = m_iImagesOffset;
//--------------------------------
// Go through them adding buttons:
//--------------------------------
for (int i = 0; i < nIDCount; i ++)
{
int iCmd = *lpIDArray ++;
m_OrigButtons.AddTail (new CBCGPToolbarButton (iCmd, -1));
if (iCmd == 0) // Separator
{
InsertSeparator ();
}
else if (bRemapImages)
{
if (InsertButton (CBCGPToolbarButton (iCmd, iImage, NULL, FALSE,
m_bLocked)) >= 0 && !m_bLocked)
{
m_DefaultImages.SetAt (iCmd, iImage);
}
iImage ++;
}
else
{
if (m_DefaultImages.Lookup (iCmd, iImage))
{
InsertButton (CBCGPToolbarButton (iCmd, iImage, NULL, FALSE, m_bLocked));
}
}
}
//--------------------------
// Restore customize button:
//--------------------------
if (pCustomizeBtn != NULL)
{
InsertButton (pCustomizeBtn);
m_pCustomizeBtn = pCustomizeBtn;
}
if (GetSafeHwnd () != NULL)
{
//------------------------------------
// Allow to produce some user actions:
//------------------------------------
OnReset ();
CWnd* pParentFrame = (m_pDockSite == NULL) ?
GetParent () : m_pDockSite;
if (pParentFrame != NULL)
{
pParentFrame->SendMessage (BCGM_RESETTOOLBAR, (WPARAM) m_uiOriginalResID);
while (!m_OrigResetButtons.IsEmpty ())
{
delete m_OrigResetButtons.RemoveHead ();
}
//-------------------------------------------
// Store Buttons state after OnToolbarReset
//-------------------------------------------
int i = 0;
for (POSITION pos = m_Buttons.GetHeadPosition (); pos != NULL; i++)
{
CBCGPToolbarButton* pButton = (CBCGPToolbarButton*) m_Buttons.GetNext (pos);
if(pButton != NULL && pButton->IsKindOf(RUNTIME_CLASS(CBCGPToolbarButton)))
{
CRuntimeClass* pRTC = pButton->GetRuntimeClass();
CBCGPToolbarButton* pBtn = (CBCGPToolbarButton*)pRTC->CreateObject();
pBtn->CopyFrom(*pButton);
m_OrigResetButtons.AddTail(pBtn);
}
}
}
}
return TRUE;
}
//******************************************************************************************
BOOL CBCGPToolBar::LoadBitmap (UINT uiResID, UINT uiColdResID, UINT uiMenuResID,
BOOL bLocked,
UINT uiDisabledResID, UINT uiMenuDisabledResID)
{
CBCGPToolBarParams params;
params.m_uiColdResID = uiColdResID;
params.m_uiHotResID = uiResID;
params.m_uiDisabledResID = uiDisabledResID;
params.m_uiMenuResID = uiMenuResID;
params.m_uiMenuDisabledResID= uiMenuDisabledResID;
return LoadBitmapEx (params, bLocked);
}
//******************************************************************************************
BOOL CBCGPToolBar::LoadToolBar(UINT uiResID, UINT uiColdResID, UINT uiMenuResID,
BOOL bLocked,
UINT uiDisabledResID, UINT uiMenuDisabledResID,
UINT uiHotResID)
{
CBCGPToolBarParams params;
params.m_uiColdResID = uiColdResID;
params.m_uiHotResID = uiHotResID;
params.m_uiDisabledResID = uiDisabledResID;
params.m_uiMenuResID = uiMenuResID;
params.m_uiMenuDisabledResID= uiMenuDisabledResID;
return LoadToolBarEx (uiResID, params, bLocked);
}
//*****************************************************************************************
BOOL CBCGPToolBar::LoadBitmapEx (CBCGPToolBarParams& params, BOOL bLocked)
{
m_bLocked = bLocked;
if (m_bLocked)
{
//------------------------------------------
// Don't add bitmap to the shared resources!
//------------------------------------------
if (!m_ImagesLocked.Load (params.m_uiHotResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
if (params.m_uiColdResID != 0)
{
if (!m_ColdImagesLocked.Load (params.m_uiColdResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
ASSERT (m_ImagesLocked.GetCount () == m_ColdImagesLocked.GetCount ());
}
if (params.m_uiDisabledResID != 0)
{
if (!m_DisabledImagesLocked.Load (params.m_uiDisabledResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
ASSERT (m_ImagesLocked.GetCount () == m_DisabledImagesLocked.GetCount ());
}
//------------------
// Load large images:
//-------------------
if (params.m_uiLargeHotResID != 0)
{
if (!m_LargeImagesLocked.Load (params.m_uiLargeHotResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
ASSERT (m_ImagesLocked.GetCount () == m_LargeImagesLocked.GetCount ());
}
if (params.m_uiLargeColdResID != 0)
{
ASSERT (params.m_uiColdResID != 0);
if (!m_LargeColdImagesLocked.Load (params.m_uiLargeColdResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
ASSERT (m_ImagesLocked.GetCount () == m_LargeColdImagesLocked.GetCount ());
}
if (params.m_uiLargeDisabledResID != 0)
{
ASSERT (params.m_uiDisabledResID != 0);
if (!m_LargeDisabledImagesLocked.Load (params.m_uiLargeDisabledResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
ASSERT (m_ImagesLocked.GetCount () == m_LargeDisabledImagesLocked.GetCount ());
}
if (params.m_uiMenuResID != 0)
{
if (!m_MenuImagesLocked.Load (params.m_uiMenuResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
ASSERT (m_ImagesLocked.GetCount () == m_MenuImagesLocked.GetCount ());
}
if (params.m_uiMenuDisabledResID != 0)
{
if (!m_MenuImagesLocked.Load (params.m_uiMenuResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
ASSERT (m_ImagesLocked.GetCount () == m_MenuImagesLocked.GetCount ());
}
return TRUE;
}
if (!m_Images.Load (params.m_uiHotResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
m_iImagesOffset = m_Images.GetResourceOffset (params.m_uiHotResID);
ASSERT (m_iImagesOffset >= 0);
if (params.m_uiColdResID != 0)
{
if (!m_ColdImages.Load (params.m_uiColdResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
ASSERT (m_Images.GetCount () == m_ColdImages.GetCount ());
ASSERT (m_Images.GetImageSize ().cy == m_ColdImages.GetImageSize ().cy);
}
if (params.m_uiMenuResID != 0)
{
if (!m_MenuImages.Load (params.m_uiMenuResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
ASSERT (m_Images.GetCount () == m_MenuImages.GetCount ());
ASSERT (m_MenuImages.GetImageSize ().cy == m_sizeMenuImage.cy);
}
if (params.m_uiDisabledResID != 0)
{
if (!m_DisabledImages.Load (params.m_uiDisabledResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
ASSERT (m_Images.GetCount () == m_DisabledImages.GetCount ());
}
if (params.m_uiMenuDisabledResID != 0)
{
if (!m_DisabledMenuImages.Load (params.m_uiMenuDisabledResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
ASSERT (m_Images.GetCount () == m_DisabledMenuImages.GetCount ());
}
ASSERT (m_Images.GetImageSize ().cy == m_sizeImage.cy);
//------------------
// Load large images:
//-------------------
if (params.m_uiLargeHotResID != 0)
{
if (!m_LargeImages.Load (params.m_uiLargeHotResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
ASSERT (m_Images.GetCount () == m_LargeImages.GetCount ());
}
if (params.m_uiLargeColdResID != 0)
{
ASSERT (params.m_uiColdResID != 0);
if (!m_LargeColdImages.Load (params.m_uiLargeColdResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
ASSERT (m_Images.GetCount () == m_LargeColdImages.GetCount ());
}
if (params.m_uiLargeDisabledResID != 0)
{
ASSERT (params.m_uiDisabledResID != 0);
if (!m_LargeDisabledImages.Load (params.m_uiLargeDisabledResID, AfxGetResourceHandle (), TRUE))
{
return FALSE;
}
ASSERT (m_Images.GetCount () == m_LargeDisabledImages.GetCount ());
}
return TRUE;
}
//******************************************************************************************
BOOL CBCGPToolBar::LoadToolBarEx(UINT uiToolbarResID, CBCGPToolBarParams& params,
BOOL bLocked)
{
struct CToolBarData
{
WORD wVersion;
WORD wWidth;
WORD wHeight;
WORD wItemCount;
WORD* items()
{ return (WORD*)(this+1); }
};
ASSERT_VALID(this);
LPCTSTR lpszResourceName = MAKEINTRESOURCE (uiToolbarResID);
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 (params.m_uiHotResID == 0) // Use toolbar resource as hot image
{
params.m_uiHotResID = uiToolbarResID;
}
if (m_uiOriginalResID != 0 || // Buttons are already created
LoadBitmapEx (params, bLocked))
{
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 = uiToolbarResID;
bResult = SetButtons(pItems, pData->wItemCount);
if (!bResult)
{
m_uiOriginalResID = 0;
}
}
delete[] pItems;
UnlockResource(hGlobal);
FreeResource(hGlobal);
return bResult;
}
//*****************************************************************************************
int CBCGPToolBar::InsertButton (const CBCGPToolbarButton& button, int iInsertAt)
{
CRuntimeClass* pClass = button.GetRuntimeClass ();
ASSERT (pClass != NULL);
CBCGPToolbarButton* pButton = (CBCGPToolbarButton*) pClass->CreateObject ();
ASSERT_VALID(pButton);
pButton->CopyFrom (button);
int iIndex = InsertButton (pButton, iInsertAt);
if (iIndex < 0)
{
delete pButton;
}
return iIndex;
}
//******************************************************************************************
int CBCGPToolBar::ReplaceButton (UINT uiCmd, const CBCGPToolbarButton& button,
BOOL bAll/* = FALSE*/)
{
ASSERT_VALID (this);
int nButtonsCount = 0;
for (int iStartIndex = 0;;)
{
int iIndex = CommandToIndex (uiCmd, iStartIndex);
if (iIndex < 0)
{
break;
}
POSITION pos = m_Buttons.FindIndex (iIndex);
if (pos == NULL)
{
ASSERT (FALSE);
break;
}
CBCGPToolbarButton* pOldButton = (CBCGPToolbarButton*) m_Buttons.GetAt (pos);
ASSERT_VALID (pOldButton);
m_Buttons.RemoveAt (pos);
pOldButton->OnCancelMode ();
delete pOldButton;
if (InsertButton (button, iIndex) < 0)
{
ASSERT (FALSE);
return FALSE;
}
nButtonsCount++;
if (bAll)
{
iStartIndex = iIndex + 1;
}
else
{
break;
}
}
if (nButtonsCount == 0)
{
TRACE(_T("ReplaceButton: Can't find command %d\n"), uiCmd);
}
return nButtonsCount;
}
//******************************************************************************************
int CBCGPToolBar::InsertButton (CBCGPToolbarButton* 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!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -