📄 menuex.cpp
字号:
// set submenu disabled imagelis
if(lpMenuItem->bIsSubMenu)
lpMenuItem->pSubMenu->SetDisabledImageList(pImageList);
}
}
/////////////////////////////////////////////////////////////////////////////
void CMenuEx::SetHotImageList(CImageList* pImageList)
{
if(pImageList==NULL)
return;
LPMENUITEM lpMenuItem;
m_pHotImageList =pImageList;
if(m_pImageList==NULL&&m_pDisabledImageList==NULL)
{
IMAGEINFO info;
// only hot imagelist is set
// get imagelist size
pImageList->GetImageInfo(0,&info);
m_szImage.cx=info.rcImage.right-info.rcImage.left;
m_szImage.cy=info.rcImage.bottom-info.rcImage.top;
}
for(int i = 0; i < m_MenuItemArr.GetSize(); i++)
{
lpMenuItem=m_MenuItemArr.GetAt(i);
lpMenuItem->pHotImageList=pImageList;
// set submenu hot imagelis
if(lpMenuItem->bIsSubMenu)
lpMenuItem->pSubMenu->SetHotImageList(pImageList);
}
}
/////////////////////////////////////////////////////////////////////////////
void CMenuEx::SetImageIndex(const UINT* nIDResource,UINT nIDCount)
{
// set imagelist index from specific table "nIDResource[nIDCount]"
// only can SetImageIndex after set one imagelist
if(m_pImageList==NULL&&m_pHotImageList==NULL&&m_pDisabledImageList==NULL)
return;
LPMENUITEM lpMenuItem;
for(UINT nIndex=0;nIndex<(UINT)m_MenuItemArr.GetSize();nIndex++)
{
lpMenuItem=m_MenuItemArr.GetAt(nIndex);
// call submenu 's loadtoolbar
if(lpMenuItem->bIsSubMenu)
lpMenuItem->pSubMenu->SetImageIndex(nIDResource,nIDCount);
else
{
for(UINT i=0;i<nIDCount;i++)
{
// if table's commandID equal menu item's command ID
// set nImageIndex to table's index
if(lpMenuItem->nID==nIDResource[i])
lpMenuItem->nImageIndex=i;
}
}
}
}
/////////////////////////////////////////////////////////////////////////////
void CMenuEx::LoadToolBar(const CToolBar* pToolBar)
{
// load all imagelist from pToolBar
SetImageList(pToolBar->GetToolBarCtrl().GetImageList());
SetDisabledImageList(pToolBar->GetToolBarCtrl().GetDisabledImageList());
SetHotImageList(pToolBar->GetToolBarCtrl().GetHotImageList());
// pToolBar don't have imagelist
if(m_pImageList==NULL&&m_pDisabledImageList==NULL&&m_pHotImageList==NULL)
return;
LPMENUITEM pItem;
for(UINT nIndex=0;nIndex<(UINT)m_MenuItemArr.GetSize();nIndex++)
{
pItem=m_MenuItemArr.GetAt(nIndex);
// load submenu toolbar
if(pItem->bIsSubMenu)
pItem->pSubMenu->LoadToolBar(pToolBar);
else
{
for(UINT i=0;i<(UINT)pToolBar->GetToolBarCtrl().GetButtonCount();i++)
{
if(pItem->nID==pToolBar->GetItemID(i))
{
// if toolbar's commandID equal menu item's command ID
// set nImageIndex to toolbar's index
pItem->nImageIndex=i;
// set all imagelist to toolbar's imagelist
pItem->pImageList=m_pImageList;
pItem->pDisabledImageList=m_pDisabledImageList;
pItem->pHotImageList=m_pHotImageList;
}
}
}
}
}
/////////////////////////////////////////////////////////////////////////////
void CMenuEx::SetTextColor(COLORREF color)
{
LPMENUITEM lpMenuItem;
// set normal menu text color
m_crText =color;
for(int i = 0; i < m_MenuItemArr.GetSize(); i++)
{
lpMenuItem=m_MenuItemArr.GetAt(i);
// set submenu text color
if(lpMenuItem->bIsSubMenu)
lpMenuItem->pSubMenu->SetTextColor(color);
}
}
/////////////////////////////////////////////////////////////////////////////
void CMenuEx::SetBackgroundColor(COLORREF color)
{
LPMENUITEM lpMenuItem;
// set menu background color
m_crBackground =color;
for(int i = 0; i < m_MenuItemArr.GetSize(); i++)
{
lpMenuItem=m_MenuItemArr.GetAt(i);
if(lpMenuItem->bIsSubMenu)
lpMenuItem->pSubMenu->SetBackgroundColor(color);
}
}
/////////////////////////////////////////////////////////////////////////////
void CMenuEx::SetTextSelectedColor(COLORREF color)
{
LPMENUITEM lpMenuItem;
// set selected menu text color
m_crTextSelected =color;
for(int i = 0; i < m_MenuItemArr.GetSize(); i++)
{
lpMenuItem=m_MenuItemArr.GetAt(i);
if(lpMenuItem->bIsSubMenu)
lpMenuItem->pSubMenu->SetTextSelectedColor(color);
}
}
/////////////////////////////////////////////////////////////////////////////
void CMenuEx::SetLeftColor(COLORREF color)
{
LPMENUITEM lpMenuItem;
// set menu left side color
m_crLeft =color;
for(int i = 0; i < m_MenuItemArr.GetSize(); i++)
{
lpMenuItem=m_MenuItemArr.GetAt(i);
if(lpMenuItem->bIsSubMenu)
lpMenuItem->pSubMenu->SetLeftColor(color);
}
}
/////////////////////////////////////////////////////////////////////////////
void CMenuEx::SetSelectedBroderColor(COLORREF color)
{
LPMENUITEM lpMenuItem;
// set selected rectangle border color
m_crSelectedBroder =color;
for(int i = 0; i < m_MenuItemArr.GetSize(); i++)
{
lpMenuItem=m_MenuItemArr.GetAt(i);
if(lpMenuItem->bIsSubMenu)
lpMenuItem->pSubMenu->SetSelectedBroderColor(color);
}
}
/////////////////////////////////////////////////////////////////////////////
void CMenuEx::SetSelectedFillColor(COLORREF color)
{
LPMENUITEM lpMenuItem;
// set selected rectangle fill color
m_crSelectedFill =color;
for(int i = 0; i < m_MenuItemArr.GetSize(); i++)
{
lpMenuItem=m_MenuItemArr.GetAt(i);
if(lpMenuItem->bIsSubMenu)
lpMenuItem->pSubMenu->SetSelectedFillColor(color);
}
}
/////////////////////////////////////////////////////////////////////////////
void CMenuEx::SetPopupMenu(BOOL bPopupMenu)
{
// set top-level menu indicator
m_bPopupMenu=bPopupMenu;
}
/////////////////////////////////////////////////////////////////////////////
void CMenuEx::UpdatePopupMenu()
{
// top-level menu do not need update popupmenu
if(!m_bPopupMenu)
return;
LPMENUITEM pMenuItem;
UINT nID,nState,nIndex;
CSize size;
CString strMenu;
UINT nSize=GetMenuItemCount();
CDC *pDC =AfxGetMainWnd()->GetDC();
for(nIndex=0;nIndex<nSize;nIndex++)
{
nID=GetMenuItemID(nIndex); // get menu ID
nState=GetMenuState(nIndex,MF_BYPOSITION); // get menu state
GetMenuString(nIndex,strMenu,MF_BYPOSITION);// get menu name
pMenuItem=GetMenuItem(nIndex);
if((pMenuItem==NULL)||(pMenuItem->nID!=nID))
{
pMenuItem=new MENUITEM;
if(nID==0)
{
// insert separator
pMenuItem->strText = ""; // no name
pMenuItem->nID = 0; // separator's ID
pMenuItem->itemSize=CSize(0,m_nSeparator); // separator's default size
pMenuItem->pImageList=NULL; // separator has no image
pMenuItem->pDisabledImageList=NULL;
pMenuItem->pHotImageList=NULL;
pMenuItem->nImageIndex=-1;
pMenuItem->bIsSubMenu=FALSE; // separator must not be popupmenu
pMenuItem->pSubMenu=NULL;
// modify menu item to ownerdrawn style
// if this menu is not a top-level menu
CMenu::ModifyMenu(nIndex,MF_SEPARATOR|MF_BYPOSITION|MF_OWNERDRAW,0,(LPCTSTR)pMenuItem);
// insert menu item to array
m_MenuItemArr.InsertAt(nIndex,pMenuItem);
}
else if(nID==-1)
{
// bypass popupmenu's item number
nState&=0x00FFL;
// insert popupmenu
CMenuEx* pSubMenu=new CMenuEx;
// create new popupmenu
pSubMenu->SetPopupMenu(TRUE);
// load popupmenu from specific handle
pSubMenu->LoadMenu((HMENU)(CMenu::GetSubMenu(nIndex)->Detach()));
size=pDC->GetTextExtent(strMenu);
pMenuItem->strText = strMenu;
pMenuItem->nID = -1;
// specified menu item size,do not include image's size
pMenuItem->itemSize.cx=size.cx+25;
pMenuItem->itemSize.cy=2;
pMenuItem->pImageList=m_pImageList;
pMenuItem->pDisabledImageList=m_pDisabledImageList;
pMenuItem->pHotImageList=m_pHotImageList;
pMenuItem->nImageIndex=-1;
pMenuItem->bIsSubMenu=TRUE;
pMenuItem->pSubMenu=pSubMenu; // popupmenu's pointor
CMenu::ModifyMenu(nIndex,nState|MF_POPUP|MF_BYPOSITION|MF_OWNERDRAW,(UINT)(pSubMenu->m_hMenu),(LPCTSTR)pMenuItem);
m_MenuItemArr.InsertAt(nIndex,pMenuItem);
}
else
{
// insert normal menu item
size=pDC->GetTextExtent(strMenu);
pMenuItem->strText = strMenu;
pMenuItem->nID = nID;
pMenuItem->itemSize.cx=size.cx+10;
pMenuItem->itemSize.cy=2;
pMenuItem->pImageList=m_pImageList;
pMenuItem->pDisabledImageList=m_pDisabledImageList;
pMenuItem->pHotImageList=m_pHotImageList;
pMenuItem->nImageIndex=-1;
pMenuItem->bIsSubMenu=FALSE;
pMenuItem->pSubMenu=NULL;
CMenu::ModifyMenu(nIndex,nState|MF_BYPOSITION|MF_OWNERDRAW,nID,(LPCTSTR)pMenuItem);
m_MenuItemArr.InsertAt(nIndex,pMenuItem);
}
}
else if((nID!=-1)&&((pMenuItem->strText==strMenu)||!(nState & MF_OWNERDRAW)))
{
// system don't auto insert popup menu item
pMenuItem->strText=strMenu;
CMenu::ModifyMenu(nIndex,nState|MF_BYPOSITION|MF_OWNERDRAW,nID,(LPCTSTR)pMenuItem);
}
}
for(nIndex=nSize;nIndex<GetMenuItemSize();nIndex++)
{
pMenuItem=m_MenuItemArr.GetAt(nIndex);
m_MenuItemArr.RemoveAt(nIndex);
delete pMenuItem;
}
}
/////////////////////////////////////////////////////////////////////////////
void CMenuEx::InitPopupMenu(CMenu* pSubMenu,UINT nIndex,BOOL bSystem)
{
//update pSubMenu's item to owerdrawn style
if(bSystem)
return;
((CMenuEx*)pSubMenu)->UpdatePopupMenu();
}
/////////////////////////////////////////////////////////////////////////////
void CMenuEx::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
{
// check measure ownerdraw menu or other controler
if(lpMIS->CtlType!=ODT_MENU)
return;
MENUITEM *lpMenuItem =(LPMENUITEM)lpMIS->itemData;
// initialize width and height with itemSize
lpMIS->itemWidth=lpMenuItem->itemSize.cx;
lpMIS->itemHeight=lpMenuItem->itemSize.cy;
// not separator,may be popupmenu or normal menu item
if(lpMenuItem->nID!=0)
{
IMAGEINFO info;
if(lpMenuItem->pImageList!=NULL)
{
// first add normal imagelist size
lpMenuItem->pImageList->GetImageInfo(0,&info);
lpMIS->itemWidth+=(info.rcImage.right-info.rcImage.left);
lpMIS->itemHeight+=(info.rcImage.bottom-info.rcImage.top);
}
else if(lpMenuItem->pDisabledImageList!=NULL)
{
// or add disabled imagelist size
lpMenuItem->pDisabledImageList->GetImageInfo(0,&info);
lpMIS->itemWidth+=(info.rcImage.right-info.rcImage.left);
lpMIS->itemHeight+=(info.rcImage.bottom-info.rcImage.top);
}
else if(lpMenuItem->pHotImageList!=NULL)
{
// or add hot imagelist size
lpMenuItem->pHotImageList->GetImageInfo(0,&info);
lpMIS->itemWidth+=(info.rcImage.right-info.rcImage.left);
lpMIS->itemHeight+=(info.rcImage.bottom-info.rcImage.top);
}
else
{
// add default size,if do not have imagelist
lpMIS->itemWidth+=20;
lpMIS->itemHeight+=20;
}
}
}
/////////////////////////////////////////////////////////////////////////////
UINT CMenuEx::GetMenuItemSize() const
{
// get menu item counter
return m_MenuItemArr.GetSize();
}
/////////////////////////////////////////////////////////////////////////////
LPMENUITEM CMenuEx::GetMenuItem(UINT nPosition)
{
// get menu item by position
if(nPosition>(UINT)m_MenuItemArr.GetUpperBound())
return NULL;
return m_MenuItemArr.GetAt(nPosition);
}
/////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -