bcgpopupmenubar.cpp
来自「用bcg库编写的java IDE 源码」· C++ 代码 · 共 1,423 行 · 第 1/3 页
CPP
1,423 行
}
CBCGToolbarMenuButton* pMenuButton =
DYNAMIC_DOWNCAST (CBCGToolbarMenuButton, pButton);
if (pMenuButton != NULL &&
!pMenuButton->OpenPopupMenu ())
{
// ------ By John Young:-------------------
// If the newly selected item is not highlighted,
// then make the menu go away.
if ((pButton->m_nStyle & TBBS_DISABLED) != 0)
{
InvokeMenuCommand (0);
return TRUE;
}
//-----------------------------------------
bProcessed = OnSendCommand (pMenuButton);
if (bProcessed)
{
return TRUE;
}
}
}
else if (CBCGMenuBar::m_bRecentlyUsedMenus &&
!m_bAreAllCommandsShown)
{
///---------------------------------------------------
// Maybe, this accelerator is belong to "hidden' item?
//----------------------------------------------------
UINT uiCmd = 0;
if (m_HiddenItemsAccel.Lookup (nUpperChar, uiCmd))
{
InvokeMenuCommand (uiCmd);
return TRUE;
}
}
}
}
if (pNewSelButton != pOldSelButton)
{
ASSERT_VALID (pNewSelButton);
ASSERT (iNewHighlight >= 0 && iNewHighlight < m_Buttons.GetCount ());
ASSERT (GetButton (iNewHighlight) == pNewSelButton);
//------------------------------------
// Fixed by Sven Ritter (SpeedProject)
//------------------------------------
if (IsCustomizeMode ())
{
m_iSelected = iNewHighlight;
}
// --- End ---
m_iHighlighted = iNewHighlight;
if (pOldSelButton != NULL)
{
InvalidateRect (pOldSelButton->Rect ());
}
InvalidateRect (pNewSelButton->Rect ());
UpdateWindow ();
if (pNewSelButton->m_nID != (UINT) -1)
{
ShowCommandMessageString (pNewSelButton->m_nID);
}
}
return bProcessed;
}
//**************************************************************************************
void CBCGPopupMenuBar::OnTimer(UINT nIDEvent)
{
if (nIDEvent == uiPopupTimerEvent)
{
KillTimer (uiPopupTimerEvent);
CBCGToolbarMenuButton* pDelayedPopupMenuButton = m_pDelayedPopupMenuButton;
m_pDelayedPopupMenuButton = NULL;
if (pDelayedPopupMenuButton != NULL &&
m_iHighlighted >= 0 &&
m_iHighlighted < m_Buttons.GetCount () &&
GetButton (m_iHighlighted) == pDelayedPopupMenuButton)
{
ASSERT_VALID (pDelayedPopupMenuButton);
pDelayedPopupMenuButton->OpenPopupMenu (this);
}
}
}
//**************************************************************************************
void CBCGPopupMenuBar::StartPopupMenuTimer (CBCGToolbarMenuButton* pMenuButton)
{
if (m_pDelayedPopupMenuButton != NULL)
{
KillTimer (uiPopupTimerEvent);
}
if ((m_pDelayedPopupMenuButton = pMenuButton) != NULL)
{
SetTimer (uiPopupTimerEvent, m_uiPopupTimerDelay, NULL);
}
}
//**********************************************************************************
void CBCGPopupMenuBar::OnLButtonDown(UINT nFlags, CPoint point)
{
m_bFirstClick = FALSE;
CRect rectClient;
GetClientRect (&rectClient);
if (!IsCustomizeMode () &&
!rectClient.PtInRect (point))
{
CBCGToolBar* pDestBar = FindDestBar (point);
if (pDestBar != NULL)
{
CPoint ptDest = point;
MapWindowPoints (pDestBar, &ptDest, 1);
pDestBar->SendMessage ( WM_LBUTTONDOWN,
nFlags,
MAKELPARAM (ptDest.x, ptDest.y));
}
}
CBCGToolBar::OnLButtonDown(nFlags, point);
}
//**********************************************************************************
void CBCGPopupMenuBar::OnLButtonUp(UINT nFlags, CPoint point)
{
CRect rectClient;
GetClientRect (&rectClient);
if (!m_bFirstClick &&
!IsCustomizeMode () &&
!rectClient.PtInRect (point))
{
CBCGToolBar* pDestBar = FindDestBar (point);
if (pDestBar != NULL)
{
MapWindowPoints (pDestBar, &point, 1);
pDestBar->SendMessage ( WM_LBUTTONUP,
nFlags,
MAKELPARAM (point.x, point.y));
}
CFrameWnd* pParentFrame = GetParentFrame ();
ASSERT_VALID (pParentFrame);
pParentFrame->DestroyWindow ();
return;
}
if (!IsCustomizeMode () && m_iHighlighted >= 0)
{
m_iButtonCapture = m_iHighlighted;
}
m_bFirstClick = FALSE;
CBCGToolBar::OnLButtonUp (nFlags, point);
}
//**********************************************************************************
BOOL CBCGPopupMenuBar::OnSetDefaultButtonText (CBCGToolbarButton* pButton)
{
ASSERT_VALID (pButton);
CBCGPopupMenu* pParentMenu = DYNAMIC_DOWNCAST (CBCGPopupMenu, GetParent ());
if (pParentMenu != NULL)
{
CBCGToolBar* pToolBar = pParentMenu->GetParentToolBar ();
if (pToolBar != NULL && pToolBar->OnSetDefaultButtonText (pButton))
{
return TRUE;
}
}
return CBCGToolBar::OnSetDefaultButtonText (pButton);
}
//****************************************************************************************
BOOL CBCGPopupMenuBar::EnableContextMenuItems (CBCGToolbarButton* pButton, CMenu* pPopup)
{
if (!CBCGToolBar::IsCustomizeMode ())
{
// Disable context menu
return FALSE;
}
ASSERT_VALID (pButton);
ASSERT_VALID (pPopup);
pPopup->EnableMenuItem (ID_BCGBARRES_TOOLBAR_IMAGE, MF_GRAYED | MF_BYCOMMAND);
pPopup->EnableMenuItem (ID_BCGBARRES_TOOLBAR_TEXT, MF_GRAYED | MF_BYCOMMAND);
pPopup->EnableMenuItem (ID_BCGBARRES_TOOLBAR_IMAGE_AND_TEXT, MF_GRAYED | MF_BYCOMMAND);
pButton->m_bText = TRUE;
CBCGToolBar::EnableContextMenuItems (pButton, pPopup);
return TRUE;
}
//****************************************************************************************
void CBCGPopupMenuBar::OnMouseMove(UINT nFlags, CPoint point)
{
CRect rectClient;
GetClientRect (&rectClient);
if (IsCustomizeMode () ||
rectClient.PtInRect (point))
{
CBCGToolBar::OnMouseMove(nFlags, point);
}
else
{
CBCGToolBar* pDestBar = FindDestBar (point);
if (pDestBar != NULL)
{
MapWindowPoints (pDestBar, &point, 1);
pDestBar->SendMessage ( WM_MOUSEMOVE,
nFlags,
MAKELPARAM (point.x, point.y));
}
}
}
//***************************************************************************************
CBCGToolBar* CBCGPopupMenuBar::FindDestBar (CPoint point)
{
ScreenToClient (&point);
CRect rectClient;
CBCGPopupMenu* pPopupMenu = DYNAMIC_DOWNCAST (CBCGPopupMenu, GetParent ());
ASSERT_VALID (pPopupMenu);
CBCGPopupMenu* pLastPopupMenu = pPopupMenu;
//-------------------------------
// Go up trougth all popup menus:
//-------------------------------
while ((pPopupMenu = pPopupMenu->GetParentPopupMenu ()) != NULL)
{
CBCGPopupMenuBar* pPopupMenuBar = pPopupMenu->GetMenuBar ();
ASSERT_VALID (pPopupMenuBar);
pPopupMenuBar->GetClientRect (&rectClient);
pPopupMenuBar->MapWindowPoints (this, &rectClient);
if (rectClient.PtInRect (point))
{
return pPopupMenuBar;
}
pLastPopupMenu = pPopupMenu;
}
ASSERT_VALID (pLastPopupMenu);
//--------------------
// Try parent toolbar:
//--------------------
CBCGToolBar* pToolBar = pLastPopupMenu->GetParentToolBar ();
if (pToolBar != NULL)
{
pToolBar->GetClientRect (&rectClient);
pToolBar->MapWindowPoints (this, &rectClient);
if (rectClient.PtInRect (point))
{
return pToolBar;
}
}
return NULL;
}
//*********************************************************************************************
DROPEFFECT CBCGPopupMenuBar::OnDragOver(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
{
//-----------------------------------------------
// Disable MOVING menu item into one of submenus!
//-----------------------------------------------
if ((dwKeyState & MK_CONTROL) == 0)
{
CBCGPopupMenu* pParentMenu = DYNAMIC_DOWNCAST (CBCGPopupMenu, GetParent ());
if (pParentMenu != NULL)
{
CBCGToolBar* pParentBar = pParentMenu->GetParentToolBar ();
CBCGToolbarMenuButton* pParentButton = pParentMenu->GetParentButton ();
if (pParentBar != NULL && pParentButton != NULL &&
pParentBar->IsDragButton (pParentButton))
{
return DROPEFFECT_NONE;
}
}
}
return CBCGToolBar::OnDragOver(pDataObject, dwKeyState, point);
}
//*****************************************************************************************
void CBCGPopupMenuBar::OnFillBackground (CDC* pDC)
{
ASSERT_VALID (pDC);
if (CBCGToolBar::IsCustomizeMode () ||
!CBCGMenuBar::m_bRecentlyUsedMenus)
{
return;
}
//--------------------------------------------------------------
// Only menubar first-level menus may hide rarely used commands:
//--------------------------------------------------------------
CBCGPopupMenu* pParentMenu = DYNAMIC_DOWNCAST (CBCGPopupMenu, GetParent ());
if (pParentMenu == NULL || !pParentMenu->HideRarelyUsedCommands ())
{
return;
}
BOOL bFirstRarelyUsedButton = TRUE;
CRect rectRarelyUsed;
for (POSITION pos = m_Buttons.GetHeadPosition (); pos != NULL;)
{
CBCGToolbarButton* pButton = (CBCGToolbarButton*) m_Buttons.GetNext (pos);
ASSERT (pButton != NULL);
if (pButton->m_nStyle & TBBS_SEPARATOR)
{
if (pos != NULL &&
CBCGToolBar::IsCommandRarelyUsed (
((CBCGToolbarButton*) m_Buttons.GetAt (pos))->m_nID))
{
continue;
}
}
BOOL bDraw = FALSE;
if (CBCGToolBar::IsCommandRarelyUsed (pButton->m_nID))
{
if (bFirstRarelyUsedButton)
{
bFirstRarelyUsedButton = FALSE;
rectRarelyUsed = pButton->Rect ();
}
if (pos == NULL) // Last button
{
rectRarelyUsed.bottom = pButton->Rect ().bottom;
bDraw = TRUE;
}
}
else
{
if (!bFirstRarelyUsedButton)
{
rectRarelyUsed.bottom = pButton->Rect ().top;
bDraw = TRUE;
}
bFirstRarelyUsedButton = TRUE;
}
if (bDraw)
{
CBCGToolBarImages::FillDitheredRect (pDC, rectRarelyUsed);
pDC->Draw3dRect (rectRarelyUsed, globalData.clrBtnShadow,
globalData.clrBtnHilite);
}
}
}
//*************************************************************************************
int CBCGPopupMenuBar::OnToolHitTest(CPoint point, TOOLINFO* pTI) const
{
ASSERT_VALID(this);
int nHit = ((CBCGPopupMenuBar*)this)->HitTest(point);
if (nHit != -1)
{
CBCGToolbarButton* pButton =
DYNAMIC_DOWNCAST (CBCGToolbarButton, GetButton (nHit));
if (pButton != NULL)
{
if (pTI != NULL)
{
pTI->uId = pButton->m_nID;
pTI->hwnd = GetSafeHwnd ();
pTI->rect = pButton->Rect ();
}
if (!pButton->OnToolHitTest (this, pTI))
{
nHit = pButton->m_nID;
}
}
}
return nHit;
}
//**********************************************************************************
int CBCGPopupMenuBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CBCGToolBar::OnCreate(lpCreateStruct) == -1)
return -1;
if (m_uiPopupTimerDelay == (UINT) -1) // Not defined yet
{
m_uiPopupTimerDelay = 500;
CBCGRegistry reg (FALSE, TRUE);
if (reg.Open (_T("Control Panel\\Desktop")))
{
CString strVal;
reg.Read (_T("MenuShowDelay"), strVal);
m_uiPopupTimerDelay = (UINT) _ttol (strVal);
//------------------------
// Just limit it to 5 sec:
//------------------------
m_uiPopupTimerDelay = min (5000, m_uiPopupTimerDelay);
}
}
return 0;
}
//*****************************************************************
void CBCGPopupMenuBar::SetButtonStyle(int nIndex, UINT nStyle)
{
CBCGToolbarButton* pButton = GetButton (nIndex);
if (pButton == NULL)
{
ASSERT (FALSE);
return;
}
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))
{
CBCGToolbarMenuButton* pMenuButton =
DYNAMIC_DOWNCAST (CBCGToolbarMenuButton, GetButton (nIndex));
BOOL bWasChecked = nOldStyle & TBBS_CHECKED;
BOOL bChecked = nStyle & TBBS_CHECKED;
// If checked style was changed. redraw check box (or image) area only:
if (pMenuButton != NULL && bWasChecked != bChecked)
{
CRect rectImage;
pMenuButton->GetImageRect (rectImage);
InvalidateRect (rectImage);
UpdateWindow ();
}
else if ((nOldStyle ^ nStyle) != TBSTATE_PRESSED)
{
InvalidateButton(nIndex);
}
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?