📄 bcgppopupmenu.cpp
字号:
switch (m_nLogoLocation)
{
case MENU_LOGO_LEFT:
rectLogo.right = rectLogo.left + nBorderSize + m_iLogoWidth;
break;
case MENU_LOGO_RIGHT:
rectLogo.left = rectLogo.right - nBorderSize - m_iLogoWidth;
break;
case MENU_LOGO_TOP:
rectLogo.bottom = rectLogo.top + nBorderSize + m_iLogoWidth;
break;
case MENU_LOGO_BOTTOM:
rectLogo.top = rectLogo.bottom - nBorderSize - m_iLogoWidth;
break;
}
CFrameWnd* pWndMain = BCGCBProGetTopLevelFrame (this);
CBCGPMDIFrameWnd* pMainFrame = DYNAMIC_DOWNCAST (CBCGPMDIFrameWnd, pWndMain);
if (pMainFrame != NULL)
{
pMainFrame->OnDrawMenuLogo (pPaintDC, this, rectLogo);
}
else // Maybe, SDI frame...
{
CBCGPFrameWnd* pFrame = DYNAMIC_DOWNCAST (CBCGPFrameWnd, pWndMain);
if (pFrame != NULL)
{
pFrame->OnDrawMenuLogo (pPaintDC, this, rectLogo);
}
else // Maybe, OLE frame...
{
CBCGPOleIPFrameWnd* pOleFrame =
DYNAMIC_DOWNCAST (CBCGPOleIPFrameWnd, pWndMain);
if (pOleFrame != NULL)
{
pOleFrame->OnDrawMenuLogo (pPaintDC, this, rectLogo);
}
else
{
CBCGPOleDocIPFrameWnd* pOleDocFrame =
DYNAMIC_DOWNCAST (CBCGPOleDocIPFrameWnd, pWndMain);
if (pOleDocFrame != NULL)
{
pOleDocFrame->OnDrawMenuLogo (pPaintDC, this, rectLogo);
}
}
}
}
}
if (!m_rectTearOffCaption.IsRectEmpty ())
{
CBCGPVisualManager::GetInstance ()->OnDrawTearOffCaption (
pPaintDC, m_rectTearOffCaption, m_bIsTearOffCaptionActive);
}
if (IsScrollUpAvailable ())
{
DrawImage (pPaintDC, m_rectScrollUp,
CMenuImages::IdArowUp, m_iScrollMode < 0);
}
if (IsScrollDnAvailable ())
{
DrawImage (pPaintDC, m_rectScrollDn,
CMenuImages::IdArowDown, m_iScrollMode > 0);
}
m_bShown = TRUE;
}
//*************************************************************************************
void CBCGPPopupMenu::DrawFade (CDC* pPaintDC)
{
CRect rectClient;
GetClientRect (&rectClient);
int cx = m_FinalSize.cx + m_iShadowSize;
int cy = m_FinalSize.cy + m_iShadowSize;
CDC dcMem;
if (!dcMem.CreateCompatibleDC (pPaintDC))
{
return;
}
// create the three bitmaps if not done yet
if (m_bmpScreenDst.GetSafeHandle() == NULL)
{
CBitmap* pBmpOld = NULL;
if (m_AnimationType == FADE || globalData.m_nBitsPerPixel > 8)
{
// Fill in the BITMAPINFOHEADER
BITMAPINFOHEADER bih;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biWidth = cx;
bih.biHeight = cy;
bih.biPlanes = 1;
bih.biBitCount = 32;
bih.biCompression = BI_RGB;
bih.biSizeImage = cx * cy;
bih.biXPelsPerMeter = 0;
bih.biYPelsPerMeter = 0;
bih.biClrUsed = 0;
bih.biClrImportant = 0;
HBITMAP hmbpDib;
// Create a DIB section and attach it to the source bitmap
hmbpDib = CreateDIBSection (
dcMem.m_hDC, (LPBITMAPINFO)&bih, DIB_RGB_COLORS, (void **)&m_cFadeSrcBits,
NULL, NULL);
if (hmbpDib == NULL || m_cFadeSrcBits == NULL)
{
return;
}
m_bmpScreenSrc.Attach( hmbpDib );
// Create a DIB section and attach it to the destination bitmap
hmbpDib = CreateDIBSection (
dcMem.m_hDC, (LPBITMAPINFO)&bih, DIB_RGB_COLORS, (void **)&m_cFadeDstBits,
NULL, NULL);
if (hmbpDib == NULL || m_cFadeDstBits == NULL)
{
return;
}
m_bmpScreenDst.Attach( hmbpDib );
// Create a DIB section and attach it to the temporary bitmap
hmbpDib = CreateDIBSection (
dcMem.m_hDC, (LPBITMAPINFO)&bih, DIB_RGB_COLORS, (void **)&m_cFadeTmpBits,
NULL, NULL);
if (hmbpDib == NULL || m_cFadeTmpBits == NULL)
{
return;
}
m_bmpScreenTmp.Attach( hmbpDib );
// get source image, representing the window below the popup menu
pBmpOld = dcMem.SelectObject (&m_bmpScreenSrc);
dcMem.BitBlt (0, 0, cx, cy, pPaintDC, rectClient.left, rectClient.top, SRCCOPY);
// copy it to the destination so that shadow will be ok
memcpy (m_cFadeDstBits, m_cFadeSrcBits, sizeof(COLORREF)* cx*cy);
dcMem.SelectObject (&m_bmpScreenDst);
}
else
{
m_bmpScreenDst.CreateCompatibleBitmap (pPaintDC, cx, cy);
pBmpOld = dcMem.SelectObject (&m_bmpScreenDst);
}
// get final image
CRect rect;
DoPaint (&dcMem);
CBCGPPopupMenuBar* pMenuBar = GetMenuBar ();
ASSERT_VALID (pMenuBar);
pMenuBar->GetWindowRect (&rect);
ScreenToClient (&rect);
dcMem.SetViewportOrg (rect.TopLeft());
pMenuBar->DoPaint (&dcMem);
dcMem.SetViewportOrg (CPoint (0,0));
dcMem.SelectObject (pBmpOld);
}
COLORREF *src = m_cFadeSrcBits;
COLORREF *dst = m_cFadeDstBits;
COLORREF *tmp = m_cFadeTmpBits;
CBitmap* pBmpOld = NULL;
switch (m_AnimationType)
{
case UNFOLD:
case SLIDE:
pBmpOld = dcMem.SelectObject (&m_bmpScreenDst);
pPaintDC->BitBlt (
m_bIsAnimRight ? rectClient.left : rectClient.right - m_AnimSize.cx,
m_bIsAnimDown ? rectClient.top : rectClient.bottom - m_AnimSize.cy,
m_AnimSize.cx, m_AnimSize.cy, &dcMem, 0, 0, SRCCOPY);
break;
case FADE:
pBmpOld = dcMem.SelectObject (&m_bmpScreenTmp);
for (int pixel = 0; pixel < cx * cy; pixel++)
{
*tmp++ = CBCGPDrawManager::PixelAlpha (*src++, *dst++, 100 - m_iFadePercent);
}
pPaintDC->BitBlt (rectClient.left, rectClient.top, cx, cy,
&dcMem, 0, 0, SRCCOPY);
}
dcMem.SelectObject (pBmpOld);
}
//************************************************************************************
BOOL CBCGPPopupMenu::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
if (!CMiniFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
{
return m_pMessageWnd != NULL ?
m_pMessageWnd->OnCmdMsg (nID, nCode, pExtra, pHandlerInfo) : FALSE;
}
return TRUE;
}
//************************************************************************************
BOOL CBCGPPopupMenu::PostCommand (UINT commandID)
{
if (m_pMessageWnd != NULL)
{
return m_pMessageWnd->PostMessage (WM_COMMAND, commandID);
}
return FALSE;
}
//************************************************************************************
void CBCGPPopupMenu::EnableMenuLogo (int iLogoSize, LOGO_LOCATION nLogoLocation/* = MENU_LOGO_LEFT*/)
{
m_iLogoWidth = iLogoSize;
m_nLogoLocation = nLogoLocation;
RecalcLayout ();
}
//************************************************************************************
BOOL CBCGPPopupMenu::AdjustScroll (BOOL bForceMenuBarResize)
{
CBCGPPopupMenuBar* pMenuBar = GetMenuBar ();
ASSERT_VALID (pMenuBar);
CRect rectClient;
GetClientRect (rectClient);
if (!CBCGPToolBar::IsCustomizeMode ())
{
rectClient.right -= m_iShadowSize;
rectClient.bottom -= m_iShadowSize;
}
const int nBorderSize = CBCGPVisualManager::GetInstance ()->GetPopupMenuBorderSize ();
rectClient.DeflateRect (nBorderSize, nBorderSize);
switch (m_nLogoLocation)
{
case MENU_LOGO_LEFT:
rectClient.left += m_iLogoWidth;
break;
case MENU_LOGO_RIGHT:
rectClient.right -= m_iLogoWidth;
break;
case MENU_LOGO_TOP:
rectClient.top += m_iLogoWidth;
break;
case MENU_LOGO_BOTTOM:
rectClient.bottom -= m_iLogoWidth;
break;
}
rectClient.top += m_rectTearOffCaption.Height ();
CRect rectScrollUpOld = m_rectScrollUp;
CRect rectScrollDnOld = m_rectScrollDn;
m_rectScrollUp.SetRectEmpty ();
m_rectScrollDn.SetRectEmpty ();
UINT uiSWPFlags = SWP_NOZORDER | SWP_NOACTIVATE;
if (m_bScrollable)
{
if (IsScrollUpAvailable ())
{
m_rectScrollUp = rectClient;
m_rectScrollUp.top += nBorderSize;
m_rectScrollUp.bottom = m_rectScrollUp.top + m_iScrollBtnHeight;
rectClient.top += m_iScrollBtnHeight + nBorderSize;
}
if (IsScrollDnAvailable ())
{
m_rectScrollDn = rectClient;
m_rectScrollDn.top = m_rectScrollDn.bottom - m_iScrollBtnHeight;
rectClient.bottom -= m_iScrollBtnHeight + nBorderSize;
}
}
else if (!m_bAnimationIsDone)
{
uiSWPFlags |= SWP_NOREDRAW;
KillTimer (iScrollTimerId);
m_iScrollMode = 0;
}
if (bForceMenuBarResize ||
rectScrollUpOld != m_rectScrollUp ||
rectScrollDnOld != m_rectScrollDn)
{
pMenuBar->SetWindowPos (NULL, rectClient.left, rectClient.top,
rectClient.Width (),
rectClient.Height (),
uiSWPFlags);
m_nMenuBarHeight = rectClient.Height ();
}
else
{
pMenuBar->AdjustLayout ();
}
BOOL bScrollButtonsChanged = FALSE;
if (rectScrollUpOld != m_rectScrollUp)
{
InvalidateRect (rectScrollUpOld);
InvalidateRect (m_rectScrollUp);
bScrollButtonsChanged = TRUE;
}
if (rectScrollDnOld != m_rectScrollDn)
{
InvalidateRect (rectScrollDnOld);
InvalidateRect (m_rectScrollDn);
bScrollButtonsChanged = TRUE;
}
if (bScrollButtonsChanged)
{
UpdateWindow ();
}
return bScrollButtonsChanged;
}
//************************************************************************************
CBCGPPopupMenu::MENUAREA_TYPE CBCGPPopupMenu::CheckArea (const CPoint& ptScreen) const
{
ASSERT_VALID (this);
CRect rectWindow;
GetClientRect (rectWindow);
ClientToScreen (rectWindow);
if (!rectWindow.PtInRect (ptScreen))
{
return OUTSIDE;
}
CRect rectLogo = rectWindow;
switch (m_nLogoLocation)
{
case MENU_LOGO_LEFT:
rectLogo.right = rectLogo.left + m_iLogoWidth;
break;
case MENU_LOGO_RIGHT:
rectLogo.left = rectLogo.right - m_iLogoWidth;
break;
case MENU_LOGO_TOP:
rectLogo.bottom = rectLogo.top + m_iLogoWidth;
break;
case MENU_LOGO_BOTTOM:
rectLogo.top = rectLogo.bottom - m_iLogoWidth;
break;
}
if (rectLogo.PtInRect (ptScreen))
{
return LOGO;
}
if (ptScreen.x > rectWindow.right - m_iShadowSize)
{
return SHADOW_RIGHT;
}
if (ptScreen.y > rectWindow.bottom - m_iShadowSize)
{
return SHADOW_BOTTOM;
}
if (!m_rectTearOffCaption.IsRectEmpty ())
{
CRect rectTearOffCaption = m_rectTearOffCaption;
ClientToScreen (&rectTearOffCaption);
if (rectTearOffCaption.PtInRect (ptScreen))
{
return TEAROFF_CAPTION;
}
}
return MENU;
}
//************************************************************************************
void CBCGPPopupMenu::OnLButtonDown(UINT nFlags, CPoint point)
{
if (!CBCGPToolBar::IsCustomizeMode () &&
m_rectTearOffCaption.PtInRect (point))
{
m_bIsTearOffCaptionActive = TRUE;
InvalidateRect (m_rectTearOffCaption);
m_bTearOffTracking = TRUE;
SetCapture ();
return;
}
CMiniFrameWnd::OnLButtonDown(nFlags, point);
}
//*************************************************************************************
void CBCGPPopupMenu::OnLButtonUp(UINT nFlags, CPoint point)
{
if (m_bTearOffTracking)
{
m_bTearOffTracking = FALSE;
ReleaseCapture ();
m_bIsTearOffCaptionActive = FALSE;
InvalidateRect (m_rectTearOffCaption);
}
CMiniFrameWnd::OnLButtonUp(nFlags, point);
}
//*************************************************************************************
BOOL CBCGPPopupMenu::TearOff (CPoint point)
{
if (m_pParentBtn == NULL)
{
ASSERT (FALSE);
return FALSE;
}
UINT uiID = m_pParentBtn->m_uiTearOffBarID;
if (uiID == 0)
{
ASSERT (FALSE);
return FALSE;
}
CPoint ptScreen = point;
ClientToScreen (&ptScreen);
CFrameWnd* pWndMain = BCGCBProGetTopLevelFrame (this);
if (pWndMain == NULL)
{
return FALSE;
}
CBCGPControlBar* pBar = NULL;
CBCGPFrameImpl* pFrameImpl = NULL;
CBCGPMDIFrameWnd* pMainFrame = DYNAMIC_DOWNCAST (CBCGPMDIFrameWnd, pWndMain);
if (pMainFrame != NULL)
{
pBar = (CBCGPControlBar*) pMainFrame->GetControlBar (uiID);
pFrameImpl = &pMainFrame->m_Impl;
}
else // Maybe, SDI frame...
{
CBCGPFrameWnd* pFrame = DYNAMIC_DOWNCAST (CBCGPFrameWnd, pWndMain);
if (pFrame != NULL)
{
pBar = (CBCGPControlBar*) pFrame->GetControlBar (uiID);
pFrameImpl = &pFrame->m_Impl;
}
else // Maybe, OLE frame...
{
CBCGPOleIPFrameWnd* pOleFrame =
DYNAMIC_DOWNCAST (CBCGPOleIPFrameWnd, pWndMain);
if (pOleFrame != NULL)
{
pBar = (CBCGPControlBar*) pOleFrame->GetControlBar (uiID);
pFrameImpl = &pOleFrame->m_Impl;
}
else
{
CBCGPOleDocIPFrameWnd* pOleDocFrame =
DYNAMIC_DOWNCAST (CBCGPOleDocIPFrameWnd, pWndMain);
if (pOleDocFrame != NULL)
{
pBar = (CBCGPControlBar*) pOleDocFrame->GetControlB
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -