📄 newmenu.cpp
字号:
if(bIsMenuBar)
{
#ifdef _TRACE_MENU_
TRACE(_T("BarState: 0x%lX Menus %ld\n"),lpDIS->itemState,m_dwOpenMenu);
#endif
if(!m_dwOpenMenu && lpDIS->itemState&ODS_SELECTED)
{
lpDIS->itemState = (lpDIS->itemState&~ODS_SELECTED)|ODS_HOTLIGHT;
}
if(!(lpDIS->itemState&ODS_HOTLIGHT))
{
colorSel = colorBitmap;
}
colorMenu = ColB;
}
CBrush m_brBackground(colorMenu);
CBrush m_brSel(colorSel);
CBrush m_brBitmap(colorBitmap);
CRect RectL(lpDIS->rcItem);
CRect RectR(lpDIS->rcItem);
CRect RectSel(lpDIS->rcItem);
if(bIsMenuBar)
{
RectR.InflateRect (0,0,0,0);
RectSel.InflateRect (0,0,-2 -2,0);
}
else
{
RectL.right = RectL.left + m_iconX + 8;
RectR.left = RectL.right;
// Draw for Bitmapbackground
pDC->FillSolidRect (RectL,colorBitmap);
}
// Draw for Textbackground
pDC->FillSolidRect (RectR,colorMenu);
// Spacing for submenu only in popups
if(!bIsMenuBar)
{
RectR.left += 4;
RectR.right-= 15;
}
// Flag for highlighted item
if(lpDIS->itemState & (ODS_HOTLIGHT|ODS_INACTIVE) )
{
lpDIS->itemState |= ODS_SELECTED;
}
if(bIsMenuBar && (lpDIS->itemState&ODS_SELECTED) )
{
if(!(lpDIS->itemState&ODS_INACTIVE) )
{
SetLastMenuRect(lpDIS->hDC,RectSel);
if(!(lpDIS->itemState&ODS_HOTLIGHT) )
{
int X,Y;
CRect rect = RectR;
int winH = rect.Height();
// Simulate a shadow on right edge...
for (X=1; X<=4 ;X++)
{
for (Y=0; Y<4 ;Y++)
{
pDC->SetPixel(rect.right-X,Y+rect.top, ColB );
}
for (Y=4; Y<8 ;Y++)
{
pDC->SetPixel(rect.right-X,Y+rect.top,DarkenColor(3 * X * (Y - 3), ColB)) ;
}
for (Y=8; Y<=(winH-1) ;Y++)
{
pDC->SetPixel(rect.right - X, Y+rect.top, DarkenColor(15 * X, ColB) );
}
}
}
}
}
// For keyboard navigation only
BOOL bDrawSmalSelection = FALSE;
// remove the selected bit if it's grayed out
if( (lpDIS->itemState&ODS_GRAYED) && !m_bSelectDisable)
{
if( lpDIS->itemState & ODS_SELECTED )
{
lpDIS->itemState=lpDIS->itemState & ~ODS_SELECTED;
DWORD MsgPos = ::GetMessagePos();
if(MsgPos==CNewMenuHook::m_dwMsgPos)
{
bDrawSmalSelection = TRUE;
}
else
{
CNewMenuHook::m_dwMsgPos = MsgPos;
}
}
}
// Draw the seperator
if(state & MF_SEPARATOR)
{
if(pMenuData->m_nTitleFlags&MFT_TITLE)
{
DrawTitle(lpDIS,bIsMenuBar);
}
else
{
// Draw only the seperator
CRect rect;
rect.top = RectR.CenterPoint().y;
rect.bottom = rect.top+1;
rect.right = lpDIS->rcItem.right+1;
rect.left = RectR.left;
pDC->FillSolidRect(rect,GetSysColor(COLOR_GRAYTEXT));
}
}
else
{
if( (lpDIS->itemState & ODS_SELECTED) && !(lpDIS->itemState&ODS_INACTIVE) )
{
// Draw the selection
CPen* pOldPen = pDC->SelectObject(&Pen);
CBrush* pOldBrush = pDC->SelectObject(&m_brSel);
pDC->Rectangle(RectSel);
pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldPen);
}
else if (bDrawSmalSelection)
{
// Draw the selection for keyboardnavigation
CPen* pOldPen = pDC->SelectObject(&Pen);
CBrush* pOldBrush = pDC->SelectObject(&m_brBackground);
pDC->Rectangle(RectSel);
pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldPen);
}
UINT state = lpDIS->itemState;
BOOL standardflag=FALSE;
BOOL selectedflag=FALSE;
BOOL disableflag=FALSE;
BOOL checkflag=FALSE;
CBrush m_brSelect;
CPen m_penBack;
CImageList* bitmap = pMenuData->m_pBitmap;
CString strText = pMenuData->GetString();
if((state&ODS_CHECKED) && (pMenuData->m_nMenuIconNormal<0))
{
if(state&ODS_SELECTED && m_selectcheck>0)
{
checkflag=TRUE;
}
else if(m_unselectcheck>0)
{
checkflag=TRUE;
}
}
else if(pMenuData->m_nMenuIconNormal != -1)
{
standardflag=TRUE;
if(state&ODS_SELECTED)
{
selectedflag=TRUE;
}
else if(state&ODS_GRAYED)
{
disableflag=TRUE;
}
}
// draw the menutext
if(!strText.IsEmpty())
{
LOGFONT LogFontMenu;
CFont FontMenu;
NONCLIENTMETRICS nm;
::ZeroMemory(&nm,sizeof(nm));
nm.cbSize = sizeof (nm);
VERIFY (SystemParametersInfo(SPI_GETNONCLIENTMETRICS,nm.cbSize,&nm,0));
LogFontMenu = nm.lfMenuFont;
// Default selection?
if(state&ODS_DEFAULT)
{
// Make the font bold
LogFontMenu.lfWeight = FW_BOLD;
}
FontMenu.CreateFontIndirect(&LogFontMenu);
CString leftStr;
CString rightStr;
leftStr.Empty();
rightStr.Empty();
int tablocr=strText.ReverseFind(_T('\t'));
if(tablocr!=-1)
{
rightStr=strText.Mid(tablocr+1);
leftStr=strText.Left(strText.Find(_T('\t')));
}
else
leftStr=strText;
// Draw the text in the correct colour:
UINT nFormat = DT_LEFT| DT_SINGLELINE|DT_VCENTER;
UINT nFormatr = DT_RIGHT|DT_SINGLELINE|DT_VCENTER;
int iOldMode = pDC->SetBkMode( TRANSPARENT);
CFont* pOldFont = pDC->SelectObject (&FontMenu);
COLORREF OldTextColor;
if( (lpDIS->itemState&ODS_GRAYED) ||
(bIsMenuBar && lpDIS->itemState&ODS_INACTIVE) )
{
// Draw the text disabled?
OldTextColor = pDC->SetTextColor(GetSysColor(COLOR_GRAYTEXT));
}
else
{
// Draw the text normal
OldTextColor = pDC->SetTextColor(GetSysColor(COLOR_MENUTEXT));
}
if(bIsMenuBar)
{
pDC->DrawText(leftStr,RectSel, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
}
else
{
pDC->DrawText(leftStr,RectR, nFormat);
if(tablocr!=-1)
pDC->DrawText (rightStr,RectR,nFormatr);
}
pDC->SetTextColor(OldTextColor);
pDC->SelectObject(pOldFont);
pDC->SetBkMode(iOldMode);
}
// Draw the Bitmap or checkmarks
if(!bIsMenuBar)
{
CRect rect2 = RectR;
if(checkflag||standardflag||selectedflag||disableflag)
{
if(checkflag && checkmaps)
{
CPoint ptImage(RectL.left+3,RectL.top+4);
if(state&ODS_SELECTED)
checkmaps->Draw(pDC,1,ptImage,ILD_TRANSPARENT);
else
checkmaps->Draw(pDC,0,ptImage,ILD_TRANSPARENT);
}
else
{
//CPoint ptImage(rect.left+3,rect.top+2+dy);
HICON hDrawIcon = bitmap->ExtractIcon(0);
int cx,cy;
::ImageList_GetIconSize(*bitmap, &cx, &cy);
CSize size(cx,cy);
CPoint ptImage(RectL.left+3,RectL.top+4);
CBrush* pBrush = &m_brBitmap;
// Need to draw the checked state
if (state&ODS_CHECKED)
{
CRect rect = RectL;
rect.InflateRect (-1,-1);
CBrush Brush;
if(selectedflag)
Brush.CreateSolidBrush(DarkenColorXP(colorSel));
else
Brush.CreateSolidBrush(DarkenColorXP(colorMenu));
CPen* pOldPen = pDC->SelectObject(&Pen);
CBrush* pOldBrush = pDC->SelectObject(&Brush);
pDC->Rectangle(rect);
pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldPen);
}
else if(selectedflag)
{
CBrush Brush;
Brush.CreateSolidBrush(DarkenColorXP(colorSel));
ptImage.x++; ptImage.y++;
pDC->DrawState(ptImage, size, hDrawIcon, DSS_NORMAL | DSS_MONO, &Brush);
ptImage.x-=2; ptImage.y-=2;
}
if(state & ODS_DISABLED)
pDC->DrawState(ptImage, size, hDrawIcon, DSS_DISABLED, pBrush);
else
pDC->DrawState(ptImage, size, hDrawIcon, DSS_NORMAL,(HBRUSH)NULL);
}
}
if(pMenuData->m_nMenuIconNormal<0 && state&ODS_CHECKED && !checkflag)
{
MENUITEMINFO info;
ZeroMemory(&info,sizeof(info));
info.cbSize = sizeof(info);
info.fMask = MIIM_CHECKMARKS;
::GetMenuItemInfo(HWndToHmenu(lpDIS->hwndItem),lpDIS->itemID,MF_BYCOMMAND, &info);
if(state&ODS_CHECKED || info.hbmpUnchecked)
{
CRect rect = RectL;
rect.InflateRect (-1,-1);
COLORREF transparentcol;
if(state&ODS_SELECTED)
transparentcol = DarkenColorXP(colorSel);
else
transparentcol = DarkenColorXP(colorMenu);
CBrush Brush;
Brush.CreateSolidBrush(transparentcol);
CPen* pOldPen = pDC->SelectObject(&Pen);
CBrush* pOldBrush = pDC->SelectObject(&Brush);
pDC->Rectangle(rect);
pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldPen);
if (state&ODS_CHECKED)
{
rect.InflateRect (-1,-1);
if (!info.hbmpChecked)
{ // Checkmark
DrawSpecialCharStyle(pDC,rect,98,state);
}
else
{ // Bullet
DrawSpecialCharStyle(pDC,rect,105,state);
}
}
else
{
CSize size = rect.Size();
CPoint ptImage = rect.TopLeft();
if(state & ODS_DISABLED)
pDC->DrawState(ptImage, size, info.hbmpUnchecked, DSS_DISABLED, (HBRUSH)NULL);
else
pDC->DrawState(ptImage, size, info.hbmpUnchecked, DSS_NORMAL,(HBRUSH)NULL);
}
}
}
else if (lpDIS->itemID>=SC_SIZE && lpDIS->itemID<=SC_HOTKEY )
{
DrawSpecial_WinXP(pDC,RectL,lpDIS->itemID,state);
}
}
}
}
void CNewMenu::DrawItem_SpecialStyle (LPDRAWITEMSTRUCT lpDIS, BOOL bIsMenuBar)
{
if(!bIsMenuBar)
{
DrawItem_OldStyle(lpDIS,bIsMenuBar);
return;
}
ASSERT(lpDIS != NULL);
CDC* pDC = CDC::FromHandle(lpDIS->hDC);
ASSERT(lpDIS->itemData);
CNewMenuItemData* pMenuData = (CNewMenuItemData*)(lpDIS->itemData);
CRect rect(lpDIS->rcItem);
//rect.InflateRect(0,-1);
COLORREF ColorBack;
if(lpDIS->itemState&(ODS_SELECTED|ODS_HOTLIGHT))
{
ColorBack = GetSysColor(COLOR_HIGHLIGHT);
SetLastMenuRect(lpDIS->hDC,rect);
}
else
{
ColorBack = GetSysColor(cCOLOR_MENUBAR);
}
pDC->FillSolidRect(rect,ColorBack);
int iOldMode = pDC->SetBkMode( TRANSPARENT);
CString strText = pMenuData->GetString();
COLORREF crTextColor;
if(!(lpDIS->itemState & ODS_GRAYED))
{
if(lpDIS->itemState&(ODS_SELECTED|ODS_HOTLIGHT))
crTextColor = GetSysColor(COLOR_HIGHLIGHTTEXT);
else
crTextColor = GetSysColor(COLOR_MENUTEXT);
}
else
{
crTextColor = GetSysColor(COLOR_GRAYTEXT);
}
COLORREF oldColor = pDC->SetTextColor(crTextColor);
pDC->DrawText(strText,rect,DT_CENTER|DT_SINGLELINE|DT_VCENTER);
pDC->SetTextColor(oldColor);
pDC->SetBkMode( iOldMode);
}
void CNewMenu::DrawItem_OldStyle (LPDRAWITEMSTRUCT lpDIS, BOOL bIsMenuBar)
{
ASSERT(lpDIS != NULL);
CDC* pDC = CDC::FromHandle(lpDIS->hDC);
CRect rect;
ASSERT(lpDIS->itemData);
CNewMenuItemData* pMenuData = (CNewMenuItemData*)(lpDIS->itemData);
UINT state = pMenuData->m_nFlags;
CBrush m_brBackground;
COLORREF ColorBack = bIsMenuBar?GetSysColor(cCOLOR_MENUBAR):GetSysColor(COLOR_MENU);
m_brBackground.CreateSolidBrush(ColorBack);
CRect RectL(lpDIS->rcItem);
CRect RectR(lpDIS->rcItem);
CRect RectSel(lpDIS->rcItem);
RectL.InflateRect (-1,0,0,0);
RectR.InflateRect (-1,0,0,0);
RectSel.InflateRect (0,0,0,0);
if(!bIsMenuBar)
{
RectL.right = RectL.left + m_iconX + 6 + GAP;
RectR.left = RectL.right;
// Draw for Bitmapbackground
pDC->FillSolidRect (RectL,ColorBack);
}
else
{
#ifdef _TRACE_MENU_
TRACE(_T("BarState: 0x%lX Menus %ld\n"),lpDIS->itemState,m_dwOpenMenu);
#endif
if(!m_dwOpenMenu && lpDIS->itemState&ODS_SELECTED)
{
lpDIS->itemState = (lpDIS->itemState&~ODS_SELECTED)|ODS_HOTLIGHT;
}
RectR.InflateRect (1,0,0,0);
RectSel.InflateRect (0,0,-5,0);
RectSel.OffsetRect(1,-1);
SetLastMenuRect(lpDIS->hDC,RectSel);
}
// For keyboard navigation only
BOOL bDrawSmalSelection = FALSE;
// remove the selected bit if it's grayed out
if( (lpDIS->itemState&ODS_GRAYED) && !m_bSelectDisable )
{
if(lpDIS->itemState & ODS_SELECTED)
{
lpDIS->itemState &= ~ODS_SELECTED;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -