📄 bcgptoolbar.cpp
字号:
// Disable fade effect for inactive buttons:
//------------------------------------------
CBCGPVisualManager::GetInstance ()->SetFadeInactiveImage (FALSE);
}
if (pColdImages->GetCount ())
{
//------------------------------------------
// Disable fade effect for inactive buttons:
//------------------------------------------
CBCGPVisualManager::GetInstance ()->SetFadeInactiveImage (FALSE);
}
//--------------
// Draw buttons:
//--------------
int iButton = 0;
for (POSITION pos = m_Buttons.GetHeadPosition (); pos != NULL; iButton ++)
{
CBCGPToolbarButton* pButton = (CBCGPToolbarButton*) m_Buttons.GetNext (pos);
if (pButton == NULL)
{
break;
}
ASSERT_VALID (pButton);
rect = pButton->Rect ();
CRect rectInter;
if (pButton->m_nStyle & TBBS_SEPARATOR)
{
BOOL bHorzSeparator = bHorz;
CRect rectSeparator; rectSeparator.SetRectEmpty ();
OnCalcSeparatorRect (pButton, rectSeparator, bHorz);
if (pButton->m_bWrap && bHorz)
{
bHorzSeparator = FALSE;
}
if (rectInter.IntersectRect (rectSeparator, rectClip) && !pButton->IsHidden())
{
DrawSeparator (pDC, rectSeparator, bHorzSeparator);
}
continue;
}
if (!rectInter.IntersectRect (rect, rectClip))
{
continue;
}
BOOL bHighlighted = IsButtonHighlighted (iButton);
BOOL bDisabled = (pButton->m_nStyle & TBBS_DISABLED) && !IsCustomizeMode ();
if (pDC->RectVisible(&rect))
{
BOOL bDrawDisabledImages = FALSE;
if (bDrawImages)
{
CBCGPToolBarImages* pNewImages = NULL;
if (pButton->m_bUserButton)
{
if (pButton->GetImage () >= 0)
{
pNewImages = m_pUserImages;
}
}
else
{
if (m_bMenuMode)
{
if (bDisabled && pDisabledMenuImages->GetCount () > 0)
{
bDrawDisabledImages = TRUE;
pNewImages = pDisabledMenuImages;
}
else if (pMenuImages->GetCount () > 0)
{
pNewImages = pMenuImages;
}
else
{
bDrawDisabledImages =
(bDisabled && pDisabledImages->GetCount () > 0);
pNewImages = bDrawDisabledImages ?
pDisabledImages : pHotImages;
}
}
else // Toolbar mode
{
bDrawDisabledImages =
(bDisabled && pDisabledImages->GetCount () > 0);
pNewImages = bDrawDisabledImages ?
pDisabledImages : pHotImages;
if (!bHighlighted && !bDrawDisabledImages &&
(pButton->m_nStyle & TBBS_PRESSED) == 0 &&
pColdImages->GetCount () > 0 &&
!pButton->IsDroppedDown ())
{
pNewImages = pColdImages;
}
}
}
if (bDrawImages && pNewImages != pImages && pNewImages != NULL)
{
pImages->EndDrawImage (ds);
pNewImages->SetTransparentColor (globalData.clrBtnFace);
pNewImages->PrepareDrawImage (ds,
m_bMenuMode ? m_sizeMenuImage : GetImageSize (), bFadeInactiveImages);
pImages = pNewImages;
}
}
DrawButton (pDC, pButton, bDrawImages ? pImages : NULL,
bHighlighted, bDrawDisabledImages);
}
}
//-------------------------------------------------------------
// Highlight selected button in the toolbar customization mode:
//-------------------------------------------------------------
if (m_iSelected >= m_Buttons.GetCount ())
{
m_iSelected = -1;
}
if (IsCustomizeMode () && m_iSelected >= 0 && !m_bLocked &&
m_pSelToolbar == this)
{
CBCGPToolbarButton* pSelButton = GetButton (m_iSelected);
ASSERT (pSelButton != NULL);
if (pSelButton != NULL && pSelButton->CanBeStored ())
{
CRect rectDrag1 = pSelButton->Rect ();
if (pSelButton->GetHwnd () != NULL)
{
rectDrag1.InflateRect (0, 1);
}
pDC->Draw3dRect(&rectDrag1, globalData.clrBtnText, globalData.clrBtnText);
rectDrag1.DeflateRect (1, 1);
pDC->Draw3dRect(&rectDrag1, globalData.clrBtnText, globalData.clrBtnText);
}
}
if (IsCustomizeMode () && m_iDragIndex >= 0 && !m_bLocked)
{
DrawDragMarker (pDC);
}
pDC->SelectObject (pOldFont);
if (bDrawImages)
{
pImages->EndDrawImage (ds);
}
if (m_bMemDC)
{
//--------------------------------------
// Copy the results to the on-screen DC:
//--------------------------------------
pDCPaint->BitBlt (rectClip.left, rectClip.top, rectClip.Width(), rectClip.Height(),
&dcMem, rectClip.left, rectClip.top, SRCCOPY);
dcMem.SelectObject(pOldBmp);
}
CBCGPVisualManager::GetInstance ()->SetFadeInactiveImage (bFadeInactiveImages);
}
//*************************************************************************************
BOOL CBCGPToolBar::IsButtonHighlighted (int iButton) const
{
BOOL bHighlighted = FALSE;
if (IsCustomizeMode () && !m_bLocked)
{
bHighlighted = FALSE;
}
else
{
if (m_bMenuMode)
{
bHighlighted = (iButton == m_iHighlighted);
}
else
{
bHighlighted = ((iButton == m_iHighlighted ||
iButton == m_iButtonCapture) &&
(m_iButtonCapture == -1 ||
iButton == m_iButtonCapture));
}
}
return bHighlighted;
}
//*************************************************************************************
BOOL CBCGPToolBar::DrawButton(CDC* pDC, CBCGPToolbarButton* pButton,
CBCGPToolBarImages* pImages,
BOOL bHighlighted, BOOL bDrawDisabledImages)
{
ASSERT_VALID (pDC);
ASSERT_VALID (pButton);
if (!pButton->IsVisible() || pButton->IsHidden () || !pDC->RectVisible (pButton->Rect ()))
{
return TRUE;
}
BOOL bHorz = GetCurrentAlignment () & CBRS_ORIENT_HORZ ? TRUE : FALSE;
//---------------------
// Draw button context:
//---------------------
pButton->OnDraw (pDC, pButton->Rect (), pImages, bHorz,
IsCustomizeMode () && !m_bAltCustomizeMode && !m_bLocked,
bHighlighted, m_bShowHotBorder,
m_bGrayDisabledButtons && !bDrawDisabledImages);
return TRUE;
}
//*************************************************************************************
CBCGPToolbarButton* CBCGPToolBar::GetButton(int nIndex) const
{
POSITION pos = m_Buttons.FindIndex (nIndex);
if (pos == NULL)
{
return NULL;
}
CBCGPToolbarButton* pButton = (CBCGPToolbarButton*) m_Buttons.GetAt (pos);
ASSERT (pButton != NULL);
return pButton;
}
//*************************************************************************************
CBCGPToolbarButton* CBCGPToolBar::InvalidateButton (int nIndex)
{
ASSERT_VALID(this);
if (nIndex < 0 || nIndex >= m_Buttons.GetCount ())
{
return NULL;
}
CRect rect;
GetInvalidateItemRect (nIndex, &rect);
CBCGPToolbarButton* pButton = GetButton (nIndex);
if (pButton != NULL && pButton == m_pCustomizeBtn)
{
rect.right += 10;
rect.bottom += 10;
}
InvalidateRect (rect);
if (pButton != NULL && pButton == m_pCustomizeBtn &&
m_pCustomizeBtn->GetExtraSize () != CSize (0, 0))
{
rect.InflateRect (m_pCustomizeBtn->GetExtraSize ());
RedrawWindow (rect, NULL, RDW_FRAME | RDW_INVALIDATE);
}
return pButton;
}
//*************************************************************************************
int CBCGPToolBar::OnToolHitTest(CPoint point, TOOLINFO* pTI) const
{
ASSERT_VALID(this);
if (!m_bShowTooltips)
{
return -1;
}
// check child windows first by calling CBCGPBaseToolBar
int nHit = CBCGPBaseToolBar::OnToolHitTest(point, pTI);
if (nHit != -1)
return nHit;
// now hit test against CBCGPToolBar buttons
nHit = ((CBCGPToolBar*)this)->HitTest(point);
if (nHit != -1)
{
CBCGPToolbarButton* pButton = GetButton(nHit);
if (pButton == NULL)
{
return -1;
}
if (pTI != NULL)
{
CString strTipText;
if (!OnUserToolTip (pButton, strTipText))
{
if ((pButton->m_nID == 0 || pButton->m_nID == (UINT) -1 ||
pButton->m_bUserButton) &&
!pButton->m_strText.IsEmpty ())
{
// Use button text as tooltip!
strTipText = pButton->m_strText;
strTipText.Remove (_T('&'));
}
else
{
if (g_pUserToolsManager != NULL &&
g_pUserToolsManager->IsUserToolCmd (pButton->m_nID))
{
strTipText = pButton->m_strText;
}
else
{
TCHAR szFullText [256];
AfxLoadString (pButton->m_nID, szFullText);
AfxExtractSubString(strTipText, szFullText, 1, '\n');
}
}
}
if (strTipText.IsEmpty ())
{
return -1;
}
if (pButton->m_nID != 0 && pButton->m_nID != (UINT) -1 &&
m_bShowShortcutKeys)
{
//--------------------
// Add shortcut label:
//--------------------
CString strLabel;
CFrameWnd* pParent = BCGPGetParentFrame (this) == NULL ?
NULL : BCGCBProGetTopLevelFrame (BCGPGetParentFrame (this));
if (pParent != NULL &&
(CBCGPKeyboardManager::FindDefaultAccelerator (
pButton->m_nID, strLabel, pParent, TRUE) ||
CBCGPKeyboardManager::FindDefaultAccelerator (
pButton->m_nID, strLabel, pParent->GetActiveFrame (), FALSE)))
{
strTipText += _T(" (");
strTipText += strLabel;
strTipText += _T(')');
}
}
pTI->lpszText = (LPTSTR) ::calloc ((strTipText.GetLength () + 1), sizeof (TCHAR));
_tcscpy (pTI->lpszText, strTipText);
GetItemRect(nHit, &pTI->rect);
pTI->uId = (pButton->m_nID == (UINT) -1) ? 0 : pButton->m_nID;
pTI->hwnd = m_hWnd;
}
nHit = (pButton->m_nID == (UINT) -1) ? 0 : pButton->m_nID;
}
return nHit;
}
//*************************************************************************************
int CBCGPToolBar::HitTest(CPoint point) // in window relative coords
{
int iButton = 0;
for (POSITION pos = m_Buttons.GetHeadPosition (); pos != NULL; iButton ++)
{
CBCGPToolbarButton* pButton = (CBCGPToolbarButton*) m_Buttons.GetNext (pos);
ASSERT (pButton != NULL);
if (pButton->Rect ().PtInRect (point) && !pButton->IsHidden ())
{
return (pButton->m_nStyle & TBBS_SEPARATOR) ? -1 : iButton;
}
}
return -1; // nothing hit
}
/////////////////////////////////////////////////////////////////////////////
// CBCGPToolBar message handlers
BEGIN_MESSAGE_MAP(CBCGPToolBar, CBCGPBaseToolBar)
ON_WM_CONTEXTMENU()
//{{AFX_MSG_MAP(CBCGPToolBar)
ON_WM_MOUSEMOVE()
ON_WM_CANCELMODE()
ON_WM_SYSCOLORCHANGE()
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_LBUTTONDOWN()
ON_COMMAND(ID_BCGBARRES_TOOLBAR_APPEARANCE, OnToolbarAppearance)
ON_COMMAND(ID_BCGBARRES_TOOLBAR_DELETE, OnToolbarDelete)
ON_COMMAND(ID_BCGBARRES_TOOLBAR_IMAGE, OnToolbarImage)
ON_COMMAND(ID_BCGBARRES_TOOLBAR_IMAGE_AND_TEXT, OnToolbarImageAndText)
ON_COMMAND(ID_BCGBARRES_TOOLBAR_START_GROUP, OnToolbarStartGroup)
ON_COMMAND(ID_BCGBARRES_TOOLBAR_TEXT, OnToolbarText)
ON_WM_LBUTTONUP()
ON_WM_WINDOWPOSCHANGED()
ON_WM_CTLCOLOR()
ON_WM_SETCURSOR()
ON_WM_SIZE()
ON_WM_LBUTTONDBLCLK()
ON_COMMAND(ID_BCGBARRES_TOOLBAR_RESET, OnBcgbarresToolbarReset)
ON_WM_NCCALCSIZE()
ON_WM_NCPAINT()
ON_WM_NCHITTEST()
ON_COMMAND(ID_BCGBARRES_COPY_IMAGE, OnBcgbarresCopyImage)
ON_WM_SETFOCUS()
ON_COMMAND(ID_BCGBARRES_TOOLBAR_NEW_MENU, OnBcgbarresToolbarNewMenu)
ON_WM_WINDOWPOSCHANGING()
ON_WM_ERASEBKGND()
ON_WM_KILLFOCUS()
ON_WM_SETTINGCHANGE()
ON_WM_SHOWWINDOW()
//}}AFX_MSG_MAP
ON_REGISTERED_MESSAGE(BCGM_RESETRPROMPT, OnPromptReset)
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
ON_MESSAGE(WM_HELPHITTEST, OnHelpHitTest)
ON_MESSAGE(TB_BUTTONCOUNT, OnGetButtonCount)
ON_MESSAGE(TB_GETITEMRECT, OnGetItemRect)
ON_MESSAGE(TB_GETBUTTON, OnGetButton)
ON_MESSAGE(TB_GETBUTTONTEXT, OnGetButtonText)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXT, 0, 0xFFFF, OnNeedTipText)
END_MESSAGE_MAP()
void CBCGPToolBar::OnLButtonDown(UINT nFlags, CPoint point)
{
int iButton = HitTest(point);
if (m_pSelToolbar != this && IsCustomizeMode ())
{
CBCGPToolBar* pSelToolbar = m_pSelToolbar;
m_pSelToolbar = this;
if (pSelToolbar != NULL)
{
ASSERT_VALID (pSelToolbar);
int iOldSelected = pSelToolbar->m_iSelected;
pSelToolbar->m_iSelected = -1;
pSelToolbar->InvalidateButton (iOldSelected);
}
}
if (iButton < 0) // nothing hit
{
m_iButtonCapture = -1;
if (IsCustomizeMode () && !m_bLocked)
{
int iSelected = m_iSelected;
m_iSelected = -1;
if (iSelected != -1)
{
InvalidateButton (iSelected);
UpdateWindow ();
}
OnChangeHot (-1);
}
if (CanFloat ())
{
SetCursor (globalData.m_hcurSizeAll);
}
CBCGPBaseToolBar::OnLButtonDown(nFlags, point);
return;
}
CBCGPToolbarButton* pButton = GetButton(iButton);
if (pButton == NULL)
{
ASSERT (FALSE);
return;
}
ASSERT(!(pButton->m_nStyle & TBBS_SEPARATOR));
//-----------------------------------------------------------------
// Check for "Alt-customizible mode" (when ALT key is holded down):
//-----------------------------------------------------------------
m_bAltCustomizeMode = FALSE;
if (m_bAltCustomization &&
!m_bCustomizeMode &&
GetAsyncKeyState (VK_MENU) & 0x8000) // ALT is pressed
{
m_bAltCustomizeMode = TRUE;
}
#ifndef BCG_NO_CUSTOMIZATION
if ((!IsCustomizeMode () && !m_bAltCustomizeMode) || m_bLocked || m_bDisableCustomize)
#endif // BCG_NO_CUSTOMIZATION
{
m_iButtonCapture = iButton;
// update the button before checking for disabled status
UpdateButton(m_iButtonCapture);
if ((pButton->m_nStyle & TBBS_DISABLED) &&
!pButton->IsKindOf(RUNTIME_CLASS(CBCGPDropDownToolbarButton)))
{
m_iButtonCapture = -1;
return; // don't press it
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -