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

📄 menuex.cpp

📁 医用图像管理系统,本系统是一个医用的图像管理系统,用vc开发,具有很好的程序功能和良好的界面,人机交流很好的,对医用图形有兴趣的可以来看看啊.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		
		// 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 + -