📄 bcgpcaptionbar.cpp
字号:
}
//*****************************************************************************
void CBCGPCaptionBar::RecalcLayout ()
{
CClientDC dc (NULL);
CFont* pOldFont = dc.SelectObject (
m_hFont == NULL ? &globalData.fontRegular : CFont::FromHandle (m_hFont));
ASSERT (pOldFont != NULL);
TEXTMETRIC tm;
dc.GetTextMetrics (&tm);
int nTextHeight = tm.tmHeight + 2;
CSize sizeImage = GetImageSize ();
//-------------------------------------------------------------------
// the height is set to the default (provided by the user in Create)
// or calculated if it is -1
//-------------------------------------------------------------------
if (m_nDefaultHeight != -1)
{
m_nCurrentHeight = m_nDefaultHeight;
}
else
{
m_nCurrentHeight = max (nTextHeight, sizeImage.cy) +
m_nMargin * 2 + m_nBorderSize;
}
// for left and center alignment: icon, button, text
// for right alignment: text, button, icon
CRect rectClient;
GetClientRect (rectClient);
if (rectClient.IsRectEmpty ())
{
return;
}
BOOL bButtonLeftOfIcon = FALSE;
BOOL bTextLeftOfButton = FALSE;
BOOL bTextLeftOfIcon = FALSE;
BOOL bIconCenter = FALSE;
BOOL bButtonCenter = FALSE;
BOOL bTextCenter = FALSE;
// differs from the current height, because the border size is non-client area
int nBaseLine = rectClient.Height () / 2;
int nCenterOffset = rectClient.Width () / 2;
int nNextXOffsetLeft = rectClient.left + m_nMargin;
int nNextXOffsetRight = rectClient.right - m_nMargin;
int nNextXOffsetCenter = nCenterOffset;
if (IsImageSet ())
{
if (sizeImage.cy < rectClient.Height ())
{
// center the icon if its height lesser than client area height
m_rectImage.top = nBaseLine - sizeImage.cy / 2;
}
else
{
// otherwise, clip it from the buttom
m_rectImage.top = rectClient.top + m_nMargin;
}
if (!m_bStretchImage)
{
m_rectImage.bottom = m_rectImage.top + sizeImage.cy;
}
else
{
m_rectImage.bottom = rectClient.bottom - m_nMargin;
}
switch (m_iconAlignment)
{
case ALIGN_LEFT:
m_rectImage.left = nNextXOffsetLeft;
m_rectImage.right = m_rectImage.left + sizeImage.cx;
nNextXOffsetLeft = m_rectImage.right + m_nHorzElementOffset;
break;
case ALIGN_RIGHT:
m_rectImage.left = nNextXOffsetRight - sizeImage.cx;
m_rectImage.right = m_rectImage.left + sizeImage.cx;
nNextXOffsetRight = m_rectImage.left - m_nHorzElementOffset;
// only in this case button and text is at the left side of the icon
bButtonLeftOfIcon = TRUE;
bTextLeftOfIcon = TRUE;
break;
case ALIGN_CENTER:
bIconCenter = TRUE;
nNextXOffsetCenter -= sizeImage.cx / 2;
if (m_btnAlignnment == ALIGN_LEFT)
{
bButtonLeftOfIcon = TRUE;
}
if (m_textAlignment == ALIGN_LEFT)
{
bTextLeftOfIcon = TRUE;
}
break;
default:
ASSERT (FALSE);
}
}
int nButtonWidth = 0;
if (!m_strBtnText.IsEmpty ())
{
nButtonWidth = dc.GetTextExtent (m_strBtnText).cx + 2 * m_nHorzElementOffset;
if (m_uiBtnID != 0 && m_bBtnEnabled)
{
nButtonWidth += nMenuArrowWidth;
}
// the button always has a height equivalent to the bar's height
m_rectButton.top = rectClient.top;
m_rectButton.bottom = rectClient.bottom;
switch (m_btnAlignnment)
{
case ALIGN_LEFT:
m_rectButton.left = nNextXOffsetLeft;
if (nNextXOffsetLeft == rectClient.left + m_nMargin)
{
m_rectButton.left = rectClient.left;
}
m_rectButton.right = m_rectButton.left + nButtonWidth;
nNextXOffsetLeft = m_rectButton.right + m_nHorzElementOffset;
break;
case ALIGN_RIGHT:
m_rectButton.left = nNextXOffsetRight - nButtonWidth;
if (nNextXOffsetRight == rectClient.right - m_nMargin)
{
m_rectButton.left = rectClient.right - nButtonWidth;
}
m_rectButton.right = m_rectButton.left + nButtonWidth;
nNextXOffsetRight = m_rectButton.left - m_nHorzElementOffset;
// only in this case text at the left side of the button
bTextLeftOfButton = TRUE;
break;
case ALIGN_CENTER:
bButtonCenter = TRUE;
nNextXOffsetCenter -= nButtonWidth / 2;
if (m_textAlignment == ALIGN_LEFT)
{
bTextLeftOfButton = TRUE;
}
break;
default:
ASSERT (FALSE);
return;
}
}
CSize sizeText (0, 0);
if (!m_strText.IsEmpty ())
{
CRect rectText = rectClient;
sizeText.cy = dc.DrawText (m_strText, rectText, DT_CALCRECT | DT_VCENTER);
sizeText.cx = rectText.Width ();
m_rectText.top = nBaseLine - sizeText.cy / 2;
m_rectText.bottom = m_rectText.top + sizeText.cy;
switch (m_textAlignment)
{
case ALIGN_LEFT:
m_rectText.left = nNextXOffsetLeft;
break;
case ALIGN_RIGHT:
m_rectText.left = nNextXOffsetRight - sizeText.cx;
break;
case ALIGN_CENTER:
bTextCenter = TRUE;
nNextXOffsetCenter -= sizeText.cx / 2;
break;
default:
ASSERT (FALSE);
return;
}
m_rectText.right = m_rectText.left + sizeText.cx;
AdjustRectToMargin (m_rectText, rectClient, m_nMargin);
m_rectDrawText = m_rectText;
}
if (bIconCenter)
{
m_rectImage.left = nNextXOffsetCenter;
m_rectImage.right = m_rectImage.left + sizeImage.cx;
nNextXOffsetCenter = m_rectImage.right + m_nHorzElementOffset;
}
if (bButtonCenter)
{
m_rectButton.left = nNextXOffsetCenter;
m_rectButton.right = m_rectButton.left + nButtonWidth;
nNextXOffsetCenter = m_rectButton.right + m_nHorzElementOffset;
}
if (bTextCenter)
{
m_rectText.left = nNextXOffsetCenter;
m_rectText.right = m_rectText.left + sizeText.cx;
AdjustRectToMargin (m_rectText, rectClient, m_nMargin);
m_rectDrawText = m_rectText;
}
if (IsImageSet ())
{
// do not retain image size if it should be stretched
AdjustRectToMargin (m_rectImage, rectClient, m_nMargin, !m_bStretchImage);
}
CRect rectButtonTemp = m_rectButton;
if (!m_strBtnText.IsEmpty () && IsImageSet ())
{
CheckRectangle (rectButtonTemp, m_rectImage, bButtonLeftOfIcon);
}
if (!m_strBtnText.IsEmpty ())
{
AdjustRectToMargin (rectButtonTemp, rectClient, m_nMargin);
}
if (!m_strText.IsEmpty ())
{
CheckRectangle (m_rectDrawText, m_rectImage, bTextLeftOfIcon);
CheckRectangle (m_rectDrawText, rectButtonTemp, bTextLeftOfButton);
}
dc.SelectObject (pOldFont);
}
//*****************************************************************************
BOOL CBCGPCaptionBar::CheckRectangle (CRect& rectSrc, const CRect& rectOther,
BOOL bLeftOf)
{
if (rectSrc.IsRectEmpty () || rectOther.IsRectEmpty ())
{
return FALSE;
}
CRect rectOtherWithOffset = rectOther;
rectOtherWithOffset.InflateRect (m_nHorzElementOffset, m_nHorzElementOffset);
if (rectSrc.left <= rectOtherWithOffset.right &&
rectSrc.left >= rectOtherWithOffset.left)
{
rectSrc.left = rectOtherWithOffset.right;
}
if (rectSrc.right >= rectOtherWithOffset.left &&
rectSrc.right <= rectOtherWithOffset.right)
{
rectSrc.right = rectOtherWithOffset.left;
}
if (rectSrc.left >= rectOtherWithOffset.left &&
rectSrc.right <= rectOtherWithOffset.right)
{
rectSrc.right = rectSrc.left;
}
if (rectSrc.left <= rectOtherWithOffset.left &&
rectSrc.right >= rectOtherWithOffset.right)
{
if (bLeftOf)
{
rectSrc.right = rectOtherWithOffset.left;
}
else
{
rectSrc.left = rectOtherWithOffset.right;
}
}
if (bLeftOf && rectSrc.left >= rectOtherWithOffset.right ||
!bLeftOf && rectSrc.right <= rectOtherWithOffset.left)
{
rectSrc.left = rectSrc.right;
}
return FALSE;
}
//*****************************************************************************
void CBCGPCaptionBar::AdjustRectToMargin (CRect& rectSrc, const CRect& rectClient,
int nMargin, BOOL bRetainSize)
{
BOOL bLeftChanged = FALSE;
BOOL bRightChanged = FALSE;
int nWidth = rectSrc.Width ();
if (rectSrc.left < rectClient.left + nMargin)
{
rectSrc.left = rectClient.left + nMargin;
bLeftChanged = TRUE;
}
if (rectSrc.right > rectClient.right - nMargin)
{
rectSrc.right = rectClient.right - nMargin;
bRightChanged = TRUE;
}
if (bRetainSize)
{
if (bLeftChanged)
{
rectSrc.right = rectSrc.left + nWidth;
}
else if (bRightChanged)
{
rectSrc.left = rectSrc.right - nWidth;
}
}
}
//*****************************************************************************
CSize CBCGPCaptionBar::GetImageSize () const
{
if (m_Bitmap.GetCount () > 0)
{
ASSERT (m_hIcon == NULL);
return m_Bitmap.GetImageSize ();
}
if (m_hIcon == NULL)
{
return CSize (0, 0);
}
ICONINFO info;
memset (&info, 0, sizeof (ICONINFO));
::GetIconInfo (m_hIcon, &info);
HBITMAP hBmp = info.hbmColor;
BITMAP bmp;
::GetObject (hBmp, sizeof (BITMAP), (LPVOID) &bmp);
::DeleteObject (info.hbmColor);
::DeleteObject (info.hbmMask);
return CSize (bmp.bmWidth, bmp.bmHeight);
}
//*****************************************************************************
BOOL CBCGPCaptionBar::OnEraseBkgnd(CDC* pDC)
{
CRect rectClient;
GetClientRect (&rectClient);
OnDrawBackground (pDC, rectClient);
return TRUE;
}
//*************************************************************************************
void CBCGPCaptionBar::OnLButtonDown(UINT nFlags, CPoint point)
{
CBCGPControlBar::OnLButtonDown(nFlags, point);
if (m_uiBtnID == 0 || !m_bBtnEnabled || !m_bIsBtnHighlighted)
{
return;
}
m_bIsBtnPressed = TRUE;
InvalidateRect (m_rectButton);
UpdateWindow ();
ASSERT_VALID (GetOwner ());
GetOwner()->SendMessage (WM_COMMAND, m_uiBtnID);
}
//*************************************************************************************
void CBCGPCaptionBar::OnLButtonUp(UINT nFlags, CPoint point)
{
if (m_bIsBtnPressed)
{
m_bIsBtnPressed = FALSE;
InvalidateRect (m_rectButton);
UpdateWindow ();
}
CBCGPControlBar::OnLButtonUp(nFlags, point);
}
//*************************************************************************************
void CBCGPCaptionBar::OnMouseMove(UINT nFlags, CPoint point)
{
CBCGPControlBar::OnMouseMove(nFlags, point);
if (m_uiBtnID == 0 || !m_bBtnEnabled)
{
return;
}
BOOL bIsBtnHighlighted = m_rectButton.PtInRect (point);
if (m_bIsBtnHighlighted != bIsBtnHighlighted)
{
m_bIsBtnHighlighted = bIsBtnHighlighted;
m_bIsBtnPressed = (nFlags & MK_LBUTTON) && m_bIsBtnHighlighted;
InvalidateRect (m_rectButton);
UpdateWindow ();
}
if (!m_bTracked)
{
m_bTracked = TRUE;
TRACKMOUSEEVENT trackmouseevent;
trackmouseevent.cbSize = sizeof(trackmouseevent);
trackmouseevent.dwFlags = TME_LEAVE;
trackmouseevent.hwndTrack = GetSafeHwnd();
trackmouseevent.dwHoverTime = HOVER_DEFAULT;
::BCGPTrackMouse (&trackmouseevent);
}
}
//*****************************************************************************************
afx_msg LRESULT CBCGPCaptionBar::OnMouseLeave(WPARAM,LPARAM)
{
m_bTracked = FALSE;
if (m_bIsBtnPressed || m_bIsBtnHighlighted)
{
m_bIsBtnPressed = FALSE;
m_bIsBtnHighlighted = FALSE;
InvalidateRect (m_rectButton);
UpdateWindow ();
}
return 0;
}
//***************************************************************************************
void CBCGPCaptionBar::AdjustLayout ()
{
if (GetSafeHwnd () == NULL)
{
return;
}
CFrameWnd* pParent = BCGPGetParentFrame (this);
if (pParent != NULL && pParent->GetSafeHwnd () != NULL)
{
pParent->RecalcLayout ();
}
RecalcLayout ();
}
//*********************************************************************************
void CBCGPCaptionBar::OnRButtonUp(UINT nFlags, CPoint point)
{
if (!CBCGPToolBar::IsCustomizeMode ())
{
ASSERT_VALID (GetOwner ());
ClientToScreen (&point);
GetOwner ()->SendMessage (BCGM_TOOLBARMENU,
(WPARAM) GetSafeHwnd (),
MAKELPARAM(point.x, point.y));
return;
}
CBCGPControlBar::OnRButtonUp(nFlags, point);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -