📄 newmenu.cpp
字号:
{
// Make the font bold
m_lf.lfWeight = FW_BOLD;
}
m_fontMenu.CreateFontIndirect (&m_lf);
// DC of the desktop
CClientDC myDC(NULL);
// Select menu font in...
CFont* pOldFont = myDC.SelectObject (&m_fontMenu);
//Get pointer to text SK
const LPCTSTR lpstrText = pMenuData->GetString();
SIZE size;
VERIFY(::GetTextExtentPoint32(myDC.m_hDC,lpstrText,(int)_tcslen(lpstrText),&size));
// Select old font in
myDC.SelectObject(pOldFont);
// Set width and height:
if(bIsMenuBar)
{
lpMIS->itemWidth = size.cx ;
}
else
{
lpMIS->itemWidth = m_iconX + size.cx + m_iconX + GAP;
}
// Check the Key-Shortcut
if(_tcsstr(lpstrText, _T("\t")) != NULL)
lpMIS->itemWidth += 15;
int temp = GetSystemMetrics(SM_CYMENU);
lpMIS->itemHeight = temp>m_iconY+8 ? temp : m_iconY+8;
m_fontMenu.DeleteObject();
// set status bar as appropriate
UINT nItemID = (lpMIS->itemID & 0xFFF0);
// Special case for system menu
if (nItemID>=SC_SIZE && nItemID<=SC_HOTKEY)
{
BOOL bGetNext = FALSE;
// search the actual menu item
for (int j=0;j<m_MenuList.GetUpperBound();++j)
{
CNewMenuItemData* pTemp = m_MenuList[j];
if(pTemp==pMenuData || bGetNext==TRUE)
{
bGetNext = TRUE;
pTemp = m_MenuList[j+1];
if(pTemp->m_nID)
{
lpMIS->itemData = (ULONG_PTR)pTemp;
lpMIS->itemID = pTemp->m_nID;
UINT nOrgWidth = lpMIS->itemWidth;
MeasureItem_WinXP(lpMIS,bIsMenuBar);
// Restore old values
lpMIS->itemData = (ULONG_PTR)pMenuData;
lpMIS->itemID = pMenuData->m_nID;
lpMIS->itemWidth = max(lpMIS->itemWidth,nOrgWidth);
break;
}
}
}
lpMIS->itemHeight = temp;
}
}
}
void CNewMenu::SetIconSize (int width, int height)
{
m_iconX = width;
m_iconY = height;
}
BOOL CNewMenu::AppendODMenu(LPCTSTR lpstrText,UINT nFlags,UINT nID,int nIconNormal)
{
// Add the MF_OWNERDRAW flag if not specified:
if(!nID)
{
if(nFlags&MF_BYPOSITION)
nFlags=MF_SEPARATOR|MF_OWNERDRAW|MF_BYPOSITION;
else
nFlags=MF_SEPARATOR|MF_OWNERDRAW;
}
else if(!(nFlags & MF_OWNERDRAW))nFlags |= MF_OWNERDRAW;
if(nFlags & MF_POPUP)
{
m_AllSubMenus.Add(UIntToHMenu(nID));
m_SubMenus.Add(UIntToHMenu(nID));
}
CNewMenuItemData *mdata = new CNewMenuItemData;
m_MenuList.Add(mdata);
mdata->SetString(lpstrText);
mdata->m_nMenuIconNormal = nIconNormal;
mdata->m_nxOffset=-1;
if(nIconNormal>=0)
{
mdata->m_nxOffset=0;
LoadFromToolBar(nID,nIconNormal,mdata->m_nxOffset);
if(mdata->m_pBitmap)
mdata->m_pBitmap->DeleteImageList();
else
mdata->m_pBitmap=new(CImageList);
mdata->m_pBitmap->Create(m_iconX,m_iconY,ILC_COLORDDB|ILC_MASK,1,1);
if(!AddBitmapToImageList(mdata->m_pBitmap,nIconNormal))
{
mdata->m_pBitmap->DeleteImageList();
delete mdata->m_pBitmap;
mdata->m_pBitmap=NULL;
mdata->m_nMenuIconNormal = nIconNormal = -1;
mdata->m_nxOffset = -1;
}
}
mdata->m_nFlags = nFlags;
mdata->m_nID = nID;
return(CMenu::AppendMenu(nFlags, nID, (LPCTSTR)mdata));
}
BOOL CNewMenu::AppendODMenu(LPCTSTR lpstrText,UINT nFlags,UINT nID,
CImageList *il,int xoffset)
{
// Add the MF_OWNERDRAW flag if not specified:
if(!nID)
{
if(nFlags&MF_BYPOSITION)
nFlags=MF_SEPARATOR|MF_OWNERDRAW|MF_BYPOSITION;
else
nFlags=MF_SEPARATOR|MF_OWNERDRAW;
}
else if(!(nFlags & MF_OWNERDRAW))
nFlags |= MF_OWNERDRAW;
if(nFlags & MF_POPUP)
{
m_AllSubMenus.Add(UIntToHMenu(nID));
m_SubMenus.Add(UIntToHMenu(nID));
}
CNewMenuItemData* mdata = new CNewMenuItemData;
m_MenuList.Add(mdata);
mdata->SetString(lpstrText);
if(il)
{
mdata->m_nMenuIconNormal = 0;
mdata->m_nxOffset=0;
if(mdata->m_pBitmap)
mdata->m_pBitmap->DeleteImageList();
else
mdata->m_pBitmap=new(CImageList);
ImageListDuplicate(il,xoffset,mdata->m_pBitmap);
}
else
{
mdata->m_nMenuIconNormal = -1;
mdata->m_nxOffset = -1;
}
mdata->m_nFlags = nFlags;
mdata->m_nID = nID;
return(CMenu::AppendMenu(nFlags, nID, (LPCTSTR)mdata));
}
BOOL CNewMenu::InsertODMenu(UINT nPosition,LPCTSTR lpstrText,UINT nFlags,UINT nID,
int nIconNormal)
{
if(!(nFlags & MF_BYPOSITION))
{
int iPosition =0;
CNewMenu* pMenu = FindMenuOption(nPosition,iPosition);
if(pMenu)
{
return(pMenu->InsertODMenu(iPosition,lpstrText,nFlags|MF_BYPOSITION,nID,nIconNormal));
}
else
return(FALSE);
}
if(!nID)
nFlags=MF_SEPARATOR|MF_OWNERDRAW|MF_BYPOSITION;
else if(!(nFlags & MF_OWNERDRAW))
nFlags |= MF_OWNERDRAW;
if(nFlags & MF_POPUP)
{
m_AllSubMenus.Add(UIntToHMenu(nID));
m_SubMenus.InsertAt(nPosition,UIntToHMenu(nID));
}
//Stephane Clog suggested adding this, believe it or not it's in the help
if(nPosition==(UINT)-1)
nPosition=GetMenuItemCount();
CNewMenuItemData *mdata = new CNewMenuItemData;
m_MenuList.InsertAt(nPosition,mdata);
mdata->SetString(lpstrText);
mdata->m_nMenuIconNormal = nIconNormal;
mdata->m_nxOffset=-1;
if(nIconNormal>=0)
{
mdata->m_nxOffset=0;
LoadFromToolBar(nID,nIconNormal,mdata->m_nxOffset);
if(mdata->m_pBitmap)
mdata->m_pBitmap->DeleteImageList();
else
mdata->m_pBitmap=new(CImageList);
mdata->m_pBitmap->Create(m_iconX,m_iconY,ILC_COLORDDB|ILC_MASK,1,1);
if(!AddBitmapToImageList(mdata->m_pBitmap,nIconNormal))
{
mdata->m_pBitmap->DeleteImageList();
delete mdata->m_pBitmap;
mdata->m_pBitmap=NULL;
mdata->m_nMenuIconNormal = nIconNormal = -1;
mdata->m_nxOffset = -1;
}
}
mdata->m_nFlags = nFlags;
mdata->m_nID = nID;
return(CMenu::InsertMenu(nPosition,nFlags,nID,(LPCTSTR)mdata));
}
BOOL CNewMenu::InsertODMenu(UINT nPosition,LPCTSTR lpstrText,UINT nFlags,UINT nID,
CImageList *il,int xoffset)
{
if(!(nFlags & MF_BYPOSITION))
{
int iPosition =0;
CNewMenu* pMenu = FindMenuOption(nPosition,iPosition);
if(pMenu)
{
return(pMenu->InsertODMenu(iPosition,lpstrText,nFlags|MF_BYPOSITION,nID,il,xoffset));
}
else
return(FALSE);
}
if(!nID)
nFlags=MF_SEPARATOR|MF_OWNERDRAW|MF_BYPOSITION;
else if(!(nFlags & MF_OWNERDRAW))
nFlags |= MF_OWNERDRAW;
if(nFlags & MF_POPUP)
{
m_AllSubMenus.Add(UIntToHMenu(nID));
m_SubMenus.InsertAt(nPosition,UIntToHMenu(nID));
}
//Stephane Clog suggested adding this, believe it or not it's in the help
if(nPosition==(UINT)-1)
nPosition=GetMenuItemCount();
CNewMenuItemData *mdata = new CNewMenuItemData;
m_MenuList.InsertAt(nPosition,mdata);
mdata->SetString(lpstrText);
if(il)
{
mdata->m_nMenuIconNormal = 0;
mdata->m_nxOffset=0;
if(mdata->m_pBitmap)
mdata->m_pBitmap->DeleteImageList();
else
mdata->m_pBitmap=new(CImageList);
ImageListDuplicate(il,xoffset,mdata->m_pBitmap);
}
else
{
mdata->m_nMenuIconNormal = -1;
mdata->m_nxOffset = -1;
}
mdata->m_nFlags = nFlags;
mdata->m_nID = nID;
return(CMenu::InsertMenu(nPosition,nFlags,nID,(LPCTSTR)mdata));
}
BOOL CNewMenu::ModifyODMenu(LPCTSTR lpstrText,UINT nID,int nIconNormal)
{
int nLoc;
CNewMenuItemData *mdata;
CArray<CNewMenu*,CNewMenu*>newSubs;
CArray<int,int&>newLocs;
// Find the old CNewMenuItemData structure:
CNewMenu *psubmenu = FindMenuOption(nID,nLoc);
do {
if(psubmenu && nLoc>=0)
mdata = psubmenu->m_MenuList[nLoc];
else
{
// Create a new CNewMenuItemData structure:
mdata = new CNewMenuItemData;
m_MenuList.Add(mdata);
}
ASSERT(mdata);
if(lpstrText)
mdata->SetString(lpstrText);
mdata->m_nMenuIconNormal = nIconNormal;
mdata->m_nxOffset=-1;
if(nIconNormal>=0)
{
mdata->m_nxOffset=0;
LoadFromToolBar(nID,nIconNormal,mdata->m_nxOffset);
if(mdata->m_pBitmap)
mdata->m_pBitmap->DeleteImageList();
else
mdata->m_pBitmap=new CImageList;
mdata->m_pBitmap->Create(m_iconX,m_iconY,ILC_COLORDDB|ILC_MASK,1,1);
if(!AddBitmapToImageList(mdata->m_pBitmap,nIconNormal))
{
mdata->m_pBitmap->DeleteImageList();
delete mdata->m_pBitmap;
mdata->m_pBitmap=NULL;
mdata->m_nMenuIconNormal = nIconNormal = -1;
mdata->m_nxOffset = -1;
}
}
mdata->m_nFlags &= ~(MF_BYPOSITION);
mdata->m_nFlags |= MF_OWNERDRAW;
mdata->m_nID = nID;
newSubs.Add(psubmenu);
newLocs.Add(nLoc);
if(psubmenu && nLoc>=0)
psubmenu = FindAnotherMenuOption(nID,nLoc,newSubs,newLocs);
else
psubmenu=NULL;
}while(psubmenu);
return (CMenu::ModifyMenu(nID,mdata->m_nFlags,nID,(LPCTSTR)mdata));
}
BOOL CNewMenu::ModifyODMenu(LPCTSTR lpstrText,UINT nID,CImageList *pil,int xoffset)
{
int nLoc;
CNewMenuItemData *mdata;
CArray<CNewMenu*,CNewMenu*>newSubs;
CArray<int,int&>newLocs;
// Find the old CNewMenuItemData structure:
CNewMenu *psubmenu = FindMenuOption(nID,nLoc);
do {
if(psubmenu && nLoc>=0)
{
mdata = psubmenu->m_MenuList[nLoc];
}
else
{
// Create a new CNewMenuItemData structure:
mdata = new CNewMenuItemData;
m_MenuList.Add(mdata);
}
ASSERT(mdata);
if(lpstrText)
{
mdata->SetString(lpstrText);
}
if(pil)
{
mdata->m_nMenuIconNormal = 0;
mdata->m_nxOffset=0;
if(mdata->m_pBitmap)
mdata->m_pBitmap->DeleteImageList();
else
mdata->m_pBitmap=new(CImageList);
ImageListDuplicate(pil,xoffset,mdata->m_pBitmap);
int x=0;
int y=0;
if(psubmenu && ImageList_GetIconSize(pil->m_hImageList,&x,&y))
{
// Correct the size of the menuitem
psubmenu->m_iconX = max(psubmenu->m_iconX,x);
psubmenu->m_iconY = max(psubmenu->m_iconY,y);
}
}
else
{
mdata->m_nMenuIconNormal = -1;
mdata->m_nxOffset = -1;
}
mdata->m_nFlags &= ~(MF_BYPOSITION);
mdata->m_nFlags |= MF_OWNERDRAW;
mdata->m_nID = nID;
newSubs.Add(psubmenu);
newLocs.Add(nLoc);
if(psubmenu && nLoc>=0)
psubmenu = FindAnotherMenuOption(nID,nLoc,newSubs,newLocs);
else
psubmenu=NULL;
} while(psubmenu);
return (CMenu::ModifyMenu(nID,mdata->m_nFlags,nID,(LPCTSTR)mdata));
}
BOOL CNewMenu::ModifyODMenu(LPCTSTR lpstrText,UINT nID,CBitmap *bmp)
{
if (bmp)
{
CImageList temp;
temp.Create(m_iconX,m_iconY,ILC_COLORDDB|ILC_MASK,1,1);
temp.Add(bmp,GetBitmapBackground());
return ModifyODMenu(lpstrText,nID,&temp,0);
}
return ModifyODMenu(lpstrText,nID,NULL,0);
}
BOOL CNewMenu::ModifyODMenu(LPCTSTR lpstrText,UINT nID,COLORREF fill,COLORREF border,int hatchstyle)
{
// Get device context
CClientDC DC(0);
CSize bitmap_size(m_iconX,m_iconY);
CBitmap bmp;
ColorBitmap(&DC,bmp,bitmap_size,fill,border,hatchstyle);
return ModifyODMenu(lpstrText,nID,&bmp);
}
BOOL CNewMenu::ModifyODMenu(LPCTSTR lpstrText,LPCTSTR OptionText, int nIconNormal)
{
int nIndex = 0;
CNewMenu* pOptionMenu = FindMenuOption(OptionText,nIndex);
if(pOptionMenu!=NULL && nIndex>=0)
{
CNewMenuItemData* pmdata = pOptionMenu->m_MenuList[nIndex];
if(lpstrText)
{
pmdata->SetString(lpstrText);
}
pmdata->m_nMenuIconNormal = nIconNormal;
pmdata->m_nxOffset=-1;
if(nIconNormal>=0)
{
pmdata->m_nxOffset=0;
if(pmdata->m_pBitmap)
pmdata->m_pBitmap->DeleteImageList();
else
pmdata->m_pBitmap=new(CImageList);
if (!m_bDynIcons)
{
CBitmap temp;
// Try to load the bitmap for getting dimension
if(temp.LoadBitmap(nIconNormal))
{
BITMAP bitmap;
ZeroMemory(&bitmap,sizeof(bitmap));
if(temp.GetBitmap(&bitmap))
{
pOptionMenu->m_iconX = max(pOptionMenu->m_iconX,bitmap.bmWidth);
pOptionMenu->m_iconY = max(pOptionMenu->m_iconY,bitmap.bmHeight);
}
}
}
pmdata->m_pBitmap->Create(pOptionMenu->m_iconX,pOptionMenu->m_iconY,ILC_COLORDDB|ILC_MASK,1,1);
if(!AddBitmapToImageList(pmdata->m_pBitmap,nIconNormal))
{
pmdata->m_pBitmap->DeleteImageList();
delete pmdata->m_pBitmap;
pmdata->m_pBitmap=NULL;
pmdata->m_nMenuIconNormal = nIconNormal = -1;
pmdata->m_nxOffset = -1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -