📄 bcgpopupmenu.cpp
字号:
}
else if (pParentMenuBar != NULL &&
(pParentMenuBar->m_dwStyle & CBRS_ORIENT_HORZ) == 0)
{
//------------------------------------------------
// Parent menu bar is docked vertical, place menu
// in the left or right side of the parent frame:
//------------------------------------------------
CRect rectParent;
pParentMenuBar->GetWindowRect (rectParent);
m_ptLocation.x = rectParent.left - size.cx;
}
else
{
m_ptLocation.x = rectScreen.right - size.cx - 1;
}
if (m_ptLocation.x < rectScreen.left)
{
m_ptLocation.x = rectScreen.left;
}
if (m_AnimationType == UNFOLD)
{
m_bIsAnimRight = FALSE;
}
}
if (m_ptLocation.y + size.cy > rectScreen.bottom)
{
if (m_bScrollable)
{
size.cy = rectScreen.bottom - m_ptLocation.y;
}
else
{
if (m_pParentBtn != NULL && m_pParentBtn->GetParentWnd () != 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)
{
m_ptLocation.y = 0;
m_ptLocation.x = ptRight.x;
}
else
{
m_ptLocation.y = ptTop.y;
}
}
else
{
m_ptLocation.y -= size.cy;
}
if (m_ptLocation.y < rectScreen.top)
{
m_ptLocation.y = rectScreen.top;
}
}
if (m_ptLocation.y + size.cy > rectScreen.bottom)
{
EnableScrolling ();
}
m_bIsAnimDown = FALSE;
}
m_FinalSize = size;
//----------------------------------------------------------------
// If the final size is more, that half-screen (in either x or y),
// CS_SAVEBITS may not save a screen content under the menu. So,
// we need to save a area under the shadows:
//---------------------------------------------------------------
m_bSaveShadows = (m_FinalSize.cx >= rectScreen.Width ()) ||
(m_FinalSize.cy >= rectScreen.Height ());
if (m_bAnimationIsDone || CBCGToolBar::IsCustomizeMode ())
{
if (!CBCGToolBar::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 (CBCGToolBar::IsCustomizeMode ())
{
pMenuBar->AdjustLocations ();
}
//---------------------------------------------------
// Parent button maybe covered by shadow, repaint it:
//---------------------------------------------------
if (m_iShadowSize != 0 &&
m_bAnimationIsDone &&
!CBCGToolBar::IsCustomizeMode () &&
m_pParentBtn != NULL &&
m_pParentBtn->GetParentWnd () != NULL)
{
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 ();
}
else
{
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 ();
}
}
}
}
//****************************************************************************************
void CBCGPopupMenu::OnDestroy()
{
CBCGPopupMenuBar* 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;
CBCGPopupMenu* pParentMenu = GetParentPopupMenu ();
if (pParentMenu != NULL)
{
if (m_bAutoDestroyParent && !CBCGToolBar::IsCustomizeMode ())
{
//-------------------------------------------
// Automatically close the parent popup menu:
//-------------------------------------------
pParentMenu->SendMessage (WM_CLOSE);
m_pParentBtn = NULL;
}
else if (pParentMenu->m_iShadowSize > 0 &&
m_AnimationType != NO_ANIMATION)
{
//--------------------
// Redraw parent menu:
//--------------------
pParentMenu->ShowWindow (SW_HIDE);
pParentMenu->UpdateBottomWindows ();
pParentMenu->ShowWindow (SW_SHOWNOACTIVATE);
}
}
else
{
CBCGMenuBar* pParentMenuBar = m_pParentBtn == NULL ? NULL :
DYNAMIC_DOWNCAST (CBCGMenuBar, m_pParentBtn->m_pWndParent);
if (pParentMenuBar == NULL)
{
CBCGMenuBar::SetShowAllCommands (FALSE);
}
}
}
else
{
CBCGMenuBar::SetShowAllCommands (FALSE);
}
if (m_pMenuCustomizationPage != NULL)
{
m_pMenuCustomizationPage->CloseContextMenu (this);
}
//------------------------------------------------
// Inform the main frame about the menu detsroyng:
//------------------------------------------------
CFrameWnd* pWndMain = GetTopLevelFrame ();
CBCGMDIFrameWnd* pMainFrame = DYNAMIC_DOWNCAST (CBCGMDIFrameWnd, pWndMain);
if (pMainFrame != NULL)
{
pMainFrame->OnClosePopupMenu (this);
}
else // Maybe, SDI frame...
{
CBCGFrameWnd* pFrame = DYNAMIC_DOWNCAST (CBCGFrameWnd, pWndMain);
if (pFrame != NULL)
{
pFrame->OnClosePopupMenu (this);
}
else // Maybe, OLE frame...
{
CBCGOleIPFrameWnd* pOleFrame =
DYNAMIC_DOWNCAST (CBCGOleIPFrameWnd, pWndMain);
if (pOleFrame != NULL)
{
pOleFrame->OnClosePopupMenu (this);
}
}
}
CMiniFrameWnd::OnDestroy();
}
//****************************************************************************************
void CBCGPopupMenu::PostNcDestroy()
{
if (m_pParentBtn != NULL)
{
m_pParentBtn->OnCancelMode ();
}
CMiniFrameWnd::PostNcDestroy();
}
//****************************************************************************************
void CBCGPopupMenu::SaveState ()
{
if (!CBCGToolBar::IsCustomizeMode ())
{
return;
}
if (m_pParentBtn == NULL)
{
return;
}
ASSERT_VALID (m_pParentBtn);
CBCGPopupMenuBar* pMenuBar = GetMenuBar ();
ASSERT_VALID (pMenuBar);
HMENU hmenu = pMenuBar->ExportToMenu ();
ASSERT (hmenu != NULL);
m_pParentBtn->CreateFromMenu (hmenu);
::DestroyMenu (hmenu);
CBCGPopupMenu* pParentMenu = GetParentPopupMenu ();
if (pParentMenu != NULL)
{
pParentMenu->SaveState ();
}
}
//****************************************************************************************
void CBCGPopupMenu::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
ASSERT_VALID (this);
CBCGPopupMenuBar* 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:
//-------------------------------
CBCGToolbarMenuButton* pSelItem = GetSelItem ();
if (pSelItem != NULL &&
(pSelItem->m_nID == (UINT) -1 || pSelItem->m_nID == 0) &&
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:
//------------------------------------------------------
CBCGToolBar* pToolBar = GetParentToolBar ();
if (pToolBar != NULL &&
!pToolBar->IsKindOf (RUNTIME_CLASS (CBCGPopupMenuBar)))
{
pToolBar->NextMenu ();
}
else
{
//------------------------------------------------------
// Close the current menu and move control to the parent
// popup menu:
//------------------------------------------------------
CBCGPopupMenu* pParenMenu = GetParentPopupMenu ();
if (pParenMenu != NULL)
{
pParenMenu->SendMessage (WM_KEYDOWN, VK_RIGHT);
}
}
}
//------------------------
// Restore animation type:
//------------------------
m_AnimationType = animType;
}
return;
case VK_LEFT:
{
CBCGToolBar* pToolBar = GetParentToolBar ();
if (pToolBar != NULL)
{
pToolBar->PrevMenu ();
}
else if (m_pParentBtn != NULL && m_pParentBtn->IsDroppedDown ())
{
CloseMenu ();
}
}
return;
case VK_DOWN:
if ((::GetAsyncKeyState (VK_CONTROL) & 0x8000) && // Ctrl+Down
!pMenuBar->m_bAreAllCommandsShown)
{
ShowAllCommands ();
break;
}
case VK_UP:
case VK_HOME:
case VK_END:
bHightlightWasChanged = TRUE;
case VK_RETURN:
if (!CBCGToolBar::IsCustomizeMode ())
{
pMenuBar->OnKey (nChar);
}
break;
case VK_ESCAPE:
CloseMenu (TRUE);
return;
default:
if (pMenuBar->OnKey (nChar))
{
return;
}
else
{
CMiniFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}
}
if (bHightlightWasChanged &&
m_bScrollable && pMenuBar->m_iHighlighted >= 0)
{
//---------------------------------------
// Maybe, selected item is invisible now?
//---------------------------------------
CBCGToolbarButton* pItem = pMenuBar->GetButton (pMenuBar->m_iHighlighted);
if (pItem == NULL && pMenuBar->GetRowHeight () == 0)
{
ASSERT (FALSE);
}
else
{
CRect rectBar;
pMenuBar->GetClientRect (rectBar);
int iOffset = pMenuBar->GetOffset ();
int iOffsetDelta = 0;
if (pItem->Rect ().top < rectBar.top)
{
//---------------------
// Scroll up is needed!
//---------------------
iOffsetDelta = (pItem->Rect ().top - rectBar.top) /
pMenuBar->GetRowHeight () - 1;
}
else if (pItem->Rect ().bottom > rectBar.bottom)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -