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

📄 custommenu.cpp

📁 MFC程序开发参考大全 【明日科技】宋坤 刘锐宁 李伟明 【丛 书 名】 软件工程师典藏 【出 版 社】 人民邮电出版社 本书详细介绍了MFC框架中所有常用类及控件的应用
💻 CPP
字号:
// CustomMenu.cpp: implementation of the CCustomMenu class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "PopMenu.h"
#include "CustomMenu.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CCustomMenu::CCustomMenu()
{
	m_ImageIndex = 0;
	//设置字体
	m_TitleFont.CreateFont(-14,-8,900,0,FW_BOLD,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_MODERN,"华文细黑");
}

CCustomMenu::~CCustomMenu()
{

}
//绘制菜单左侧标题
void CCustomMenu::DrawMenuTitle(CDC *pDC, CRect rect, CString title)
{
	CBitmap m_bitmap;
	m_bitmap.LoadBitmap(IDB_LEFTBITMAP); 
	BITMAP m_size;
	m_bitmap.GetBitmap(&m_size);
	CDC m_memdc;
	m_memdc.CreateCompatibleDC(pDC);
	CGdiObject* m_oldobject;
	m_oldobject = m_memdc.SelectObject(&m_bitmap);
	pDC->StretchBlt(0,0,28,rect.bottom,&m_memdc,0,0,m_size.bmWidth,m_size.bmHeight,SRCCOPY);
	m_bitmap.DeleteObject();
	CFont* m_oldfont = pDC->SelectObject(&m_TitleFont);
	pDC->TextOut(rect.left+5,rect.Height()+130,title);
	pDC->SelectObject(m_oldfont);
}
//绘制菜单项文本
void CCustomMenu::DrawItemText(CDC *pDC, LPSTR str, CRect rect)
{
	rect.DeflateRect(40,0,0,0);
	pDC->DrawText(str,rect,DT_SINGLELINE|DT_VCENTER|DT_LEFT);
}
//绘制菜单项背景图片
void CCustomMenu::DrawComMenu(CDC *pDC, CRect rect, BOOL select)
{
	if(select)
	{
		pDC->SelectStockObject(BLACK_PEN);
		rect.DeflateRect(29,1,0,2);
		pDC->Rectangle(rect);
		CBitmap m_bitmap;
		m_bitmap.LoadBitmap(IDB_ITEMBITMAP);
		BITMAP m_size;
		m_bitmap.GetBitmap(&m_size);
		CDC m_memdc;
		m_memdc.CreateCompatibleDC(pDC);
		CGdiObject* m_oldobject;
		m_oldobject = m_memdc.SelectObject(&m_bitmap);
		pDC->StretchBlt(rect.left+1,rect.top+1,rect.Width()-2,rect.Height()-2,&m_memdc,0,0,m_size.bmWidth,m_size.bmHeight,SRCCOPY);
		m_bitmap.DeleteObject();
	}
	else
	{
		pDC->FillSolidRect(rect,RGB(255,255,255));
	}
}
//绘制分隔条
void CCustomMenu::DrawSeparater(CDC *pDC, CRect rect)
{
	if(pDC != NULL)
	{
		rect.DeflateRect(29,0,0,0);
		pDC->Draw3dRect(rect,RGB(0,0,255),RGB(0,0,255));
	}
}
//修改菜单项信息
BOOL CCustomMenu::ChangeMenuItem(CMenu *menu)
{
	int m_index=0;
	if(menu != NULL)
	{
		int m_itemcount = menu->GetMenuItemCount(); //获得菜单项个数
		for(int i=0;i<m_itemcount;i++)
		{
			//获得菜单项文本
			menu->GetMenuString(i,m_ItemLists[m_index].m_ItemText,MF_BYPOSITION);
			int m_itemID = menu->GetMenuItemID(i); //获得菜单项ID
			m_ItemLists[m_index].m_ItemID = m_itemID;
			if(m_itemID>0)
			{
				m_ItemLists[m_index].m_ItemIndex= m_ImageIndex;
				m_ImageIndex++;
			}
			//修改菜单项信息
			menu->ModifyMenu(i,MF_OWNERDRAW | MF_BYPOSITION | MF_STRING,
				m_ItemLists[m_index].m_ItemID,(LPSTR)&(m_ItemLists[m_index]));
			m_index++;
			CMenu* m_subMenu = menu->GetSubMenu(i);
			if(m_subMenu)
			{
				ChangeMenuItem(m_subMenu);
			}
		}
	}
	return TRUE	;
}
//设置菜单项大小
void CCustomMenu::MeasureItem(LPMEASUREITEMSTRUCT lpStruct)
{
	if(lpStruct->CtlType==ODT_MENU)
	{
		lpStruct->itemHeight = 22; //设置菜单项的高
		lpStruct->itemWidth = 100; //设置菜单项的宽
		CMenuItemInfo* m_iteminfo;
		m_iteminfo = (CMenuItemInfo*)lpStruct->itemData;
		if(m_iteminfo->m_ItemID == 0)
		{
			lpStruct->itemHeight = 1; //设置分隔条
		}
	}
}
//重绘菜单项
void CCustomMenu::DrawItem(LPDRAWITEMSTRUCT lpStruct)
{
	if(lpStruct->CtlType==ODT_MENU)
	{
		if(lpStruct->itemData == NULL)	return;
		unsigned int m_state = lpStruct->itemState; //获得菜单项状态
		CDC* pDC = CDC::FromHandle(lpStruct->hDC);
		CString str = ((CMenuItemInfo*)(lpStruct->itemData))->m_ItemText;
		LPSTR m_str = str.GetBuffer(str.GetLength());
		int m_itemID = ((CMenuItemInfo*)(lpStruct->itemData))->m_ItemID;	
		int m_itemicon = ((CMenuItemInfo*)(lpStruct->itemData))->m_ItemIndex;
		CRect m_rect = lpStruct->rcItem;	
		pDC->SetBkMode(TRANSPARENT); //设置菜单项文本背景透明	
		switch(m_itemID)
		{
		case 0: //绘制分隔条
				DrawSeparater(pDC,m_rect);
				break;
		default: //绘制菜单项和左侧标题
				DrawComMenu(pDC,m_rect,m_state&ODS_SELECTED);
				DrawItemText(pDC,m_str,m_rect);
				DrawMenuTitle(pDC,m_rect,"明日科技有限公司");				
				break;
		}			
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -