⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 coolmenu.cpp

📁 这是书上的代码
💻 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 + -