📄 newmenu.cpp
字号:
DWORD MsgPos = ::GetMessagePos();
if(MsgPos==CNewMenuHook::m_dwMsgPos)
{
bDrawSmalSelection = TRUE;
}
else
{
CNewMenuHook::m_dwMsgPos = MsgPos;
}
}
}
if(state & MF_SEPARATOR)
{
if(pMenuData->m_nTitleFlags&MFT_TITLE)
{
DrawTitle(lpDIS,bIsMenuBar);
}
else
{
rect = lpDIS->rcItem;
rect.left += 1;
pDC->FillSolidRect(rect,ColorBack);
pDC->DrawEdge(&rect,EDGE_ETCHED,BF_TOP);
}
}
else
{
CRect rect2;
BOOL standardflag=FALSE,selectedflag=FALSE,disableflag=FALSE;
BOOL checkflag=FALSE;
CBrush m_brSelect;
int nIconNormal=-1,xoffset=-1;
CImageList *bitmap=NULL;
// set some colors and the font
m_brSelect.CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT));
// draw the colored rectangle portion
rect.CopyRect(&lpDIS->rcItem);
rect.OffsetRect (1,1);
rect2=rect=RectSel;
// draw the up/down/focused/disabled state
UINT state = lpDIS->itemState;
CString strText;
nIconNormal = pMenuData->m_nMenuIconNormal;
xoffset = pMenuData->m_nxOffset;
bitmap = pMenuData->m_pBitmap;
strText = pMenuData->GetString();
if( (state&ODS_CHECKED) && nIconNormal<0)
{
if(state&ODS_SELECTED && m_selectcheck>0)
checkflag=TRUE;
else if(m_unselectcheck>0)
checkflag=TRUE;
}
else if(nIconNormal != -1)
{
standardflag=TRUE;
if(state&ODS_SELECTED && !(state&ODS_GRAYED))
selectedflag=TRUE;
else if(state&ODS_GRAYED)
disableflag=TRUE;
}
if(bIsMenuBar)
{
//rect.InflateRect (1,0,0,0);
rect.OffsetRect(-1,1);
rect2=rect;
pDC->FillSolidRect (rect,ColorBack);
}
else
{
// Draw the background
pDC->FillSolidRect (rect,ColorBack);
}
// Draw the selection
if(state&ODS_SELECTED)
{
// You need only Text highlight and thats what you get
if(!bIsMenuBar)
{
if(checkflag||standardflag||selectedflag||disableflag||state&ODS_CHECKED)
{
rect2.SetRect(rect.left+m_iconX+4+GAP,rect.top,rect.right,rect.bottom);
}
pDC->FillRect(rect2,&m_brSelect);
}
else
{
pDC->Draw3dRect(rect ,GetSysColor(COLOR_3DSHADOW),GetSysColor(COLOR_3DHILIGHT));
}
}
else if(bIsMenuBar && (state&ODS_HOTLIGHT) && !(state&ODS_INACTIVE))
{
pDC->Draw3dRect(rect,GetSysColor(COLOR_3DHILIGHT),GetSysColor(COLOR_3DSHADOW));
}
else if (bDrawSmalSelection)
{
pDC->DrawFocusRect(rect);
}
// Draw the Bitmap or checkmarks
if(!bIsMenuBar)
{
CRect IconRect(rect.TopLeft(),CSize(m_iconX,m_iconY));
IconRect.OffsetRect(GAP+1,1+((rect.Height()-m_iconY)>>2));
CPoint ptImage = IconRect.TopLeft();
IconRect.InflateRect(2,2);
if(checkflag||standardflag||selectedflag||disableflag)
{
if(checkflag && checkmaps)
{
if(state&ODS_SELECTED)
checkmaps->Draw(pDC,1,ptImage,ILD_TRANSPARENT);
else
checkmaps->Draw(pDC,0,ptImage,ILD_TRANSPARENT);
}
else
{
// Need to draw the checked state
if (IsNewShell())
{
if(state&ODS_CHECKED)
{
pDC->Draw3dRect(IconRect,GetSysColor(COLOR_3DSHADOW),GetSysColor(COLOR_3DHILIGHT));
}
else if (selectedflag)
{
pDC->Draw3dRect(IconRect,GetSysColor(COLOR_3DHILIGHT),GetSysColor(COLOR_3DSHADOW));
}
}
if(state & ODS_DISABLED)
{
HICON hDrawIcon = bitmap->ExtractIcon(0);
int cx,cy;
::ImageList_GetIconSize(*bitmap, &cx, &cy);
CSize size(cx,cy);
pDC->DrawState(ptImage, size, hDrawIcon, DSS_DISABLED, (HBRUSH)NULL);
}
else
{
bitmap->Draw(pDC,0,ptImage,ILD_TRANSPARENT);
}
}
}
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)
{
// Rectangle for checkmarks
CRect rect = IconRect;
if (state&ODS_CHECKED)
Draw3DCheckmark(pDC, IconRect,info.hbmpChecked,state);
else
Draw3DCheckmark(pDC, IconRect,info.hbmpUnchecked,state);
}
}
else if (lpDIS->itemID>=SC_SIZE && lpDIS->itemID<=SC_HOTKEY)
{
DrawSpecial_OldStyle(pDC,IconRect,lpDIS->itemID,state);
}
}
if(!strText.IsEmpty())
{
COLORREF crText = GetSysColor(COLOR_MENUTEXT);
if(bIsMenuBar)
{
rect.left += 6;
if(lpDIS->itemState&ODS_INACTIVE)
crText = GetSysColor(COLOR_GRAYTEXT);
}
else
{
if(lpDIS->itemState&ODS_SELECTED)
crText = GetSysColor(COLOR_HIGHLIGHTTEXT);
rect.left += m_iconX + 12;
}
CRect rectt(rect.left,rect.top-1,rect.right,rect.bottom-1);
// Find tabs
CString leftStr,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')));
rectt.right-=m_iconX;
}
else
leftStr=strText;
int iOldMode = pDC->SetBkMode( TRANSPARENT);
// Draw the text in the correct colour:
UINT nFormat = DT_LEFT|DT_SINGLELINE|DT_VCENTER;
UINT nFormatr = DT_RIGHT|DT_SINGLELINE|DT_VCENTER;
if(bIsMenuBar)
{
rectt = RectSel;
if(state & ODS_SELECTED)
{
rectt.OffsetRect(1,1);
}
nFormat = DT_CENTER|DT_SINGLELINE|DT_VCENTER;
}
if(!(lpDIS->itemState & ODS_GRAYED))
{
pDC->SetTextColor(crText);
pDC->DrawText (leftStr,rectt,nFormat);
if(tablocr!=-1)
pDC->DrawText (rightStr,rectt,nFormatr);
}
else
{
// Draw the disabled text
if(!(state & ODS_SELECTED))
{
CRect offset = rectt;
offset.OffsetRect (1,1);
pDC->SetTextColor(GetSysColor(COLOR_BTNHILIGHT));
pDC->DrawText(leftStr,&offset, nFormat);
if(tablocr!=-1)
pDC->DrawText (rightStr,&offset,nFormatr);
pDC->SetTextColor(GetSysColor(COLOR_GRAYTEXT));
pDC->DrawText(leftStr,rectt, nFormat);
if(tablocr!=-1)
pDC->DrawText(rightStr,rectt,nFormatr);
}
else
{
// And the standard Grey text:
pDC->SetTextColor(ColorBack);
pDC->DrawText(leftStr,rectt, nFormat);
if(tablocr!=-1)
pDC->DrawText (rightStr,rectt,nFormatr);
}
}
pDC->SetBkMode( iOldMode );
}
m_brSelect.DeleteObject();
}
m_brBackground.DeleteObject();
}
BOOL CNewMenu::IsMenuBar(HMENU hMenu)
{
BOOL bIsMenuBar = ::IsMenu(hMenu);
if(bIsMenuBar)
{
CNewMenu* pMenu = DYNAMIC_DOWNCAST(CNewMenu,CMenu::FromHandlePermanent(m_hParentMenu));
if (pMenu!=NULL && pMenu->m_hParentMenu!=NULL)
{
bIsMenuBar = FALSE;
}
}
return bIsMenuBar;
}
/*
==========================================================================
void CNewMenu::MeasureItem(LPMEASUREITEMSTRUCT)
---------------------------------------------
Called by the framework when it wants to know what the width and height
of our item will be. To accomplish this we provide the width of the
icon plus the width of the menu text, and then the height of the icon.
==========================================================================
*/
void CNewMenu::MeasureItem_OldStyle( LPMEASUREITEMSTRUCT lpMIS, BOOL bIsMenuBar )
{
ASSERT(lpMIS->itemData);
CNewMenuItemData* pMenuData = (CNewMenuItemData*)(lpMIS->itemData);
UINT state = pMenuData->m_nFlags;
if(state & MF_SEPARATOR)
{
if(pMenuData->m_nTitleFlags&MFT_TITLE)
{
// DC of the desktop
CClientDC myDC(NULL);
CFont font;
font.CreatePointFont(160,_T("Arial"));
CFont* pOldFont = myDC.SelectObject (&font);
LPCTSTR lpstrText = pMenuData->GetString();
SIZE size;
VERIFY(::GetTextExtentPoint32(myDC.m_hDC,lpstrText,(int)_tcslen(lpstrText),&size));
// Select old font in
myDC.SelectObject(pOldFont);
if(pMenuData->m_nTitleFlags&MFT_SIDE_TITLE)
{
lpMIS->itemWidth = size.cy*3/4 -GetSystemMetrics(SM_CXMENUCHECK);
// Don't make the menu higher than menuitems in it
lpMIS->itemHeight = 0;
if(pMenuData->m_nTitleFlags&MFT_LINE)
{
lpMIS->itemWidth += 6;
}
}
else
{
lpMIS->itemWidth = size.cx*3/4;
lpMIS->itemHeight = size.cy*3/4;
if(pMenuData->m_nTitleFlags&MFT_LINE)
{
lpMIS->itemHeight += 6;
}
}
}
else
{
lpMIS->itemHeight = 3;
}
}
else
{
CFont m_fontMenu;
LOGFONT m_lf;
ZeroMemory ((PVOID) &m_lf,sizeof (LOGFONT));
NONCLIENTMETRICS nm;
nm.cbSize = sizeof (NONCLIENTMETRICS);
VERIFY(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, nm.cbSize,&nm,0));
m_lf = nm.lfMenuFont;
// Default selection?
if(state&ODS_DEFAULT)
{
// Make the font bold
m_lf.lfWeight = FW_BOLD;
}
m_fontMenu.CreateFontIndirect (&m_lf);
// DC of the desktop
CClientDC myDC(NULL);
// Select menu font in...
CFont* pOldFont = myDC.SelectObject (&m_fontMenu);
//Get pointer to text SK
const LPCTSTR lpstrText = pMenuData->GetString();
SIZE size;
VERIFY(::GetTextExtentPoint32(myDC.m_hDC,lpstrText,(int)_tcslen(lpstrText),&size));
// Select old font in
myDC.SelectObject(pOldFont);
// Set width and height:
if(bIsMenuBar)
{
lpMIS->itemWidth = size.cx ;
}
else
{
lpMIS->itemWidth = m_iconX + size.cx + m_iconX + GAP;
}
// Check the Key-Shortcut
if(_tcsstr(lpstrText, _T("\t")) != NULL)
lpMIS->itemWidth += 15;
int temp = GetSystemMetrics(SM_CYMENU);
lpMIS->itemHeight = (temp>(m_iconY+4)) ? temp : (m_iconY+4);
m_fontMenu.DeleteObject();
// set status bar as appropriate
UINT nItemID = (lpMIS->itemID & 0xFFF0);
// Special case for system menu
if (nItemID>=SC_SIZE && nItemID<=SC_HOTKEY)
{
BOOL bGetNext = FALSE;
// search the actual menu item
for (int j=0;j<m_MenuList.GetUpperBound();++j)
{
CNewMenuItemData* pTemp = m_MenuList[j];
if(pTemp==pMenuData || bGetNext==TRUE)
{
bGetNext = TRUE;
pTemp = m_MenuList[j+1];
if(pTemp->m_nID)
{
lpMIS->itemData = (ULONG_PTR)pTemp;
lpMIS->itemID = pTemp->m_nID;
UINT nOrgWidth = lpMIS->itemWidth;
MeasureItem_OldStyle(lpMIS,bIsMenuBar);
// Restore old values
lpMIS->itemData = (ULONG_PTR)pMenuData;
lpMIS->itemID = pMenuData->m_nID;
lpMIS->itemWidth = max(lpMIS->itemWidth,nOrgWidth);
break;
}
}
}
lpMIS->itemHeight = temp;
}
}
}
void CNewMenu::MeasureItem_WinXP( LPMEASUREITEMSTRUCT lpMIS, BOOL bIsMenuBar )
{
ASSERT(lpMIS->itemData);
CNewMenuItemData* pMenuData = (CNewMenuItemData*)(lpMIS->itemData);
UINT state = pMenuData->m_nFlags;
if(state & MF_SEPARATOR)
{
if(pMenuData->m_nTitleFlags&MFT_TITLE)
{
// DC of the desktop
CClientDC myDC(NULL);
CFont font;
font.CreatePointFont(160,_T("Arial"));
CFont* pOldFont = myDC.SelectObject (&font);
LPCTSTR lpstrText = pMenuData->GetString();
SIZE size;
VERIFY(::GetTextExtentPoint32(myDC.m_hDC,lpstrText,(int)_tcslen(lpstrText),&size));
// Select old font in
myDC.SelectObject(pOldFont);
if(pMenuData->m_nTitleFlags&MFT_SIDE_TITLE)
{
lpMIS->itemWidth = size.cy*3/4 -GetSystemMetrics(SM_CXMENUCHECK);
// Don't make the menu higher than menuitems in it
lpMIS->itemHeight = 0;
if(pMenuData->m_nTitleFlags&MFT_LINE)
{
lpMIS->itemWidth += 6;
}
}
else
{
lpMIS->itemWidth = size.cx*3/4;
lpMIS->itemHeight = size.cy*3/4;
if(pMenuData->m_nTitleFlags&MFT_LINE)
{
lpMIS->itemHeight += 6;
}
}
}
else
{
lpMIS->itemHeight = 3;
}
}
else
{
CFont m_fontMenu;
LOGFONT m_lf;
ZeroMemory ((PVOID) &m_lf,sizeof (LOGFONT));
NONCLIENTMETRICS nm;
nm.cbSize = sizeof (NONCLIENTMETRICS);
VERIFY(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, nm.cbSize,&nm,0));
m_lf = nm.lfMenuFont;
// Default selection?
if(state&ODS_DEFAULT)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -