📄 bcgtoolbar.cpp
字号:
CControlBar::OnCancelMode();
if (m_bStretchButton)
{
m_pDragButton = NULL;
m_bStretchButton = FALSE;
m_rectTrack.SetRectEmpty ();
::ReleaseCapture ();
if (m_pWndLastCapture != NULL)
{
m_pWndLastCapture->SetCapture ();
m_pWndLastCapture = NULL;
}
}
if (m_iButtonCapture >= 0 ||
m_iHighlighted >= 0)
{
if (m_iButtonCapture >= 0)
{
CBCGToolbarButton* pButton = GetButton(m_iButtonCapture);
if (pButton == NULL)
{
ASSERT (FALSE);
}
else
{
ASSERT(!(pButton->m_nStyle & TBBS_SEPARATOR));
UINT nNewStyle = (pButton->m_nStyle & ~TBBS_PRESSED);
if (GetCapture() == this)
{
::ReleaseCapture();
if (m_pWndLastCapture != NULL)
{
m_pWndLastCapture->SetCapture ();
m_pWndLastCapture = NULL;
}
}
SetButtonStyle(m_iButtonCapture, nNewStyle);
}
}
m_iButtonCapture = -1;
m_iHighlighted = -1;
OnChangeHot (m_iHighlighted);
}
for (POSITION pos = m_Buttons.GetHeadPosition (); pos != NULL;)
{
CBCGToolbarButton* pButton = (CBCGToolbarButton*) m_Buttons.GetNext (pos);
ASSERT (pButton != NULL);
pButton->OnCancelMode ();
}
Invalidate ();
UpdateWindow();
}
//*************************************************************************************
void CBCGToolBar::OnSysColorChange()
{
globalData.UpdateSysColors ();
m_Images.OnSysColorChange ();
m_ColdImages.OnSysColorChange ();
m_ImagesLocked.OnSysColorChange ();
m_ColdImagesLocked.OnSysColorChange ();
if (m_pUserImages != NULL)
{
m_pUserImages->OnSysColorChange ();
}
Invalidate ();
}
/////////////////////////////////////////////////////////////////////////////
// CBCGToolBar idle update through CToolCmdUI class
#define CToolCmdUI COldToolCmdUI
class CToolCmdUI : public CCmdUI // class private to this file !
{
public: // re-implementations only
virtual void Enable(BOOL bOn);
virtual void SetCheck(int nCheck);
virtual void SetText(LPCTSTR lpszText);
};
void CToolCmdUI::Enable(BOOL bOn)
{
m_bEnableChanged = TRUE;
CBCGToolBar* pToolBar = (CBCGToolBar*)m_pOther;
ASSERT(pToolBar != NULL);
ASSERT_KINDOF(CBCGToolBar, pToolBar);
ASSERT(m_nIndex < m_nIndexMax);
UINT nNewStyle = pToolBar->GetButtonStyle(m_nIndex) & ~TBBS_DISABLED;
if (!bOn)
nNewStyle |= TBBS_DISABLED;
ASSERT(!(nNewStyle & TBBS_SEPARATOR));
pToolBar->SetButtonStyle(m_nIndex, nNewStyle);
}
//*************************************************************************************
void CToolCmdUI::SetCheck(int nCheck)
{
ASSERT (nCheck >= 0);
if (nCheck > 2)
{
nCheck = 1;
}
CBCGToolBar* pToolBar = (CBCGToolBar*)m_pOther;
ASSERT(pToolBar != NULL);
ASSERT_KINDOF(CBCGToolBar, pToolBar);
ASSERT(m_nIndex < m_nIndexMax);
UINT nNewStyle = pToolBar->GetButtonStyle(m_nIndex) &
~(TBBS_CHECKED | TBBS_INDETERMINATE);
if (nCheck == 1)
nNewStyle |= TBBS_CHECKED;
else if (nCheck == 2)
nNewStyle |= TBBS_INDETERMINATE;
ASSERT(!(nNewStyle & TBBS_SEPARATOR));
pToolBar->SetButtonStyle(m_nIndex, nNewStyle | TBBS_CHECKBOX);
}
//*************************************************************************************
void CToolCmdUI::SetText (LPCTSTR lpszText)
{
ASSERT (lpszText != NULL);
CBCGToolBar* pToolBar = (CBCGToolBar*)m_pOther;
ASSERT(pToolBar != NULL);
ASSERT_KINDOF(CBCGToolBar, pToolBar);
ASSERT(m_nIndex < m_nIndexMax);
CBCGToolbarButton* pButton = pToolBar->GetButton (m_nIndex);
if (pButton == NULL)
{
ASSERT (FALSE);
return;
}
ASSERT_VALID (pButton);
if (pButton->m_strText == lpszText)
{
return;
}
pButton->m_strText = lpszText;
pToolBar->AdjustLayout ();
}
//*************************************************************************************
void CBCGToolBar::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler)
{
CToolCmdUI state;
state.m_pOther = this;
state.m_nIndexMax = (UINT)m_Buttons.GetCount ();
for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax;
state.m_nIndex++)
{
CBCGToolbarButton* pButton = GetButton(state.m_nIndex);
if (pButton == NULL)
{
ASSERT (FALSE);
return;
}
state.m_nID = pButton->m_nID;
// ignore separators and system commands
if (!(pButton->m_nStyle & TBBS_SEPARATOR) &&
pButton->m_nID != 0 &&
!IsSystemCommand (pButton->m_nID) &&
pButton->m_nID < AFX_IDM_FIRST_MDICHILD)
{
state.DoUpdate(pTarget, bDisableIfNoHndler);
}
}
// update the dialog controls added to the toolbar
UpdateDialogControls(pTarget, bDisableIfNoHndler);
}
//*************************************************************************************
void CBCGToolBar::UpdateButton(int nIndex)
{
// determine target of command update
CFrameWnd* pTarget = (CFrameWnd*)GetOwner();
if (pTarget == NULL || !pTarget->IsFrameWnd())
pTarget = GetParentFrame();
// send the update notification
if (pTarget != NULL)
{
CToolCmdUI state;
state.m_pOther = this;
state.m_nIndex = nIndex;
state.m_nIndexMax = (UINT)m_Buttons.GetCount ();
CBCGToolbarButton* pButton = GetButton(nIndex);
if (pButton == NULL)
{
ASSERT (FALSE);
return;
}
if (!IsSystemCommand (pButton->m_nID) &&
pButton->m_nID < AFX_IDM_FIRST_MDICHILD)
{
state.m_nID = pButton->m_nID;
state.DoUpdate(pTarget, pTarget->m_bAutoMenuEnable);
}
}
}
/////////////////////////////////////////////////////////////////////////////
// CBCGToolBar diagnostics
#ifdef _DEBUG
void CBCGToolBar::AssertValid() const
{
CControlBar::AssertValid();
}
void CBCGToolBar::Dump(CDumpContext& dc) const
{
CControlBar::Dump (dc);
CString strName;
if (::IsWindow (m_hWnd))
{
GetWindowText (strName);
}
dc << "\n**** Toolbar ***" << strName;
dc << "\nButtons: " << m_Buttons.GetCount () << "\n";
dc.SetDepth (dc.GetDepth () + 1);
for (POSITION pos = m_Buttons.GetHeadPosition (); pos != NULL;)
{
CBCGToolbarButton* pButton = (CBCGToolbarButton*) m_Buttons.GetNext (pos);
ASSERT_VALID (pButton);
pButton->Dump (dc);
dc << "\n";
}
dc.SetDepth (dc.GetDepth () - 1);
dc << "\n";
}
#endif
#undef new
#ifdef AFX_INIT_SEG
#pragma code_seg(AFX_INIT_SEG)
#endif
int CBCGToolBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CControlBar::OnCreate(lpCreateStruct) == -1)
return -1;
if (globalData.m_hcurStretch == NULL)
{
globalData.m_hcurStretch = AfxGetApp ()->LoadCursor (AFX_IDC_HSPLITBAR);
}
if (globalData.m_hcurStretchVert == NULL)
{
globalData.m_hcurStretchVert = AfxGetApp ()->LoadCursor (AFX_IDC_VSPLITBAR);
}
_AFX_THREAD_STATE* pState = AfxGetThreadState();
if (pState->m_bNeedTerm) // AfxOleInit was called
{
m_DropTarget.Register (this);
}
m_penDrag.CreatePen (PS_SOLID, 1, globalData.clrBtnText);
gAllToolbars.AddTail (this);
return 0;
}
//****************************************************************************************
DROPEFFECT CBCGToolBar::OnDragEnter(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
{
m_iDragIndex = -1;
m_DropSource.m_bDeleteOnDrop = FALSE;
return OnDragOver(pDataObject, dwKeyState, point);
}
//****************************************************************************************
void CBCGToolBar::OnDragLeave()
{
m_iDragIndex = -1;
CRect rect = m_rectDrag;
rect.InflateRect (2, 2);
InvalidateRect (&rect);
UpdateWindow ();
m_rectDrag.SetRectEmpty ();
m_iDragIndex = -1;
m_DropSource.m_bDeleteOnDrop = TRUE;
}
//****************************************************************************************
DROPEFFECT CBCGToolBar::OnDragOver(COleDataObject* pDataObject, DWORD dwKeyState,
CPoint point)
{
if (m_bLocked)
{
return DROPEFFECT_NONE;
}
CBCGToolbarButton* pButton = CBCGToolbarButton::CreateFromOleData (pDataObject);
if (pButton == NULL)
{
return DROPEFFECT_NONE;
}
BOOL bAllowDrop = pButton->CanBeDropped (this);
delete pButton;
if (!bAllowDrop)
{
return DROPEFFECT_NONE;
}
BOOL bCopy = (dwKeyState & MK_CONTROL);
m_bIsDragCopy = bCopy;
if (m_pDragButton == NULL) // Drag from the other toolbar
{
//------------------
// Remove selection:
//------------------
int iSelected = m_iSelected;
m_iSelected = -1;
if (iSelected != -1)
{
InvalidateButton (iSelected);
UpdateWindow ();
}
}
//---------------------
// Find the drop place:
//---------------------
CRect rect = m_rectDrag;
int iIndex = FindDropIndex (point, m_rectDrag);
if (rect != m_rectDrag)
{
//--------------------
// Redraw drop marker:
//--------------------
m_iDragIndex = iIndex;
rect.InflateRect (2, 2);
InvalidateRect (&rect);
rect = m_rectDrag;
rect.InflateRect (2, 2);
InvalidateRect (&m_rectDrag);
UpdateWindow ();
}
int iPrevHighlighted = m_iHighlighted;
m_iHighlighted = HitTest (point);
if (iPrevHighlighted != m_iHighlighted)
{
OnChangeHot (m_iHighlighted);
}
return (bCopy) ? DROPEFFECT_COPY : DROPEFFECT_MOVE;
}
//****************************************************************************************
BOOL CBCGToolBar::OnDrop(COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point)
{
ASSERT_VALID(this);
int iDragIndex = m_iDragIndex;
if (iDragIndex < 0)
{
return FALSE;
}
CBCGToolbarButton* pDragButton = m_pDragButton;
m_pDragButton = NULL;
OnDragLeave();
//----------------------------------------------------
// Create a button object from the OLE clipboard data:
//----------------------------------------------------
CBCGToolbarButton* pButton = CreateDroppedButton (pDataObject);
if (pButton == NULL)
{
return FALSE;
}
if (pDragButton != NULL && dropEffect != DROPEFFECT_COPY)
{
int iOldIndex = ButtonToIndex (pDragButton);
if (iDragIndex == iOldIndex || iDragIndex == iOldIndex + 1)
{
AddRemoveSeparator (pDragButton, m_ptStartDrag, point);
delete pButton;
return TRUE;
}
RemoveButton (iOldIndex);
if (iDragIndex > iOldIndex)
{
iDragIndex --;
}
}
if (InsertButton (pButton, iDragIndex) == -1)
{
ASSERT (FALSE);
delete pButton;
return FALSE;
}
AdjustLayout ();
if (m_bAltCustomizeMode)
{
//------------------------------
// Immideatly save button state:
//------------------------------
pButton->SaveBarState ();
}
m_iSelected = -1;
Invalidate ();
return TRUE;
}
//****************************************************************************************
BOOL CBCGToolBar::SetCustomizeMode (BOOL bSet)
{
if (m_bCustomizeMode == bSet)
{
return FALSE;
}
//---------------------------------------------------------------------
// First step - inform all toolbars about start/end customization mode:
//---------------------------------------------------------------------
for (BOOL bToolbarsListWasChanged = TRUE;
bToolbarsListWasChanged;)
{
int iOrigCount = gAllToolbars.GetCount ();
bToolbarsListWasChanged = FALSE;
for (POSITION posTlb = gAllToolbars.GetHeadPosition ();
posTlb != NULL && !bToolbarsListWasChanged;)
{
CBCGToolBar* pToolBar = (CBCGToolBar*) gAllToolbars.GetNext (posTlb);
ASSERT (pToolBar != NULL);
if (CWnd::FromHandlePermanent (pToolBar->m_hWnd) != NULL)
{
ASSERT_VALID(pToolBar);
pToolBar->OnCustomizeMode (bSet);
//-------------------------------------------------
// CBCGToolBar::OnCustomizeMode can add/remove some
// "sub-toolbars". So, let's start loop again!
//-------------------------------------------------
if (gAllToolbars.GetCount () != iOrigCount)
{
bToolbarsListWasChanged = TRUE;
}
}
}
}
m_bCustomizeMode = bSet;
//-----------------------------------
// Second step - redraw all toolbars:
//-----------------------------------
for (POSITION posTlb = gAllToolbars.GetHeadPosition (); posTlb != NULL;)
{
CBCGToolBar* pToolBar = (CBCGToolBar*) gAllToolbars.GetNext (posTlb);
ASSERT (pToolBar != NULL);
if (CWnd::FromHandlePermanent (pToolBar->m_hWnd) != NULL)
{
ASSERT_VALID(pToolBar);
if (pToolBar->m_pCustomizeBtn != NULL)
{
pToolBar->AdjustLayout ();
}
pToolBar->Invalidate ();
pToolBar->UpdateWindow ();
}
}
return TRUE;
}
//*******************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -