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

📄 fbmenu.cpp

📁 在VC编程环境下
💻 CPP
字号:
/*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	文件:FBMenu.cpp

	版权:Firebird Software Workroom 保留

	声明:本源程序的版权受《中华人民共和国著作权法》以及其
		  它相关法律和条约的保护。任何有机会得到本源程序的
		  个人和机构,未经作者明确授权,不得将本源程序用于
		  任何商业目的(直接的或间接的)。对于非商业目的的使
		  用 (包括复制、传播、编译和修改), 原则上没有特别
		  的限制条款,但请在相关文档中说明其来源,并尊重原
		  作者的署名权。

	编写:秦传安(chings)	2000.6

	联络:E_mail:chings@163.net
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
#include "fclstd.h"
#include "FBMenu.h"

//####################################################################
CFBMenu::CFBMenu()
{
	m_hMenu = NULL;
}

CFBMenu::~CFBMenu()
{
	DestroyMenu();
}
//####################################################################
BOOL CFBMenu::CreateMenu()
{
	m_hMenu = ::CreateMenu();

	return (m_hMenu != NULL);
}
//####################################################################
BOOL CFBMenu::CreatePopupMenu()
{
	m_hMenu = ::CreatePopupMenu();

	return (m_hMenu != NULL);
}
//####################################################################
BOOL CFBMenu::DestroyMenu()
{
	if (m_hMenu == NULL)
		return FALSE;
	return ::DestroyMenu(m_hMenu);
}
//####################################################################
BOOL CFBMenu::Attach(HMENU hMenu)
{
	if(!IsMenu(hMenu))
		return FALSE;

	m_hMenu = hMenu;
	return TRUE;
}
//####################################################################
BOOL CFBMenu::LoadMenu(LPCTSTR lpszResourceName)
{
	HMODULE hMod = GetModuleHandle(NULL);

	return Attach(::LoadMenu(hMod,lpszResourceName));
}
//####################################################################
BOOL CFBMenu::LoadMenu(UINT nIDResource)
{
	return LoadMenu(MAKEINTRESOURCE(nIDResource));
}

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  class CCoolMenu

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

CCoolMenu::CCoolMenu()
{
	m_hBkBmp1 = NULL;
	m_hBkBmp2 = NULL;
	m_hFont = NULL;
}

CCoolMenu::~CCoolMenu()
{
	if(m_hBkBmp1)
		DeleteObject(m_hBkBmp1);
	if(m_hBkBmp2)
		DeleteObject(m_hBkBmp2);
}
//###################################################################################
BOOL CCoolMenu::Attach(HMENU hMenu)
{
	if(!CFBMenu::Attach(hMenu))
		return FALSE;

	char txt[_MAX_FNAME];
	MENUITEMINFO mii;
	memset(&mii,0,sizeof(mii));
	mii.cbSize = sizeof(mii);
	mii.dwTypeData = txt;
	mii.cch = _MAX_FNAME;
	mii.dwItemData = (DWORD)this;
	mii.fMask = MIIM_TYPE | MIIM_DATA;
	mii.fType = MFT_OWNERDRAW|MFT_STRING;

	int i;
	int n = (int)GetMenuItemCount();

	if(GetSubMenu(0) == NULL)//是弹出式菜单
	{
		for(i = 0; i<n; i++)
		{
			GetMenuString(i,txt,_MAX_FNAME,MF_BYPOSITION);
			SetMenuItemInfo(m_hMenu,i,TRUE,&mii);
		}
	}
	else//是主菜单
	{
		int m,j;
		HMENU hSub;
		for(i=0;i<n;i++)
		{
			hSub = GetSubMenu(i);
			if(!hSub)
				continue;

			m = ::GetMenuItemCount(hSub);
		
			itoa(m,txt,10);

			for(j=0;j<m;j++)
			{
				GetMenuString(j,txt,_MAX_FNAME,MF_BYPOSITION);
				SetMenuItemInfo(hSub,j,TRUE,&mii);
			}
		}
	}

	HDC hdc = GetDC(NULL);
	m_hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
	HFONT hft = (HFONT)SelectObject(hdc,m_hFont);
	SIZE sz;
	GetTextExtentPoint32(hdc,"A",1,&sz);
	m_cxFont = sz.cx;
	m_cyFont = sz.cy;
	SelectObject(hdc,hft);

	m_hBkBmp1 = CreateGradientBMP(hdc,RGB(203,185,156),
								RGB(158,139,117),480,sz.cy + 8,0,256);
	m_hBkBmp2 = CreateGradientBMP(hdc,RGB(158,139,117),
								RGB(203,185,156),480,sz.cy + 8,0,256);

	ReleaseDC(NULL,hdc);

	return TRUE;
}
//###################################################################################
void CCoolMenu::MeasureItem(LPMEASUREITEMSTRUCT pmis)
{
	char txt[_MAX_FNAME];
	GetMenuString(pmis->itemID,txt,_MAX_FNAME,MF_BYCOMMAND);

	pmis->itemWidth = m_cxFont*lstrlen(txt) + 8;
	pmis->itemHeight = m_cyFont + 6;
}
//###################################################################################
void CCoolMenu::DrawItem(LPDRAWITEMSTRUCT pds)
{
	HMENU hMenu = (HMENU)pds->hwndItem;

	char txt[_MAX_FNAME];
	txt[0] = '\0';
	MENUITEMINFO mii;
	memset(&mii,0,sizeof(mii));
	mii.cbSize = sizeof(mii);
	mii.dwTypeData = txt;
	mii.cch = _MAX_FNAME;
	mii.fMask = MIIM_TYPE;
	mii.fType = MFT_STRING;
	::GetMenuItemInfo(hMenu,pds->itemID,FALSE,&mii);

	HDC hBkDC = CreateCompatibleDC(pds->hDC);
	if((pds->itemState & ODS_SELECTED) &&
		!(pds->itemState & ODS_GRAYED))
		SelectObject(hBkDC,m_hBkBmp2);
	else
		SelectObject(hBkDC,m_hBkBmp1);

	BitBlt(pds->hDC,pds->rcItem.left,pds->rcItem.top,
			pds->rcItem.right - pds->rcItem.left,
			pds->rcItem.bottom - pds->rcItem.top,
			hBkDC,0,0,SRCCOPY);
	DeleteDC(hBkDC);

	RECT rc;
	CopyRect(&rc,&pds->rcItem);
	InflateRect(&rc,1,1);
	Draw3DRect(pds->hDC,&pds->rcItem,RGB(223,205,176),
				RGB(138,119,97),1);

	SetBkMode(pds->hDC,TRANSPARENT);
	if(pds->itemState & ODS_GRAYED)
		SetTextColor(pds->hDC,GetSysColor(COLOR_GRAYTEXT));
	pds->rcItem.top += 3;
	pds->rcItem.left += 8;
	pds->rcItem.right -= 8;

	SelectObject(pds->hDC,m_hFont);

	int i,n;
	n = lstrlen(txt);
	char tmp[_MAX_FNAME];

	for(i = 0; i<(n - 4); i++)
	{
		if(memcmp(txt + i,"Ctrl",4) == 0)
			break;
	}
	if(i<(n - 4))
	{
		lstrcpy(tmp,txt+i);
		txt[i] = '\0';
		DrawText(pds->hDC,tmp,lstrlen(tmp),&pds->rcItem,DT_RIGHT);
	}

	if(pds->itemState & ODS_CHECKED)
	{
		lstrcpy(tmp,txt);

		//这是个中文字符"●"
		txt[0] = (char)0xa1;
		txt[1] = (char)0xf1;
		lstrcpy(txt+2,tmp);
		pds->rcItem.left -= 4;
	}
	DrawText(pds->hDC,txt,lstrlen(txt),&pds->rcItem,DT_LEFT);
}

⌨️ 快捷键说明

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