📄 menubar.cpp
字号:
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 + -