📄 bcgppopupmenu.cpp
字号:
{
CBCGPLocalResource locaRes;
m_wndToolTip.Create (this);
m_wndToolTip.Activate (TRUE);
if (globalData.m_nMaxToolTipWidth != -1)
{
m_wndToolTip.SetMaxTipWidth(globalData.m_nMaxToolTipWidth);
}
m_wndToolTip.AddTool (this, IDS_TEAR_OFF, m_rectTearOffCaption, 1);
}
}
//---------------------------------------------
// Adjust the menu position by the screen size:
//---------------------------------------------
if ((m_bRightAlign && (m_ptLocation.x < rectScreen.left)) ||
(!m_bRightAlign && (m_ptLocation.x + size.cx > rectScreen.right)))
{
//-----------------------------------------------------
// Menu can't be overlapped with the parent popup menu!
//-----------------------------------------------------
CBCGPPopupMenu* pParentMenu = GetParentPopupMenu ();
CBCGPMenuBar* pParentMenuBar = m_pParentBtn == NULL ? NULL :
DYNAMIC_DOWNCAST (CBCGPMenuBar, m_pParentBtn->m_pWndParent);
if (pParentMenu != NULL)
{
CRect rectParent;
pParentMenu->GetWindowRect (rectParent);
m_ptLocation.x = rectParent.left - size.cx;
m_DropDirection = DROP_DIRECTION_LEFT;
}
else if (pParentMenuBar != NULL &&
(pParentMenuBar->IsHorizontal ()) == 0)
{
//------------------------------------------------
// Parent menu bar is docked vertical, place menu
// in the left or right side of the parent frame:
//------------------------------------------------
CRect rectParentBtn = m_pParentBtn->Rect();
pParentMenuBar->ClientToScreen(&rectParentBtn);
m_ptLocation.x = rectParentBtn.left - size.cx;
m_DropDirection = DROP_DIRECTION_LEFT;
}
else
{
if (m_bRightAlign)
{
m_ptLocation.x = rectScreen.left + 1;
}
else
{
m_ptLocation.x = rectScreen.right - size.cx - 1;
}
}
if (m_ptLocation.x < rectScreen.left)
{
m_ptLocation.x = rectScreen.left;
m_DropDirection = DROP_DIRECTION_NONE;
}
if (m_AnimationType == UNFOLD)
{
m_bIsAnimRight = FALSE;
}
else if (m_AnimationType == FADE)
{
m_bIsAnimRight = FALSE;
m_bIsAnimDown = FALSE;
}
}
if (m_ptLocation.y + size.cy > rectScreen.bottom)
{
m_bIsAnimDown = FALSE;
if (m_pParentBtn != NULL && m_pParentBtn->GetParentWnd () != NULL &&
GetParentPopupMenu () == NULL)
{
CPoint ptRight (m_pParentBtn->Rect ().right, 0);
m_pParentBtn->GetParentWnd ()->ClientToScreen (&ptRight);
CPoint ptTop (0, m_pParentBtn->Rect ().top - size.cy);
m_pParentBtn->GetParentWnd ()->ClientToScreen (&ptTop);
if (ptTop.y < 0)
{
int yParentButtonTop = ptTop.y + size.cy;
//-----------------------------------------------------
// Where more space: on top or on bottom of the button?
//-----------------------------------------------------
if (rectScreen.bottom - yParentButtonTop <
yParentButtonTop - rectScreen.top)
{
m_ptLocation.y = rectScreen.top;
m_DropDirection = DROP_DIRECTION_NONE;
size.cy += ptTop.y;
}
else
{
size.cy = rectScreen.bottom - m_ptLocation.y;
m_bIsAnimDown = TRUE;
}
m_bScrollable = TRUE;
}
else
{
m_ptLocation.y = ptTop.y;
m_DropDirection = DROP_DIRECTION_TOP;
}
}
else
{
m_ptLocation.y -= size.cy;
if (GetParentPopupMenu () != NULL)
{
m_ptLocation.y += pMenuBar->GetRowHeight () + nBorderSize * 2;
}
}
if (m_ptLocation.y < rectScreen.top)
{
m_ptLocation.y = rectScreen.top;
m_DropDirection = DROP_DIRECTION_NONE;
}
if (m_ptLocation.y + size.cy > rectScreen.bottom)
{
size.cy = rectScreen.bottom - m_ptLocation.y;
m_bScrollable = TRUE;
}
}
//---------------------------------
// Prepare Quick Customize Drawing
//----------------------------------
if (CBCGPVisualManager::GetInstance ()->IsOfficeXPStyleMenus ())
{
CBCGPPopupMenu* pParentPopup = GetParentPopupMenu();
if (pParentPopup != NULL)
{
CBCGPToolbarMenuButton* pParentBtn = GetParentButton();
if ((pParentBtn != NULL) && (pParentBtn->IsQuickMode()))
{
pParentPopup->RedrawWindow();
if (pParentPopup->IsQuickCustomize())
{
if (!m_bQuickCusomize)
{
if (m_DropDirection == DROP_DIRECTION_LEFT)
{
m_ptLocation.x += 4;
m_ptLocation.y ++;
}
else
{
m_ptLocation.x -= 4;
m_ptLocation.y ++;
}
}
}
}
}
}
//------------------------------------------------------
m_FinalSize = size;
if (m_AnimationType != NO_ANIMATION || m_bAnimationIsDone ||
CBCGPToolBar::IsCustomizeMode ())
{
if (!CBCGPToolBar::IsCustomizeMode ())
{
size.cx += m_iShadowSize;
size.cy += m_iShadowSize;
}
if (m_pMenuCustomizationPage != NULL)
{
SetWindowPos (NULL, -1, -1, size.cx, size.cy,
SWP_NOMOVE | SWP_NOZORDER |
SWP_NOACTIVATE);
}
else
{
SetWindowPos (NULL, m_ptLocation.x, m_ptLocation.y, size.cx, size.cy,
SWP_NOZORDER | SWP_NOACTIVATE);
}
}
if (CBCGPToolBar::IsCustomizeMode ())
{
pMenuBar->AdjustLocations ();
}
//---------------------------------------------------
// Parent button maybe covered by shadow, repaint it:
//---------------------------------------------------
if (m_iShadowSize != 0 &&
!CBCGPToolBar::IsCustomizeMode () &&
m_pParentBtn != NULL &&
m_pParentBtn->GetParentWnd () != NULL)
{
BOOL bOldShown = m_bShown;
m_bShown = TRUE;
CWnd* pWndParent = m_pParentBtn->GetParentWnd ();
CRect rectInter;
CRect rectMenu;
GetWindowRect (rectMenu);
CRect rectShadowRight (CPoint (rectMenu.right + 1, rectMenu.top),
CSize (m_iShadowSize, rectMenu.Height () + m_iShadowSize));
pWndParent->ScreenToClient (&rectShadowRight);
if (rectInter.IntersectRect (rectShadowRight, m_pParentBtn->m_rect))
{
pWndParent->InvalidateRect (m_pParentBtn->m_rect);
pWndParent->UpdateWindow ();
}
CRect rectShadowBottom (CPoint (rectMenu.left, rectMenu.bottom + 1),
CSize (rectMenu.Width () + m_iShadowSize, m_iShadowSize));
pWndParent->ScreenToClient (&rectShadowBottom);
if (rectInter.IntersectRect (rectShadowBottom, m_pParentBtn->m_rect))
{
pWndParent->InvalidateRect (m_pParentBtn->m_rect);
pWndParent->UpdateWindow ();
}
m_bShown = bOldShown;
}
}
//****************************************************************************************
void CBCGPPopupMenu::OnDestroy()
{
if (m_bQuickCusomize)
{
//------------------------------
// Restore recently used state
//------------------------------
CBCGPMenuBar::SetRecentlyUsedMenus(CBCGPCustomizeMenuButton::m_bRecentlyUsedOld);
//--------------------------------
// Made caption button non-selected
//--------------------------------
CWnd* pWnd = GetOwner();
if (pWnd != NULL)
{
if (pWnd->IsKindOf(RUNTIME_CLASS(CBCGPMiniFrameWnd)))
{
CBCGPMiniFrameWnd* pMiniFrm = DYNAMIC_DOWNCAST (CBCGPMiniFrameWnd, pWnd);
CBCGPCaptionMenuButton* pBtn = (CBCGPCaptionMenuButton *)pMiniFrm->FindButton(HTMENU_BCG);
if (pBtn != NULL)
{
pBtn->m_bPushed = FALSE;
pMiniFrm->OnNcPaint();
}
}
}
}
CBCGPPopupMenuBar* pMenuBar = GetMenuBar ();
ASSERT_VALID (pMenuBar);
//---------------------------------------------------------
// First, maybe we have a dragged menu item. Remove it now:
//---------------------------------------------------------
if (pMenuBar->m_pDragButton != NULL &&
!pMenuBar->m_bIsDragCopy)
{
pMenuBar->RemoveButton (
pMenuBar->ButtonToIndex (pMenuBar->m_pDragButton));
pMenuBar->m_pDragButton = NULL;
}
if (m_pParentBtn != NULL)
{
ASSERT (m_pParentBtn->m_pPopupMenu == this);
SaveState ();
m_pParentBtn->m_pPopupMenu = NULL;
m_pParentBtn->m_bClickedOnMenu = FALSE;
CBCGPPopupMenu* pParentMenu = GetParentPopupMenu ();
if (pParentMenu != NULL)
{
if (m_bAutoDestroyParent && !CBCGPToolBar::IsCustomizeMode ())
{
//-------------------------------------------
// Automatically close the parent popup menu:
//-------------------------------------------
pParentMenu->SendMessage (WM_CLOSE);
m_pParentBtn = NULL;
}
}
}
else
{
CBCGPMenuBar::SetShowAllCommands (FALSE);
}
#ifndef BCG_NO_CUSTOMIZATION
if (m_pMenuCustomizationPage != NULL)
{
m_pMenuCustomizationPage->CloseContextMenu (this);
}
#endif // BCG_NO_CUSTOMIZATION
NotifyParentDlg (FALSE);
//------------------------------------------------
// Inform the main frame about the menu detsroyng:
//------------------------------------------------
CFrameWnd* pWndMain = BCGCBProGetTopLevelFrame (this);
CBCGPMDIFrameWnd* pMainFrame = DYNAMIC_DOWNCAST (CBCGPMDIFrameWnd, pWndMain);
if (pMainFrame != NULL)
{
pMainFrame->OnClosePopupMenu (this);
}
else // Maybe, SDI frame...
{
CBCGPFrameWnd* pFrame = DYNAMIC_DOWNCAST (CBCGPFrameWnd, pWndMain);
if (pFrame != NULL)
{
pFrame->OnClosePopupMenu (this);
}
else // Maybe, OLE frame...
{
CBCGPOleIPFrameWnd* pOleFrame =
DYNAMIC_DOWNCAST (CBCGPOleIPFrameWnd, pWndMain);
if (pOleFrame != NULL)
{
pOleFrame->OnClosePopupMenu (this);
}
else
{
CBCGPOleDocIPFrameWnd* pOleDocFrame =
DYNAMIC_DOWNCAST (CBCGPOleDocIPFrameWnd, pWndMain);
if (pOleDocFrame != NULL)
{
pOleDocFrame->OnClosePopupMenu (this);
}
}
}
}
if (m_bTrackMode && CBCGPPopupMenu::m_pActivePopupMenu == this)
{
CBCGPPopupMenu::m_pActivePopupMenu = NULL;
}
if (!CBCGPToolBar::IsCustomizeMode () &&
pWndMain != NULL && m_pActivePopupMenu == NULL &&
GetParentToolBar () != NULL &&
GetParentToolBar () != GetFocus ())
{
GetParentToolBar ()->Deactivate ();
}
CMiniFrameWnd::OnDestroy();
}
//****************************************************************************************
void CBCGPPopupMenu::PostNcDestroy()
{
if (m_pParentBtn != NULL)
{
m_pParentBtn->OnCancelMode ();
}
CMiniFrameWnd::PostNcDestroy();
}
//****************************************************************************************
void CBCGPPopupMenu::SaveState ()
{
if (!CBCGPToolBar::IsCustomizeMode ())
{
return;
}
if (m_pParentBtn == NULL || m_pParentBtn->IsMenuPaletteMode ())
{
return;
}
ASSERT_VALID (m_pParentBtn);
CBCGPPopupMenuBar* pMenuBar = GetMenuBar ();
ASSERT_VALID (pMenuBar);
HMENU hmenu = pMenuBar->ExportToMenu ();
ASSERT (hmenu != NULL);
m_pParentBtn->CreateFromMenu (hmenu);
::DestroyMenu (hmenu);
CBCGPPopupMenu* pParentMenu = GetParentPopupMenu ();
if (pParentMenu != NULL)
{
pParentMenu->SaveState ();
}
}
//****************************************************************************************
void CBCGPPopupMenu::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
ASSERT_VALID (this);
CBCGPPopupMenuBar* pMenuBar = GetMenuBar ();
ASSERT_VALID (pMenuBar);
#ifdef _DEBUG
if (m_pParentBtn != NULL)
{
ASSERT_VALID (m_pParentBtn);
ASSERT (m_pParentBtn->m_pPopupMenu == this);
}
#endif // _DEBUG
BOOL bHightlightWasChanged = FALSE;
switch (nChar)
{
case VK_RIGHT:
{
//-------------------------------------------
// Save animation type and disable animation:
//-------------------------------------------
ANIMATION_TYPE animType = m_AnimationType;
m_AnimationType = NO_ANIMATION;
//-------------------------------
// Try to open next cascade menu:
//-------------------------------
CBCGPToolbarMenuButton* pSelItem = GetSelItem ();
if (pSelItem != NULL &&
(pSelItem->m_nID == (UINT) -1 || pSelItem->m_nID == 0 ||
pSelItem->IsEmptyMenuAllowed ()) &&
pSelItem->OpenPopupMenu ())
{
if (pSelItem->m_pPopupMenu != NULL)
{
//--------------------------
// Select a first menu item:
//--------------------------
if (GetSelItem () == pSelItem)
{
pSelItem->m_pPopupMenu->OnKeyDown (VK_HOME, 0, 0);
}
}
}
else
{
//------------------------------------------------------
// No next menu, first try to go to the parent menu bar:
//------------------------------------------------------
CBCGPToolBar* pToolBar = GetParentToolBar ();
if (pToolBar != NULL &&
!pToolBar->IsKindOf (RUNTIME_CLASS (CBCGPPopupMenuBar)))
{
pToolBar->NextMenu ();
}
else
{
//------------------------------------------------------
// Close the current menu and move control to the parent
// popup menu:
//------------------------------------------------------
CBCGPPopupMenu* pParenMenu = GetParentPopupMenu ();
if (pParenMenu != NULL)
{
pParenMenu->SendMessage (WM_KEYDOWN, VK_RIGHT);
}
}
}
//------------------------
// Restore animation type:
//------------------------
m_AnimationType = animType;
}
return;
case VK_LEFT:
{
CBCGPToolBar* pToolBar = GetParentToolBar ();
if (pToolBar != NULL)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -