📄 bcgtoolbar.cpp
字号:
UINT nOldStyle = pButton->m_nStyle;
if (nOldStyle != nStyle)
{
// update the style and invalidate
pButton->m_nStyle = nStyle;
// invalidate the button only if both styles not "pressed"
if (!(nOldStyle & nStyle & TBBS_PRESSED))
InvalidateButton(nIndex);
}
}
//****************************************************************
CSize CBCGToolBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
{
DWORD dwMode = bStretch ? LM_STRETCH : 0;
dwMode |= bHorz ? LM_HORZ : 0;
return CalcLayout (dwMode);
}
//*************************************************************************************
CSize CBCGToolBar::CalcDynamicLayout (int nLength, DWORD dwMode)
{
if ((nLength == -1) && !(dwMode & LM_MRUWIDTH) && !(dwMode & LM_COMMIT) &&
((dwMode & LM_HORZDOCK) || (dwMode & LM_VERTDOCK)))
{
return CalcFixedLayout(dwMode & LM_STRETCH, dwMode & LM_HORZDOCK);
}
return CalcLayout(dwMode, nLength);
}
//*************************************************************************************
void CBCGToolBar::GetButtonInfo(int nIndex, UINT& nID, UINT& nStyle, int& iImage) const
{
ASSERT_VALID(this);
CBCGToolbarButton* pButton = GetButton(nIndex);
if (pButton == NULL)
{
ASSERT (FALSE);
nID = 0;
nStyle = 0;
iImage = -1;
return;
}
nID = pButton->m_nID;
nStyle = pButton->m_nStyle;
iImage = pButton->GetImage ();
}
//*************************************************************************************
void CBCGToolBar::SetButtonInfo(int nIndex, UINT nID, UINT nStyle, int iImage)
{
ASSERT_VALID(this);
CBCGToolbarButton* pButton = GetButton(nIndex);
if (pButton == NULL)
{
ASSERT (FALSE);
return;
}
ASSERT_VALID (pButton);
pButton->m_nStyle = nStyle;
pButton->m_nID = nID;
pButton->SetImage (iImage);
if ((nStyle & TBBS_SEPARATOR) && iImage > 0) // iImage parameter is a button width!
{
AdjustLayout ();
}
InvalidateButton(nIndex);
}
//*************************************************************************************
BOOL CBCGToolBar::SetButtonText(int nIndex, LPCTSTR lpszText)
{
ASSERT_VALID(this);
ASSERT(lpszText != NULL);
CBCGToolbarButton* pButton = GetButton(nIndex);
if (pButton == NULL)
{
return FALSE;
}
pButton->m_strText = lpszText;
return TRUE;
}
//*************************************************************************************
CString CBCGToolBar::GetButtonText( int nIndex ) const
{
ASSERT_VALID(this);
CBCGToolbarButton* pButton = GetButton(nIndex);
if (pButton == NULL)
{
ASSERT (FALSE);
return _T("");
}
ASSERT_VALID (pButton);
return pButton->m_strText;
}
//*************************************************************************************
void CBCGToolBar::GetButtonText( int nIndex, CString& rString ) const
{
ASSERT_VALID(this);
CBCGToolbarButton* pButton = GetButton(nIndex);
if (pButton == NULL)
{
ASSERT (FALSE);
rString.Empty ();
return;
}
ASSERT_VALID (pButton);
rString = pButton->m_strText;
}
//*************************************************************************************
void CBCGToolBar::DoPaint(CDC* pDCPaint)
{
ASSERT_VALID(this);
ASSERT_VALID(pDCPaint);
CRect rectClip;
pDCPaint->GetClipBox (rectClip);
BOOL bHorz = m_dwStyle & CBRS_ORIENT_HORZ ? TRUE : FALSE;
CRect rectClient;
GetClientRect (rectClient);
CDC* pDC = pDCPaint;
BOOL m_bMemDC = FALSE;
CDC dcMem;
CBitmap bmp;
CBitmap* pOldBmp = NULL;
if (dcMem.CreateCompatibleDC (pDCPaint) &&
bmp.CreateCompatibleBitmap (pDCPaint, rectClient.Width (),
rectClient.Height ()))
{
//-------------------------------------------------------------
// Off-screen DC successfully created. Better paint to it then!
//-------------------------------------------------------------
m_bMemDC = TRUE;
pOldBmp = dcMem.SelectObject (&bmp);
pDC = &dcMem;
if ((GetStyle () & TBSTYLE_TRANSPARENT) == 0)
{
pDC->FillRect (rectClient, &globalData.brBtnFace);
}
else
{
GetBackgroundFromParent (pDC);
}
OnFillBackground (pDC);
}
pDC->SetTextColor (globalData.clrBtnText);
pDC->SetBkMode (TRANSPARENT);
CRect rect;
GetClientRect(rect);
//-----------------------------------
// Force the full size of the button:
//-----------------------------------
if (bHorz)
{
rect.bottom = rect.top + GetRowHeight ();
}
else
{
rect.right = rect.left + GetColumnWidth ();
}
CBCGToolBarImages* pImages = !m_bLocked ?
&m_Images : &m_ImagesLocked;
CBCGToolBarImages* pHotImages = pImages;
CBCGToolBarImages* pColdImages = !m_bLocked ?
&m_ColdImages : &m_ColdImagesLocked;
CBCGToolBarImages* pMenuImages = !m_bLocked ?
&m_MenuImages : &m_MenuImagesLocked;
CBCGToolBarImages* pDisabledImages = !m_bLocked ?
&m_DisabledImages : &m_DisabledImagesLocked;
CBCGToolBarImages* pDisabledMenuImages = !m_bLocked ?
&m_DisabledMenuImages : &m_DisabledMenuImagesLocked;
BOOL bDrawImages = pImages->IsValid ();
CBCGDrawState ds;
if (bDrawImages &&
!pHotImages->PrepareDrawImage (ds,
m_bMenuMode ? m_sizeMenuImage : GetImageSize ()))
{
return; // something went wrong
}
CFont* pOldFont;
if (bHorz)
{
pOldFont = (CFont*) pDC->SelectObject (&globalData.fontRegular);
}
else
{
pOldFont = (CFont*) pDC->SelectObject (&globalData.fontVert);
}
//--------------
// Draw buttons:
//--------------
int iButton = 0;
for (POSITION pos = m_Buttons.GetHeadPosition (); pos != NULL; iButton ++)
{
CBCGToolbarButton* pButton = (CBCGToolbarButton*) m_Buttons.GetNext (pos);
ASSERT (pButton != NULL);
rect = pButton->Rect ();
CRect rectInter;
if (pButton->m_nStyle & TBBS_SEPARATOR)
{
BOOL bHorzSeparator = bHorz;
CRect rectSeparator = rect;
if (pButton->m_bWrap && bHorz)
{
rectSeparator.left = rectClient.left;
rectSeparator.right = rectClient.right;
rectSeparator.top = pButton->Rect ().bottom;
rectSeparator.bottom = rectSeparator.top + LINE_OFFSET;
bHorzSeparator = FALSE;
}
if (rectInter.IntersectRect (rectSeparator, rectClip))
{
DrawSeparator (pDC, rectSeparator, bHorzSeparator);
}
continue;
}
if (!rectInter.IntersectRect (rect, rectClip))
{
continue;
}
BOOL bHighlighted = FALSE;
BOOL bDisabled = (pButton->m_nStyle & TBBS_DISABLED) && !IsCustomizeMode ();
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));
}
}
if (pDC->RectVisible(&rect))
{
BOOL bDrawDisabledImages = FALSE;
if (bDrawImages)
{
CBCGToolBarImages* 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->PrepareDrawImage (ds,
m_bMenuMode ? m_sizeMenuImage : GetImageSize ());
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)
{
CBCGToolbarButton* 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->DrawDragRect (&rectDrag1, CSize (2, 2), NULL, CSize (2, 2));
}
}
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);
}
}
//*************************************************************************************
BOOL CBCGToolBar::DrawButton(CDC* pDC, CBCGToolbarButton* pButton,
CBCGToolBarImages* pImages,
BOOL bHighlighted, BOOL bDrawDisabledImages)
{
ASSERT_VALID (pDC);
ASSERT_VALID (pButton);
if (pButton->IsHidden () || !pDC->RectVisible (pButton->Rect ()))
{
return TRUE;
}
BOOL bHorz = m_dwStyle & CBRS_ORIENT_HORZ ? TRUE : FALSE;
//---------------------
// Draw button context:
//---------------------
pButton->OnDraw (pDC, pButton->Rect (), pImages, bHorz,
IsCustomizeMode () && !m_bLocked, bHighlighted, m_bShowHotBorder,
m_bGrayDisabledButtons && !bDrawDisabledImages);
return TRUE;
}
//*************************************************************************************
CBCGToolbarButton* CBCGToolBar::GetButton(int nIndex) const
{
POSITION pos = m_Buttons.FindIndex (nIndex);
ASSERT (pos != NULL);
CBCGToolbarButton* pButton = (CBCGToolbarButton*) m_Buttons.GetAt (pos);
ASSERT (pButton != NULL);
return pButton;
}
//*************************************************************************************
void CBCGToolBar::InvalidateButton(int nIndex)
{
ASSERT_VALID(this);
CRect rect;
GetInvalidateItemRect (nIndex, &rect); // By Guy Hachlili
rect.InflateRect (3, 3);
InvalidateRect (rect);
}
//*************************************************************************************
int CBCGToolBar::OnToolHitTest(CPoint point, TOOLINFO* pTI) const
{
ASSERT_VALID(this);
if (!m_bShowTooltips)
{
return -1;
}
// check child windows first by calling CControlBar
int nHit = CControlBar::OnToolHitTest(point, pTI);
if (nHit != -1)
return nHit;
// now hit test against CBCGToolBar buttons
nHit = ((CBCGToolBar*)this)->HitTest(point);
if (nHit != -1)
{
CBCGToolbarButton* pButton = GetButton(nHit);
if (pButton == NULL)
{
return -1;
}
if (pTI != NULL)
{
CString 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
{
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 = GetParentFrame ();
if (pParent != NULL &&
(CBCGKeyboardManager::FindDefaultAccelerator (
pButton->m_nID, strLabel, pParent) ||
CBCGKeyboardManager::FindDefaultAccelerator (
pButton->m_nID, strLabel, pParent->GetActiveFrame ())))
{
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -