📄 fbmenu.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 + -