📄 ezmenu.cpp
字号:
#include "stdafx.h"
#include "EZMenu.h"
#include "resource.h"
CEZMenu::CEZMenu()
{
m_bLargeIcons=FALSE;
m_szBitmapSize=CSize(20,60);
m_nCount=m_nItems=0;
m_nAveHeight=16;
m_clrExtend=RGB(0,0,255);
CMenu::CMenu();
}
void CEZMenu::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
m_nCount++;
LPEZMENUITEMDATA lpez=(LPEZMENUITEMDATA)lpDrawItemStruct->itemData;
CDC* pdc=CDC::FromHandle(lpDrawItemStruct->hDC);
if(lpez->bSeperator)
{
int nWidth=0;
if(m_bitmap.m_hObject)
nWidth+=(m_szBitmapSize.cx+lpDrawItemStruct->rcItem.left);
CRect rcSep(lpDrawItemStruct->rcItem);
rcSep.left+=nWidth;
pdc->DrawEdge(&rcSep,EDGE_ETCHED,BF_TOP);
return;
}
//定义矩形框
CRect rect(lpDrawItemStruct->rcItem);
CRect rcBmp(rect);//位图框
CRect rcIcon(rect);//图标框
CRect rcProgress(rect);//进度条框
CRect rcText(rect);//文本框
//矩形框初始化
rcBmp.right=rcBmp.left+m_szBitmapSize.cx;
rcIcon.left=rcBmp.right+2;
rcIcon.right=rcIcon.left+(m_bLargeIcons?32:16);
rcProgress.left=rcIcon.right+2;
rcProgress.right=rcIcon.right+(lpez->bProgress?100:0);
rcProgress.top+=4;
rcProgress.bottom-=4;
rcText.left=rcProgress.right+2;
//画图代码
HICON hItemIcon=(m_bLargeIcons?lpez->hItemIconLarge:lpez->hItemIconSmall);
CSize szIcon=(m_bLargeIcons?CSize(32,32):CSize(16,16));
if (lpDrawItemStruct->itemAction & ODA_DRAWENTIRE)
{
//画图标
int nOldMap=pdc->SetMapMode(MM_TEXT);
if(hItemIcon)
pdc->DrawState(rcIcon.TopLeft(),szIcon,hItemIcon,DST_ICON|DSS_NORMAL,(CBrush*)NULL);
else if(lpez->bChecked)
{
HICON hCheck=(HICON)::LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(m_bLargeIcons?IDI_CHECK_LARGE:IDI_CHECK_SMALL),IMAGE_ICON,szIcon.cx,szIcon.cy,LR_DEFAULTCOLOR);
pdc->DrawState(rcIcon.TopLeft(),szIcon,hCheck,DST_ICON|DSS_NORMAL,(CBrush*)NULL);
}
//画进度条
if(lpez->bProgress)
{
pdc->Draw3dRect(&rcProgress,::GetSysColor(COLOR_HIGHLIGHT),::GetSysColor(COLOR_HIGHLIGHT));
CRect rectProgress(rcProgress);
rectProgress.DeflateRect(CSize(1,1));
CBrush *pBrush=new CBrush(::GetSysColor(COLOR_BTNFACE));
pdc->FillRect(rectProgress,pBrush);
delete pBrush;
pBrush=new CBrush(::GetSysColor(COLOR_HIGHLIGHT));
rectProgress.right-=lpez->nProgress;
pdc->FillRect(&rectProgress,pBrush);
delete pBrush;
}
//画文本
pdc->SetMapMode(nOldMap);
CBrush *pBrush=new CBrush(::GetSysColor(COLOR_BTNFACE));
pdc->FillRect(rcText,pBrush);
delete pBrush;
pdc->SetTextColor(::GetSysColor(COLOR_BTNTEXT));
pdc->SetBkColor(::GetSysColor(COLOR_BTNFACE));
pdc->DrawText(lpez->strItemText,&rcText,DT_LEFT|DT_NOCLIP|DT_SINGLELINE|DT_VCENTER);
//最后画位图
if(m_nCount==m_nItems)
{
m_nCount=0;
if(m_bitmap.m_hObject)
{
CDC memdc;
memdc.CreateCompatibleDC(pdc);
memdc.SelectObject(m_bitmap);
if(m_nAveHeight>m_szBitmapSize.cy)
{
int nTop=rect.bottom-m_szBitmapSize.cy;
pdc->BitBlt(rect.left,nTop,m_szBitmapSize.cx,m_szBitmapSize.cy,&memdc,0,0,SRCCOPY);
pdc->FillSolidRect(rect.left,rect.bottom-m_nAveHeight,m_szBitmapSize.cx,m_nAveHeight-m_szBitmapSize.cy,m_clrExtend);
}
else
pdc->BitBlt(rect.left,rect.bottom-m_nAveHeight,m_szBitmapSize.cx,m_nAveHeight,&memdc,0,0,SRCCOPY);
}
}
}
//画选中的选项
if ((lpDrawItemStruct->itemState & ODS_SELECTED) &&
(lpDrawItemStruct->itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))
{
if(hItemIcon)
{
CRect rcIconHilite(rcIcon);
rcIconHilite.left-=1;
rcIconHilite.top-=1;
//rcIconHilite.bottom+=1;
rcIconHilite.right+=1;
pdc->Draw3dRect(&rcIconHilite,::GetSysColor(COLOR_3DHILIGHT),::GetSysColor(COLOR_3DDKSHADOW));
}
//进度条
if(lpez->bProgress)
{
pdc->Draw3dRect(&rcProgress,::GetSysColor(COLOR_3DHILIGHT),::GetSysColor(COLOR_3DDKSHADOW));
}
//文本
CRect textrect(rcText);
COLORREF crOld=pdc->SetTextColor(::GetSysColor(COLOR_HIGHLIGHT));
COLORREF crBgOld=pdc->SetBkColor(::GetSysColor(COLOR_BTNFACE));
CFont* pFont=pdc->GetCurrentFont();
LOGFONT* pLf=new LOGFONT;
pFont->GetLogFont(pLf);
pLf->lfWeight=FW_SEMIBOLD;
CFont* pNewFont=new CFont;
pNewFont->CreateFontIndirect(pLf);
pFont=pdc->SelectObject(pNewFont);
pdc->DrawText(lpez->strItemText,&textrect,DT_LEFT|DT_NOCLIP|DT_SINGLELINE|DT_VCENTER);
pdc->SetTextColor(crOld);
pdc->SetBkColor(crBgOld);
delete pdc->SelectObject(pFont);
delete pLf;
textrect.top+=2;
textrect.bottom-=2;
textrect.left-=1;
pdc->Draw3dRect(&textrect,::GetSysColor(COLOR_3DHILIGHT),::GetSysColor(COLOR_3DDKSHADOW));
}
//画未选中的菜单
if (!(lpDrawItemStruct->itemState & ODS_SELECTED) &&
(lpDrawItemStruct->itemAction & ODA_SELECT))
{
if(hItemIcon)
{
CRect rcIconHilite(rcIcon);
rcIconHilite.left-=1;
rcIconHilite.top-=1;
//rcIconHilite.bottom+=1;
rcIconHilite.right+=1;
pdc->Draw3dRect(&rcIconHilite,::GetSysColor(COLOR_BTNFACE),::GetSysColor(COLOR_BTNFACE));
}
if(lpez->bProgress)
{
pdc->Draw3dRect(&rcProgress,::GetSysColor(COLOR_HIGHLIGHT),::GetSysColor(COLOR_HIGHLIGHT));
}
pdc->SetTextColor(::GetSysColor(COLOR_BTNTEXT));
pdc->SetBkColor(::GetSysColor(COLOR_BTNFACE));
CRect textrect(rcText);
CBrush *pBrush=new CBrush(::GetSysColor(COLOR_BTNFACE));
pdc->FillRect(&textrect,pBrush);
delete pBrush;
pdc->DrawText(lpez->strItemText,&textrect,DT_LEFT|DT_NOCLIP|DT_SINGLELINE|DT_VCENTER);
textrect.top+=2;
textrect.bottom-=2;
textrect.left-=1;
pdc->Draw3dRect(&textrect,::GetSysColor(COLOR_BTNFACE),::GetSysColor(COLOR_BTNFACE));
}
}
void CEZMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
LPEZMENUITEMDATA lpez=(LPEZMENUITEMDATA )lpMeasureItemStruct->itemData;
if(lpez->bSeperator)
{
lpMeasureItemStruct->itemHeight=5;
return;
}
CDC* pdc=new CDC;
pdc->Attach(::GetDC(AfxGetMainWnd()->m_hWnd));
CSize szText=pdc->GetTextExtent(lpez->strItemText);
::ReleaseDC(AfxGetMainWnd()->m_hWnd,pdc->m_hDC);
delete pdc;
if(lpez->bProgress) szText.cx+=100;
lpMeasureItemStruct->itemWidth=szText.cx+(m_bLargeIcons?32:16)+m_szBitmapSize.cx+8;
lpMeasureItemStruct->itemHeight=__max(m_bLargeIcons?32:16,szText.cy)+3;
m_nAveHeight=m_nItems*lpMeasureItemStruct->itemHeight;
}
CEZMenu::~CEZMenu()
{
DestroyMenu();
CMenu::~CMenu();
}
void CEZMenu::SetMenuBitmap(HBITMAP hBitmap)
{
m_bitmap.Attach(hBitmap);
}
void CEZMenu::SetLargeIcon(BOOL bLarge)
{
m_bLargeIcons=bLarge;
}
void CEZMenu::AppendOwnerDrawnItem(UINT nID, LPEZMENUITEMDATA lpez)
{
VERIFY(AppendMenu(MF_ENABLED | MF_OWNERDRAW, nID,(LPCTSTR)lpez));
}
void CEZMenu::SetBitmapDimension(CSize sz)
{
m_szBitmapSize=sz;
}
void CEZMenu::InsertOwnerDrawnMenuItem(UINT nID, LPEZMENUITEMDATA lpez,int nPos)
{
VERIFY(InsertMenu(nPos,MF_BYPOSITION|MF_ENABLED | MF_OWNERDRAW, nID,(LPCTSTR)lpez));
}
void CEZMenu::SetExtensionColor(COLORREF clrExtend)
{
m_clrExtend=clrExtend;
}
void CEZMenu::SetTotalItems(int nItems)
{
m_nItems=nItems;
}
CEZMenuItemData::CEZMenuItemData()
{
bChecked=FALSE;
bProgress=FALSE;
bSeperator=FALSE;
hItemIconLarge=hItemIconSmall=NULL;
nProgress=0;
strItemText.Empty();
}
void CEZMenu::ModifyOwnerDrawnMenuItem(int nPos, UINT nID, int nTotalCheck,LPEZMENUITEMDATA lpez)
{
//Iam not sure how to implement this.Suggestions are welcome.
//if(GetMenuItemCount()>(UINT)nTotalCheck)?
VERIFY(ModifyMenu(nPos,MF_BYPOSITION|MF_OWNERDRAW,nID,(LPCTSTR)lpez));
//else
// InsertOwnerDrawnMenuItem(nID,lpez,nPos);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -