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

📄 ezmenu.cpp

📁 提供一种自画式菜单设计方法及实现
💻 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 + -