Visual C++中自绘菜单的实现(8)
if(idx==lpItem->uID)
{
lpItem->uIndex=inx;
break;
}
}
}
//如果该项下还有子菜单,则递归调用该函数来修改其子菜单的风格
pSubMenu =pMenu->GetSubMenu(i);
if(pSubMenu)
ChangeStyle(pSubMenu,pToolBar);
}
else
{
if(bIsMainMenu)
nPosition +=m_nSeparator;
}
//修改菜单风格为自绘
pMenu->ModifyMenu(i,MF_BYPOSITION|MF_OWNERDRAW,lpItem->uID,(LPCTSTR)lpItem);
m_ListMenu.AddTail(lpItem);
}
}
/////////////////////////////////////////////由工具栏的位图来产生菜单所用的位图列表m_ImageList;
int CMenuEx::GetImageFromToolBar(UINT uToolBar, CToolBar *pToolBar,COLORREF crMask)
{
if(!pToolBar)
return 0;
CBitmap bmp;
int nWidth,nHeight;
BITMAP bmpInfo;
bmp.LoadBitmap(uToolBar);//将工具条作为位图资源装载;
bmp.GetBitmap(&bmpInfo);
//得到位图的高度
nHeight =bmpInfo.bmHeight;
int nCount=0;
int ret =pToolBar->GetToolBarCtrl().GetButtonCount();
//得到工具栏中位图的个数nCount
for(int i=0;i if(pToolBar->GetItemID(i)!=ID_SEPARATOR)
nCount ++;
//计算出位图的宽度
nWidth =bmpInfo.bmWidth/nCount;
bmp.DeleteObject();
TRACE("Menu Bitmap--width:%d height:%d
",nWidth,nHeight);
//创建位图列表
m_ImageList.Create(uToolBar,nWidth,nHeight,crMask);
m_szImage.cx =nWidth;
m_szImage.cy =nHeight;
return nCount;
}
//////////////////////////////////////////////////////////////////初始化菜单对象;
void CMenuEx::InitMenu(CMenu *pMenu, UINT uToolBar, CToolBar *pToolBar)
{
//已设定了风格
if(m_bInitial)
return ;
GetImageFromToolBar(uToolBar,pToolBar);
CMenu *pSubMenu,*pSubsub;
MENUITEM *lpItem;
UINT i;
int j,m;
int nPosition; //该变量用来存放纵向位图的位置
for(i=0;iGetMenuItemCount();i++)