📄 coolmenu.cpp
字号:
#include "stdafx.h"
#include "CoolMenu.h"
void CCoolMenu::SetIcon(BOOL bVisible,BOOL bSmall)
{
m_bIcon=bVisible;
IconSize=CSize(0,0);
m_szIcon=CSize(0,0);
m_nIconOffset=0;
m_szText.cx=80;
m_szText.cy=20;
m_nTextOffset=12;
if(m_bIcon && bSmall)
{
IconSize=CSize(16,16);
m_szIcon=CSize(20,20);
m_nIconOffset=1;
m_nTextOffset=4;
}
if(m_bIcon && !bSmall)
{
IconSize=CSize(32,32);
m_szIcon=CSize(36,36);
m_nIconOffset=1;
m_szText.cx=120;
m_szText.cy=36;
m_nTextOffset=4;
}
}
void CCoolMenu::SetBitmap(BOOL bVisible,UINT nID)
{
m_bBitmap=bVisible;
m_szBitmapSize=CSize(0,0);
m_nBitmap.m_hObject=NULL;
if(m_bBitmap && nID>0) m_nBitmap.LoadBitmap(nID);
}
void CCoolMenu::SetBitmapWidth(int nWidth)
{
if(m_bBitmap && nWidth>0)
{
m_szBitmapSize.cx=nWidth;
m_bBitmapWidth=TRUE;
}
}
CCoolMenu::CCoolMenu()
{
m_nCount=0;
m_nItems=0;
m_bBitmapWidth=FALSE;
SetIcon(FALSE);
SetBitmap(FALSE);
m_cMenuColor=::GetSysColor(COLOR_BTNFACE);
m_cNormalTextColor=::GetSysColor(COLOR_BTNTEXT);
m_cSelectedTextColor=::GetSysColor(COLOR_HIGHLIGHTTEXT);
m_cStartColor=RGB(255,100,100);
m_cEndColor=RGB(100,100,255);
m_cBitmapStartColor=RGB(10,36,106);
m_cBitmapEndColor=RGB(166,202,240);
}
CCoolMenu::~CCoolMenu()
{
DestroyMenu();
}
void CCoolMenu::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
m_nCount++;
CMenuItem *pMenuItem=(CMenuItem *)lpDrawItemStruct->itemData;
CDC *pDC;
pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
CRect r(lpDrawItemStruct->rcItem);
if(pMenuItem->bSeperator)
{
CRect rcSep(r.left+1,r.top,r.right-1,r.bottom);
if(m_bBitmap) rcSep.left+=m_szBitmapSize.cx;
pDC->FillSolidRect(rcSep,m_cMenuColor);
rcSep.top+=(r.bottom-r.top)/2-1;
pDC->DrawEdge(&rcSep,EDGE_ETCHED,BF_TOP);
if(m_nCount==m_nItems && m_bBitmap)
{
m_nCount=0;
DrawBitmap(pDC);
}
return;
}
HICON hItemIcon=pMenuItem->hItemIcon;
pDC->SetBkMode(TRANSPARENT);
CRect rcIcon(r),rcText(r);
rcIcon.left=m_szBitmapSize.cx+m_nIconOffset;
if(m_bIcon && hItemIcon) rcIcon.right=rcIcon.left+m_szIcon.cx;
else rcIcon.right=rcIcon.left;
if(m_bIcon && hItemIcon) rcText.left=rcIcon.right+m_nIconOffset;
else rcText.left=rcIcon.right;
CRect textRect(rcText);
textRect.left+=m_nTextOffset;
if(m_bIcon && !hItemIcon) textRect.left+=m_szIcon.cx+m_nIconOffset;
//绘制整个菜单
if(lpDrawItemStruct->itemAction & ODA_DRAWENTIRE)
{
if(m_bIcon && hItemIcon)
{
CPoint ptIcon;
ptIcon.x=rcIcon.left+(rcIcon.Width()-IconSize.cx)/2;
ptIcon.y=rcIcon.top+(rcIcon.Height()-IconSize.cy)/2;
pDC->DrawState(ptIcon,IconSize,hItemIcon,DST_ICON|DSS_NORMAL,(CBrush*)NULL);
}
pDC->FillSolidRect(rcText,m_cMenuColor);
pDC->SetTextColor(m_cNormalTextColor);
pDC->DrawText(pMenuItem->strItemText,&textRect,DT_LEFT|DT_NOCLIP|DT_SINGLELINE|DT_VCENTER);
if(m_nCount==m_nItems && m_bBitmap)
{
m_nCount=0;
DrawBitmap(pDC);
}
}
//绘制处于选中状态的菜单项
if((lpDrawItemStruct->itemState & ODS_SELECTED) && (lpDrawItemStruct->itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))
{
if(m_bIcon && hItemIcon)
{
CRect rcIconHilite(rcIcon);
rcIconHilite.right+=1;
pDC->DrawEdge(&rcIconHilite,BDR_RAISEDINNER,BF_RECT);
}
DrawGradientRect(pDC,rcText,m_cStartColor,m_cEndColor);
pDC->SetTextColor(m_cSelectedTextColor);
pDC->DrawText(pMenuItem->strItemText,&textRect,DT_LEFT|DT_NOCLIP|DT_SINGLELINE|DT_VCENTER);
}
//绘制处于未选中状态的菜单项
if(!(lpDrawItemStruct->itemState & ODS_SELECTED) && (lpDrawItemStruct->itemAction & ODA_SELECT))
{
if(m_bIcon && hItemIcon)
{
CRect rcIconHilite(rcIcon);
rcIconHilite.right+=1;
pDC->Draw3dRect(&rcIconHilite,m_cMenuColor,m_cMenuColor);
}
pDC->FillSolidRect(&rcText,m_cMenuColor);
pDC->SetTextColor(m_cNormalTextColor);
pDC->DrawText(pMenuItem->strItemText,&textRect,DT_LEFT|DT_NOCLIP|DT_SINGLELINE|DT_VCENTER);
}
}
void CCoolMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
if(m_bBitmap==FALSE) m_szBitmapSize.cx=0;
else if(!m_bBitmapWidth) //根据图标大小设置垂直条位图的宽度
{
m_szBitmapSize.cx=18;
if(IconSize.cx==32) m_szBitmapSize.cx=24;
}
CMenuItem *pMenuItem=(CMenuItem *)lpMeasureItemStruct->itemData;
lpMeasureItemStruct->itemWidth=m_szBitmapSize.cx+m_szIcon.cx+m_szText.cx+m_nIconOffset*2;
if(pMenuItem->bSeperator) lpMeasureItemStruct->itemHeight=8;
else lpMeasureItemStruct->itemHeight=m_szText.cy;
m_szBitmapSize.cy+=lpMeasureItemStruct->itemHeight;
}
void CCoolMenu::AppendMenuItem(UINT nID,CMenuItem *pMenuItem)
{
UINT nFlags=MF_ENABLED|MF_OWNERDRAW;
if(pMenuItem->bSeperator) nFlags=MF_DISABLED|MF_OWNERDRAW;
VERIFY(AppendMenu(nFlags,nID,(LPCTSTR)pMenuItem));
m_nItems++;
}
void CCoolMenu::InsertMenuItem(UINT nID,CMenuItem *pMenuItem,int nPos)
{
UINT nFlags=MF_BYPOSITION|MF_ENABLED|MF_OWNERDRAW;
if(pMenuItem->bSeperator) nFlags=MF_BYPOSITION|MF_DISABLED|MF_OWNERDRAW;
VERIFY(InsertMenu(nPos,nFlags,nID,(LPCTSTR)pMenuItem));
m_nItems++;
}
void CCoolMenu::DrawGradientRect(CDC *pDC,CRect rect,COLORREF cStart,COLORREF cEnd,BOOL bHorizon)
{
if(cStart==cEnd) pDC->FillSolidRect(&rect,cStart);
{
BYTE r0,g0,b0,r1,g1,b1;
int x0,y0,x1,y1;
r0=GetRValue(cStart);g0=GetGValue(cStart);b0=GetBValue(cStart);
r1=GetRValue(cEnd);g1=GetGValue(cEnd);b1=GetBValue(cEnd);
x0=rect.left;y0=rect.top;
x1=rect.right;y1=rect.bottom;
int r,g,b;
if(!bHorizon)//垂直渐变
for(int y=y0;y<y1;y++)
{
r=(r1*(y-y0)+r0*(y1-y))/(y1-y0);
g=(g1*(y-y0)+g0*(y1-y))/(y1-y0);
b=(b1*(y-y0)+b0*(y1-y))/(y1-y0);
CPen pen1(PS_SOLID,1,RGB(r,g,b)),*pOldPen1;
pOldPen1=pDC->SelectObject(&pen1);
pDC->MoveTo(x0,y);
pDC->LineTo(x1,y);
pDC->SelectObject(pOldPen1);
}
else//水平渐变
for(int x=x0;x<x1;x++)
{
r=(r1*(x-x0)+r0*(x1-x))/(x1-x0);
g=(g1*(x-x0)+g0*(x1-x))/(x1-x0);
b=(b1*(x-x0)+b0*(x1-x))/(x1-x0);
CPen pen2(PS_SOLID,1,RGB(r,g,b)),*pOldPen2;
pOldPen2=pDC->SelectObject(&pen2);
pDC->MoveTo(x,y0);
pDC->LineTo(x,y1);
pDC->SelectObject(pOldPen2);
}
}
}
void CCoolMenu::DrawBitmap(CDC *pDC)
{
CRect rcBitmap(0,0,m_szBitmapSize.cx,m_szBitmapSize.cy);
if(m_nBitmap.m_hObject==NULL) DrawGradientRect(pDC,rcBitmap,m_cBitmapStartColor,m_cBitmapEndColor,FALSE);
else
{
CDC memDC;
memDC.CreateCompatibleDC(pDC);
BITMAP bmp;
m_nBitmap.GetObject(sizeof(BITMAP),&bmp);
CBitmap *pOldBitmap;
pOldBitmap=memDC.SelectObject(&m_nBitmap);
pDC->StretchBlt(0,0,m_szBitmapSize.cx,m_szBitmapSize.cy,&memDC,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
memDC.SelectObject(pOldBitmap);
memDC.DeleteDC();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -