⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menubar.cpp

📁 用户管理系统
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	CString strName, strKey;
	AfxExtractSubString(strName, strString, 0, '\t');
	AfxExtractSubString(strKey, strString, 1, '\t');

	// measure text size
	CRect rcRect;
	dc.DrawText(strName, &rcRect, DT_SINGLELINE | DT_CALCRECT);

	// both icon and text must fit
	int nHeight = max(MB_CY_ICON + 4, rcRect.Height());

	// calculate total item width
	int nWidth = 2 + MB_CX_ICON + 6 + rcRect.Width() + nHeight/2;

	if (!strKey.IsEmpty())
	{
		dc.DrawText(strKey, &rcRect, DT_SINGLELINE | DT_CALCRECT);
		nWidth += rcRect.Width() + nHeight/2;
	}

	lpMeasureItemStruct->itemWidth = nWidth;
	lpMeasureItemStruct->itemHeight = nHeight;
}

void CMenuBar::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
//	if (m_bFlatMenu)
//		DrawItemFlat(lpDrawItemStruct);	// Windows XP style
//	else
		DrawItem3D(lpDrawItemStruct);	// old style
}

void CMenuBar::DrawItemFlat(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
	CDC dc;
	dc.Attach(lpDrawItemStruct->hDC);

	int fState = lpDrawItemStruct->itemState;

	dc.SetBkMode(TRANSPARENT);

	CBrush brHighlight;
	brHighlight.CreateSysColorBrush(COLOR_HIGHLIGHT);
	CBrush brMenuHilight;
	brMenuHilight.CreateSysColorBrush(COLOR_MENUHILIGHT);
	CBrush brMenu;
	brMenu.CreateSysColorBrush(COLOR_MENU);

	CRect rcItem = lpDrawItemStruct->rcItem;

	if (fState & ODS_SELECTED)
	{
		dc.FillRect(&rcItem, &brMenuHilight);
		dc.FrameRect(&rcItem, &brHighlight);
	}
	else
		dc.FillRect(&rcItem, &brMenu);

	UINT nID = lpDrawItemStruct->itemID;

	// look for image associated with command ID
	int nImage = -1;
	for (int i=0; i<m_CmdArray.GetSize(); i++)
		if (nID == m_CmdArray[i])
		{
			nImage = i;
			break;
		}

	// center icon vertically
	int nOffY = (rcItem.Height() - MB_CY_ICON) / 2;
    int nOffX = 0;
	if (fState & ODS_CHECKED)
	{
		CRect rcCheck(2, rcItem.top + nOffY, 2 + MB_CX_ICON, rcItem.top + MB_CY_ICON + nOffY);

		if (fState & ODS_SELECTED)
		{
			dc.FillRect(&rcCheck, &brMenu);
		}
		else
		{
			CRect rcFrame = rcCheck;
			rcFrame.InflateRect(1, 1);
			dc.FrameRect(&rcFrame, &brHighlight);
		}

		// draw checkmark using the special system font
		if (nImage < 0)
		{
			CFont font;
			font.CreatePointFont(100, "Marlett");
			CFont* pOldFont = dc.SelectObject(&font);

			dc.DrawText("a", 1, &rcCheck, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

			dc.SelectObject(pOldFont);
		}
	}

	if (nImage >= 0)
	{
		int nImgList = (fState & (ODS_DISABLED | ODS_GRAYED)) ? AIL_DISABLED
			: (fState & ODS_SELECTED) ? AIL_HOT : AIL_NORMAL;

		m_ImgList.Draw(&dc, CPoint(rcItem.left + 2, rcItem.top + nOffY),
			nImgList, nImage);
	}

	CMenu* pMenu = m_bPopMenu ? m_pPopupMenu : m_pMenu;

	CString strString;
	pMenu->GetMenuString(nID, strString, MF_BYCOMMAND);

	CString strName, strKey;
	AfxExtractSubString(strName, strString, 0, '\t');
	AfxExtractSubString(strKey, strString, 1, '\t');

	CRect rcText = rcItem;
	rcText.DeflateRect(2 + MB_CX_ICON + 6, 0, rcItem.Height(), 0);

	UINT fFormat = DT_SINGLELINE | DT_VCENTER | (m_bPrefix ? 0 : DT_HIDEPREFIX);

	int nColorText = (fState & (ODS_DISABLED | ODS_GRAYED))
		? (fState & ODS_SELECTED) ? COLOR_3DSHADOW : COLOR_GRAYTEXT
		: (fState & ODS_SELECTED) ? COLOR_HIGHLIGHTTEXT : COLOR_MENUTEXT;

	dc.SetTextColor(GetSysColor(nColorText));

	dc.DrawText(strName, &rcText, fFormat | DT_LEFT);
	if (!strKey.IsEmpty())
		dc.DrawText(strKey, &rcText, fFormat | DT_RIGHT);

	dc.Detach();
}

void CMenuBar::DrawItem3D(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
	CDC dc;
	dc.Attach(lpDrawItemStruct->hDC);

	int fState = lpDrawItemStruct->itemState;

	dc.SetBkMode(TRANSPARENT);
/*
	CBrush brHighlight;
	brHighlight.CreateSysColorBrush(COLOR_HIGHLIGHT);
	CBrush brMenu;
	brMenu.CreateSysColorBrush(COLOR_MENU);
*/

	CRect rcItem = lpDrawItemStruct->rcItem;
	UINT nID = lpDrawItemStruct->itemID;
	CMenu* pMenu = m_bPopMenu ? m_pPopupMenu : m_pMenu;
	if(pMenu && pMenu->GetMenuState(nID, MF_BYCOMMAND) &
	   MFT_SEPARATOR)
	{
	  DrawSeparator(&dc, rcItem);
	  dc.Detach();
	  return ;
	}

	int nImage = -1;
	for (int i=0; i<m_CmdArray.GetSize(); i++)
		if (nID == m_CmdArray[i])
		{
			nImage = i;
			break;
		}
    DrawBGColor(&dc, rcItem, fState & ODS_SELECTED);
	Draw3DCheckmark(&dc, rcItem, fState & ODS_SELECTED, 
		     (fState & (ODS_DISABLED | ODS_GRAYED)), 
			  fState & ODS_CHECKED);
	int nOffY = (rcItem.Height() - MB_CY_ICON) / 2;
	int nOffX = 0;
/*	if (fState & ODS_SELECTED)
	{
		dc.FillRect(&rcItem, &brHighlight);
		if (nImage >= 0 || fState & ODS_CHECKED)
		{
			CRect rcBack = rcItem;	// don't highlight the image
			rcBack.right = 2 + MB_CX_ICON + 3;
			dc.FillRect(&rcBack, &brMenu);
		}
	}
	else
		dc.FillRect(&rcItem, &brMenu);


	if (!(fState & (ODS_DISABLED | ODS_GRAYED)) && (fState & ODS_SELECTED
		&& nImage >= 0 || fState & ODS_CHECKED))
	{
		// draw 3D edge around image
		CRect rcEdge(0, rcItem.top + nOffY - 2, 2 + MB_CX_ICON + 2, rcItem.top + nOffY + MB_CY_ICON + 2);

		if (fState & ODS_CHECKED && !(fState & ODS_SELECTED))
		{
			// draw checked item background with a halftone brush
			WORD pat[8];
			for (int i=0; i<8; i++)
				pat[i] = (WORD)(0x5555 << (i & 1));

			CBitmap bmp;
			bmp.CreateBitmap(8, 8, 1, 1, pat);

			CBrush brush;
			brush.CreatePatternBrush(&bmp);

			dc.SetTextColor(GetSysColor(COLOR_BTNFACE));
			dc.SetBkColor(GetSysColor(COLOR_BTNHILIGHT));
			dc.FillRect(&rcEdge, &brush);
		}
		else
			dc.FillRect(&rcEdge, &brMenu);

		if (nImage < 0 && fState & ODS_CHECKED)
		{
			CFont font;
			font.CreatePointFont(100, "Marlett");
			CFont* pOldFont = dc.SelectObject(&font);

			dc.SetTextColor(GetSysColor(COLOR_MENUTEXT));
			dc.DrawText("a", 1, &rcEdge, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

			dc.SelectObject(pOldFont);
		}
		
		dc.DrawEdge(&rcEdge, fState & ODS_CHECKED ? BDR_SUNKENOUTER : BDR_RAISEDINNER, BF_RECT);
	}
*/
	if (nImage >= 0)
	{
		int nImgList = (fState & (ODS_DISABLED | ODS_GRAYED)) ? AIL_DISABLED
			: (fState & ODS_SELECTED) ? AIL_HOT : AIL_NORMAL;
        if(fState & ODS_SELECTED) {nOffX++; nOffY++;}
		m_ImgList.Draw(&dc, CPoint(rcItem.left + 2 + nOffX, rcItem.top + nOffY),
			nImgList, nImage);
	}


	CString strString;
	if(pMenu)
	  pMenu->GetMenuString(nID, strString, MF_BYCOMMAND);

	CString strName, strKey;
	AfxExtractSubString(strName, strString, 0, '\t');
	AfxExtractSubString(strKey, strString, 1, '\t');

	CRect rcText = rcItem;
//	rcText.DeflateRect(2 + MB_CX_ICON + 6, 0, rcItem.Height(), 0);
    rcText.left += GRAY_AREA_LENGTH + 4;
	rcText.right -= rcItem.Height();
	UINT fFormat = DT_SINGLELINE | DT_VCENTER | (m_bPrefix ? 0 : DT_HIDEPREFIX);

	if (fState & (ODS_DISABLED | ODS_GRAYED))
	{
		if (!(fState & ODS_SELECTED))
		{
			// draw 3D text highlight
			dc.SetTextColor(GetSysColor(COLOR_3DHIGHLIGHT));

			CRect rcHilite = rcText;
			//rcHilite.OffsetRect(1, 1);

			dc.DrawText(strName, &rcHilite, fFormat | DT_LEFT);
			if (!strKey.IsEmpty())
				dc.DrawText(strKey, &rcHilite, fFormat | DT_RIGHT);

			dc.SetTextColor(GetSysColor(COLOR_3DSHADOW));
		}
		else
			dc.SetTextColor(GetSysColor(COLOR_GRAYTEXT));
	}
	else
		dc.SetTextColor(GetSysColor((fState & ODS_SELECTED) ? COLOR_HIGHLIGHTTEXT : COLOR_MENUTEXT));

	dc.DrawText(strName, &rcText, fFormat | DT_LEFT);
	if (!strKey.IsEmpty())
		dc.DrawText(strKey, &rcText, fFormat | DT_RIGHT);

	dc.Detach();
}

BOOL CMenuBar::OnCommand(WPARAM wParam, LPARAM lParam)
{
	return GetParentFrame()->SendMessage(WM_COMMAND, wParam, lParam);
}
/**********************************************************
函  数  名:DrawBGColor
作      用:菜单项的背景由它来完成
形  参  数:CDC* pDC, CRect rect, BOOL bSelected
返	回  值:NULL
***********************************************************/
void	CMenuBar::DrawBGColor(CDC* pDC, CRect rect, BOOL bSelected)
{
	if(bSelected)
	{
		// draw frame
		pDC->SelectStockObject(NULL_BRUSH);
		pDC->SelectStockObject(BLACK_PEN);
		pDC->Rectangle(&rect);
		
		// fill background with XP color
		rect.DeflateRect(0x00000001, 0x00000001);
		pDC->FillSolidRect(&rect, RGB(0x000000B1, 0x000000B9, 0x000000CF));
	}
	else
	{
		CRect rcGray(rect);
		rcGray.right = rcGray.left + GRAY_AREA_LENGTH;
		pDC->FillSolidRect(&rcGray, RGB(0x000000DB, 0x000000D8, 0x000000D1));

		CRect rcWhite(rect);
		rcWhite.left = rcGray.right;
		pDC->FillSolidRect(&rcWhite, RGB(0x000000F9, 0x000000F8, 0x000000F7));
	}
}
/*********************************************************
SEPARATOR
函  数  名:DrawSeparator
作      用:画出菜单项的文本
形  参  数:CDC* pDC, CRect rect, CString sText
返	回  值:NULL
***********************************************************/
void CMenuBar::DrawSeparator(CDC *pDC, CRect rcBG)
{
  CPen pen1, pen2;
  CPen *pOld;
//  COLORREF crSeparator = RGB(82,139,203);
  COLORREF crSeparator = RGB(198,198,198);
		CRect rcGray(rcBG);
		rcGray.right = rcGray.left + GRAY_AREA_LENGTH;
		pDC->FillSolidRect(&rcGray, RGB(0x000000DB, 0x000000D8, 0x000000D1));
		CRect rcWhite(rcBG);
		rcWhite.left = rcGray.right;
		pDC->FillSolidRect(&rcWhite, RGB(0x000000F9, 0x000000F8, 0x000000F7));

		pen1.CreatePen(PS_SOLID, 1, crSeparator);
		pen2.CreatePen(PS_SOLID, 1, RGB(255,255,255));
        rcBG.left += GRAY_AREA_LENGTH + 2;
		rcBG.top += rcBG.Height()/2-1;
		pOld = pDC->SelectObject(&pen1);
		pDC->MoveTo(rcBG.left, rcBG.top);
		pDC->LineTo(rcBG.right,rcBG.top);
		pDC->SelectObject(&pen2);
		pDC->MoveTo(rcBG.left, rcBG.top+1);
		pDC->LineTo(rcBG.right,rcBG.top+1);
		pDC->SelectObject(pOld);
		pen1.DeleteObject();
		pen2.DeleteObject();
}
BOOL CMenuBar::Draw3DCheckmark(CDC *pDC, RECT rc,
	BOOL bSelected, BOOL bDisabled, BOOL bChecked)
{
	int i;
	RECT Rect;
	HANDLE hHandle;
//	char szTemp[256];
//	COLORREF crColor;
//	DWORD dwStyle;
	HDC hDC;
//	HWND hWnd;
	if (!bChecked) return TRUE;
	Rect = rc;
    hDC = pDC->m_hDC;
    Rect.right = Rect.top + (Rect.bottom-Rect.top);
	int nWidth = Rect.bottom-Rect.top;
	Rect.right = Rect.bottom - Rect.top;
	InflateRect(&Rect, -3, -3);
//	Rect.top += nWidth /4;
//	Rect.left += nWidth /4;
//	Rect.bottom = Rect.top + nWidth/2;
//	Rect.right = Rect.left + nWidth/2;
// 画最外面的框
	hHandle = (HANDLE) CreateSolidBrush(
		(bDisabled) ? (GetSysColor(COLOR_BTNFACE) - 0x00202020) : 0x00845118);
	FrameRect(hDC, &Rect, (HBRUSH) hHandle);
	DeleteObject((HGDIOBJ) hHandle);
// 画框内选中标志
	InflateRect(&Rect, -3, -3);
	hHandle = (HANDLE) SelectObject(hDC,
			CreatePen(PS_SOLID, 1, bDisabled ? 0x000BDCBCE : 0x0021A221));
		for (i = 3; i < 10; i++)
		{
			MoveToEx(hDC, Rect.left+i-3, Rect.top + ((i < 6) ? i - 1 : (9 - i)), NULL);
			LineTo(hDC, Rect.left+i-3, Rect.top + ((i < 6) ? i + 2 : (12 - i)));
		}
	DeleteObject(SelectObject(hDC,(HGDIOBJ) hHandle));
	return TRUE;
}

/**********************************************************
函  数  名:DrawTop
作      用:画最顶端菜单
形  参  数:CDC *pDC,CRect rect,BOOL bSelected
返	回  值:NULL
***********************************************************/
void	CMenuBar::DrawTop(CDC *pDC,CRect rect,int nState)
{	
	BOOL bHilight = nState & (CDIS_HOT | CDIS_SELECTED);
	if(nState & CDIS_HOT)
	{
		pDC->SelectStockObject(BLACK_PEN);
		pDC->Rectangle(&rect);//a rectangle
		rect.DeflateRect(1, 1);
		pDC->FillSolidRect(&rect, RGB(0x000000F9, 0x000000F8, 0x000000F7));
	}
	else if(nState & CDIS_SELECTED)
	{
		pDC->SelectStockObject(BLACK_PEN);
		pDC->MoveTo(rect.left, rect.bottom);
		pDC->LineTo(rect.left, rect.top);
		pDC->LineTo(rect.right-1, rect.top);
		pDC->LineTo(rect.right-1, rect.bottom);
		rect.DeflateRect(1, 1);
		pDC->FillSolidRect(&rect, RGB(0x000000F9, 0x000000F8, 0x000000F7));
	}
	else
	{
		CRect rcGray(rect);
		pDC->FillSolidRect(&rcGray,GetSysColor(0));
/*		rcGray.right = rcGray.left + Public_Area;
		pDC->FillSolidRect(&rcGray,GetSysColor(0));
		CRect rcWhite(rect);
		rcWhite.left = rcGray.right;
		pDC->FillSolidRect(&rcWhite,GetSysColor(0));
*/
	}
}


CMenu * CMenuBar::GetMenu()
{
  return m_pMenu;
}

⌨️ 快捷键说明

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