bcgtoolbarmenubutton.cpp

来自「用bcg库编写的java IDE 源码」· C++ 代码 · 共 1,592 行 · 第 1/3 页

CPP
1,592
字号
		// Add an actual accelartion label:
		//---------------------------------
		CString strAccel;
		CFrameWnd* pParent = m_pWndParent == NULL ?
			DYNAMIC_DOWNCAST (CFrameWnd, AfxGetMainWnd ()) :
			m_pWndParent->GetTopLevelFrame ();

		if (pParent != NULL &&
			(CBCGKeyboardManager::FindDefaultAccelerator (
				m_nID, strAccel, pParent) ||
			CBCGKeyboardManager::FindDefaultAccelerator (
				m_nID, strAccel, pParent->GetActiveFrame ())))
		{
			m_strText += _T('\t');
			m_strText += strAccel;
		}
	}

	CSize size = CBCGToolbarButton::OnCalculateSize (pDC, sizeDefault, bHorz);
	if (bHorz)
	{	
		size.cx += iArrowSize;
	}
	else
	{
		size.cy += iArrowSize;
	}

	if (m_bMenuMode)
	{
		size.cx += sizeDefault.cx + 2 * TEXT_MARGIN;
	}

	CBCGPopupMenuBar* pParentMenu =
		DYNAMIC_DOWNCAST (CBCGPopupMenuBar, m_pWndParent);
	if (pParentMenu != NULL)
	{
		size.cy = pParentMenu->GetRowHeight ();
	}

	return size;
}
//*****************************************************************************************
BOOL CBCGToolbarMenuButton::OnClick (CWnd* pWnd, BOOL bDelay)
{
	ASSERT_VALID (pWnd);
	
	m_bClickedOnMenu = FALSE;

	if(m_bDrawDownArrow && !bDelay && !m_bMenuMode)
	{
		if (m_nID == 0 || m_nID == (UINT) -1)
		{
			m_bClickedOnMenu = TRUE;
		}
		else
		{
			CPoint ptMouse;
			::GetCursorPos (&ptMouse);
			pWnd->ScreenToClient (&ptMouse);

			CRect rectArrow = m_rect;
			if (m_bHorz)
			{
				rectArrow.left = rectArrow.right - 
					CMenuImages::Size ().cx - SEPARATOR_SIZE;
			}
			else
			{
				rectArrow.top = rectArrow.bottom - 
					CMenuImages::Size ().cy - SEPARATOR_SIZE;
			}

			m_bClickedOnMenu = rectArrow.PtInRect (ptMouse);
			if (!m_bClickedOnMenu)
			{
				return FALSE;
			}
		}
	}

	if (!m_bClickedOnMenu && m_nID > 0 && m_nID != (UINT) -1 && !m_bDrawDownArrow)
	{
		return FALSE;
	}

	CBCGMenuBar* pMenuBar = DYNAMIC_DOWNCAST (CBCGMenuBar, m_pWndParent);

	if (m_pPopupMenu != NULL)
	{
		//-----------------------------------------------------
		// Second click to the popup menu item closes the menu:
		//-----------------------------------------------------		
		ASSERT_VALID(m_pPopupMenu);

		m_pPopupMenu->m_bAutoDestroyParent = FALSE;
		m_pPopupMenu->DestroyWindow ();
		m_pPopupMenu = NULL;

		if (pMenuBar != NULL)
		{
			pMenuBar->SetHot (NULL);
		}
	}
	else
	{
		CBCGPopupMenuBar* pParentMenu =
			DYNAMIC_DOWNCAST (CBCGPopupMenuBar, m_pWndParent);

		if (bDelay && pParentMenu != NULL && !CBCGToolBar::IsCustomizeMode ())
		{
			pParentMenu->StartPopupMenuTimer (this);
		}
		else
		{
			//------------------------------------
			// Fixed by Sven Ritter (SpeedProject)
			//------------------------------------
			if (pMenuBar != NULL)
			{
				CBCGToolbarMenuButton* pCurrPopupMenuButton = pMenuBar->GetDroppedDownMenu();
				if (pCurrPopupMenuButton != NULL)
				{
					pCurrPopupMenuButton->OnCancelMode ();
				}
			}
			// ***  End *************************
			
			if(!OpenPopupMenu (pWnd))
			{
				return FALSE;
			}
		}

		if (pMenuBar != NULL)
		{
			pMenuBar->SetHot (this);
		}
	}

	if (m_pWndParent != NULL)
	{
		m_pWndParent->InvalidateRect (m_rect);
	}

	return TRUE;
}
//****************************************************************************************
void CBCGToolbarMenuButton::OnChangeParentWnd(CWnd* pWndParent)
{
	if(pWndParent != NULL)
	{
		if(pWndParent->IsKindOf(RUNTIME_CLASS(CBCGMenuBar)))
		{
			m_bDrawDownArrow = FALSE;
			m_bText = TRUE;
			m_bImage = FALSE;
		}
		else
		{
			m_bDrawDownArrow = (m_nID == 0 ||m_pwndContainer != NULL|| !m_listCommands.IsEmpty ());
		}

		if(pWndParent->IsKindOf(RUNTIME_CLASS(CBCGPopupMenuBar)))
		{
			m_bMenuMode = TRUE;
			m_bText = TRUE;
			m_bImage = FALSE;
			m_bDrawDownArrow = (m_nID == 0 || !m_listCommands.IsEmpty ());
		}
		else
		{
			m_bMenuMode = FALSE;
		}
	}
	m_pWndParent = pWndParent;
}
//****************************************************************************************
void CBCGToolbarMenuButton::CreateFromMenu (HMENU hMenu)
{
	while (!m_listCommands.IsEmpty ())
	{
		delete m_listCommands.RemoveHead ();
	}

	CMenu* pMenu = CMenu::FromHandle (hMenu);
	if (pMenu == NULL)
	{
		return;
	}

	UINT uiDefaultCmd = ::GetMenuDefaultItem (hMenu, FALSE, GMDI_USEDISABLED);

	int iCount = (int) pMenu->GetMenuItemCount ();
	for (int i = 0; i < iCount; i ++)
	{
		CBCGToolbarMenuButton* pItem = new CBCGToolbarMenuButton;
		ASSERT_VALID (pItem);

		pItem->m_nID = pMenu->GetMenuItemID (i);
		pMenu->GetMenuString (i, pItem->m_strText, MF_BYPOSITION);

		if (pItem->m_nID == -1)	// Sub-menu...
		{
			CMenu* pSubMenu = pMenu->GetSubMenu (i);
			pItem->CreateFromMenu (pSubMenu->GetSafeHmenu ());
		}
		else if (pItem->m_nID == uiDefaultCmd)
		{
			pItem->m_bDefault = TRUE;
		}

		/// By Guy Hachlili - support for the menu with breaks:
		if (pMenu->GetMenuState (i, MF_BYPOSITION) & MF_MENUBREAK)
		{
			pItem->m_nStyle |= TBBS_BREAK;
		}
		/////////////////////////////

		m_listCommands.AddTail (pItem);
	}
}
//****************************************************************************************
HMENU CBCGToolbarMenuButton::CreateMenu () const
{
	if(m_listCommands.IsEmpty() && m_nID != (UINT) -1)
	{
		return NULL;
	}

	CMenu menu;
	if(!menu.CreatePopupMenu ())
	{
	  TRACE(_T("CBCGToolbarMenuButton::CreateMenu (): Can't create popup menu!\n"));
	  return NULL;
	}

	BOOL bRes = TRUE;
	DWORD dwLastError = 0;

	UINT uiDefaultCmd = (UINT) -1;

	int i = 0;
	for(POSITION pos = m_listCommands.GetHeadPosition (); pos != NULL; i ++)
	{
		CBCGToolbarMenuButton* pItem = (CBCGToolbarMenuButton*) m_listCommands.GetNext (pos);
		ASSERT (pItem != NULL);
		ASSERT_KINDOF (CBCGToolbarButton, pItem);

		UINT uiStyle = MF_STRING;
		/// By Guy Hachlili - support for the menu with breaks:
		if (pItem->m_nStyle & TBBS_BREAK)
		{
			uiStyle |= MF_MENUBREAK;
		}
		///////////////////////////////////////////////////////

		switch (pItem->m_nID)
		{
		case 0:	// Separator
			bRes = menu.AppendMenu (MF_SEPARATOR);
			if (!bRes)
			{
				dwLastError = GetLastError ();
			}
			break;

		case -1:			// Sub-menu
			{
				HMENU hSubMenu = pItem->CreateMenu ();
				ASSERT (hSubMenu != NULL);

				bRes = menu.AppendMenu (uiStyle | MF_POPUP, 
										(UINT) hSubMenu, pItem->m_strText);
				if (!bRes)
				{
					dwLastError = GetLastError ();
				}

				//--------------------------------------------------------
				// This is incompatibility between Windows 95 and 
				// NT API! (IMHO). CMenu::AppendMenu with MF_POPUP flag 
				// COPIES sub-menu resource under the Win NT and 
				// MOVES sub-menu under Win 95/98 and 2000!
				//--------------------------------------------------------
				if (globalData.bIsWindowsNT4)
				{
					::DestroyMenu (hSubMenu);
				}
			}
			break;

		default:
			if (pItem->m_bDefault)
			{
				uiDefaultCmd = pItem->m_nID;
			}

			bRes = menu.AppendMenu (uiStyle, pItem->m_nID, pItem->m_strText);
			if (!bRes)
			{
				dwLastError = GetLastError ();
			}
		}

		if (!bRes)
		{
			TRACE(_T("CBCGToolbarMenuButton::CreateMenu (): Can't add menu item: %d\n Last error = %x\n"), pItem->m_nID, dwLastError);
			return NULL;
		}
	}

	HMENU hMenu = menu.Detach ();
	if (uiDefaultCmd != (UINT)-1)
	{
		::SetMenuDefaultItem (hMenu, uiDefaultCmd, FALSE);
	}

	return hMenu;
}
//*****************************************************************************************
void CBCGToolbarMenuButton::DrawMenuItem (CDC* pDC, const CRect& rect, CBCGToolBarImages* pImages, 
					BOOL bCustomizeMode, BOOL bHighlight, BOOL bGrayDisabledButtons)
{
	ASSERT_VALID (pDC);
	ASSERT_VALID (this);

	CSize sizeImage = CMenuImages::Size();

	BOOL bDisabled = (bCustomizeMode && !IsEditable ()) ||
		(!bCustomizeMode && (m_nStyle & TBBS_DISABLED));

	if(m_pPopupMenu != NULL)
		bHighlight = TRUE;

	CFont* pOldFont = NULL;

	CBCGPopupMenuBar* pParentMenu = DYNAMIC_DOWNCAST (CBCGPopupMenuBar, m_pWndParent);
	if(m_nID != 0 && m_nID != (UINT) -1 &&
		pParentMenu != NULL && pParentMenu->GetDefaultMenuId () == m_nID)
	{
		pOldFont = (CFont*) pDC->SelectObject (&globalData.fontBold);
	}

	CRect rectImage;
	rectImage = rect;
	rectImage.left += IMAGE_MARGIN;
	rectImage.right = rectImage.left + CBCGToolBar::GetMenuImageSize ().cx + IMAGE_MARGIN;

	CRect rectFrameBtn = rectImage;
	rectFrameBtn.InflateRect (1, -1);

	BOOL bIsRarelyUsed = (CBCGMenuBar::IsRecentlyUsedMenus() && 
		CBCGToolBar::IsCommandRarelyUsed(m_nID));
	
	if(bIsRarelyUsed)
	{
		bIsRarelyUsed = FALSE;

		CBCGPopupMenuBar* pParentMenuBar = DYNAMIC_DOWNCAST (CBCGPopupMenuBar, m_pWndParent);

		if (pParentMenuBar != NULL)
		{
			CBCGPopupMenu* pParentMenu = DYNAMIC_DOWNCAST (CBCGPopupMenu,pParentMenuBar->GetParent());
			if(pParentMenu != NULL && pParentMenu->HideRarelyUsedCommands())
			{
				bIsRarelyUsed = TRUE;
			}
		}
	}

	BOOL bLightImage = FALSE;

	if(bIsRarelyUsed)
	{
		bLightImage = TRUE;
		if(bHighlight && (m_nStyle & (TBBS_CHECKED | TBBS_INDETERMINATE)))
		{
			bLightImage = FALSE;
		}

		if(GetImage () < 0 && !(m_nStyle & (TBBS_CHECKED | TBBS_INDETERMINATE)))
		{
			bLightImage = FALSE;
		}
	}
	else 
	if(m_nStyle & (TBBS_CHECKED | TBBS_INDETERMINATE))
	{
		bLightImage = !bHighlight;
	}


   //**********************menu drawing*********************************
    //draw basic backgroung
	{
      CRect rcBk(rect);
	  rcBk.DeflateRect(rectFrameBtn.Width(),0,-rectFrameBtn.Width(),0);
	  CBrush br;
      br.CreateSolidBrush(GuiDrawLayer::GetRGBMenuItemBackGrnd());
	  pDC->FillRect(rcBk,&br);
	  br.DeleteObject();
	  //pDC->FillSolidRect(rcBk,GuiDrawLayer::GetRGBMenuItemBackGrnd());
	}
	//-------------------------------
	// Fill text area if highlighted:
	//-------------------------------
	CRect rectText = rect;
	rectText.left = rectFrameBtn.right + IMAGE_MARGIN+2;

	COLORREF clrText;

	if(bHighlight && !bCustomizeMode)
	{
		CRect rectFill = rectFrameBtn;

		/**
		if((m_nStyle & (TBBS_CHECKED) || bImageIsReady) ||iSystemImageId != -1)
		{
			rectFill.left = rectText.left - 1;
		}
        **/
		//**rectFill.right = rect.right - 1;

		CBrush cblu;
		CRect rcItem(rect);
		rcItem.DeflateRect(1,1,1,1);
		pDC->Draw3dRect(rcItem,GuiDrawLayer::GetRGBCaptionXP(),GuiDrawLayer::GetRGBCaptionXP());
		rcItem.DeflateRect(1,1,1,1);

		//draw highlight
		cblu.CreateSolidBrush(/*GuiDrawLayer::GetRGBFondoXP()*/
			                   GuiDrawLayer::GetRGBMenuItemHighLite());
		pDC->FillRect(rcItem,&cblu);	
		cblu.DeleteObject();

		//**pDC->FillRect(&rectFill,&globalData.brHilite);
		clrText =  bDisabled ?globalData.clrBtnFace : globalData.clrTextHilite;
	}
	else
	{
		clrText	= bDisabled ?globalData.clrGrayedText : globalData.clrBtnText;
        //CRect rectFill = rectFrameBtn;
		//rectFill.DeflateRect(1,1,1,1);
		//pDC->FillSolidRect(rectFill,GuiDrawLayer::GetRGBColorWhite());
	}





	//---------------------
	// Fill "checked" area:
	//---------------------
	if(bLightImage)
	{
	  CBCGToolBarImages::FillDitheredRect(pDC,rectFrameBtn);
	}

	//----------------
	// Draw the image:
	//----------------
	if(!IsDrawImage())	// Try to find a matched image
	{
		BOOL bImageSave  = m_bImage;
		BOOL bUserButton = m_bUserButton;
		BOOL bSuccess    = TRUE;

		m_bImage      = TRUE;	// Always try to draw image!
		m_bUserButton = TRUE;

		if(GetImage () < 0)
		{
			m_bUserButton = FALSE;

			if(GetImage() < 0)
			{
				bSuccess = FALSE;
			}
		}

		if(!bSuccess)
		{
		  m_bImage = bImageSave;
		  m_bUserButton = bUserButton;
		}
	}

	BOOL bImageIsReady = FALSE;

	CRgn rgnClip;
	rgnClip.CreateRectRgnIndirect (&rectImage);

	if(IsDrawImage() && pImages != NULL)
	{
		pDC->SelectObject(&rgnClip);

		CPoint ptImageOffset (
			(rectImage.Width () - CBCGToolBar::GetMenuImageSize ().cx) / 2, 
			(rectImage.Height () - CBCGToolBar::GetMenuImageSize ().cy) / 2);

		BOOL bPressed = FALSE;
		if ((m_nStyle & TBBS_CHECKED) && !bCustomizeMode)
		{
			ptImageOffset.x ++;
			ptImageOffset.y ++;
			bPressed = TRUE;
		}

		if ((m_nStyle & TBBS_PRESSED) || !(m_nStyle & TBBS_DISABLED) ||
						bCustomizeMode)
		{

			pImages->Draw(pDC, 
				rectImage.left + ptImageOffset.x, rectImage.top + ptImageOffset.y, 
				GetImage ());


			if (bCustomizeMode || m_nStyle & TBBS_PRESSED)
			{
				bImageIsReady = TRUE;
			}
		}

		if(!bImageIsReady)
		{
			pImages->Draw (pDC, 
				rectImage.left + ptImageOffset.x, rectImage.top + ptImageOffset.y, 
				GetImage (), bLightImage, bDisabled && bGrayDisabledButtons);
			bImageIsReady = TRUE;
		}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?