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<ret;i )
if(pToolBar->GetItemID(i)!=ID_SEPARATOR)
nCount ;
//计算出位图的宽度
nWidth =bmpInfo.bmWidth/nCount;
bmp.DeleteObject();
TRACE("Menu Bitmap--width:%d\theight:%d\n",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;i<pMenu->GetMenuItemCount();i )
{
pSubMenu =pMenu->GetSubMenu(i);
if(pSubMenu)
{
nPosition =0;
//注意j一定要为int类型,如果为UINT是检查不出j>=0!
for(j=(int)pSubMenu->GetMenuItemCount()-1;j>=0;j--)
{
lpItem =new MENUITEM;
lpItem->uID =pSubMenu->GetMenuItemID(j);
lpItem->uPositionImageLeft =nPosition;
if(lpItem->uID>0)
{
nPosition =m_szImage.cy 4;
pSubMenu->GetMenuString(j,lpItem->strText,MF_BYPOSITION);
//由工具栏位图中寻找菜单项的位图,如果没有则uIndex为-1
lpItem->uIndex =-1;
for(m=0; m<(pToolBar->GetToolBarCtrl().GetButtonCount()) ;m )
{
int inx;
UINT idx,x;
pToolBar->GetButtonInfo(m,idx,x,inx);
if(idx==lpItem->uID)
{
lpItem->uIndex=inx;
break;
}
}
}
else
{
//间隔条;
nPosition =m_nSeparator;
}
m_ListMenu.AddTail(lpItem);
//修改菜单绘制风格;
pSubMenu->ModifyMenu(j,MF_BYPOSITION|MF_OWNERDRAW,
lpItem->uID,LPCTSTR(lpItem));
pSubsub =pSubMenu->GetSubMenu(j);
if(pSubsub)
ChangeStyle(pSubsub,pToolBar);
}
}
}
m_bInitial =TRUE;
}
//////////////////////////////////////////////////////重载CMenu类的MeasureItem()函数;
void CMenuEx::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
{
MENUITEM *lpItem =(LPMENUITEM)lpMIS->itemData;
if(lpItem->uID==0)//分隔条的高度为10个像素;
{
lpMIS->itemHeight =m_nSeparator;
}
else
{
//填充lpMIS结构;
CDC *pDC =AfxGetMainWnd()->GetDC();
CString strText=lpItem->strText;
CSize size;
size=pDC->GetTextExtent(lpItem->strText);
lpMIS->itemWidth = size.cx m_szImage.cx 4;
lpMIS->itemHeight =m_szImage.cy 4;
AfxGetMainWnd()->ReleaseDC(pDC);
}
}
////////////////////////////////////////////////////////设置菜单上的纵向位图;
void CMenuEx::SetImageLeft(UINT idBmpLeft)
{
m_bmpImageLeft.LoadBitmap(idBmpLeft);//装载纵向位图;
m_bHasImageLeft = TRUE;
BITMAP bmpInfo;
m_bmpImageLeft.GetBitmap(&bmpInfo);
m_szImageLeft.cx =bmpInfo.bmWidth;
m_szImageLeft.cy =bmpInfo.bmHeight;
}
////////////////////////////////////////////////////////////////设置菜单上的文本颜色;
void CMenuEx::SetTextColor(COLORREF crColor)
{
m_colText =crColor;
}
////////////////////////////////////////////////////////////设置菜单的背景颜色;
void CMenuEx::SetBackColor(COLORREF crColor)
{
m_colMenu =crColor;
}
//////////////////////////////////////////////////////////设置菜单高亮显示时的颜色;
void CMenuEx::SetHighLightColor(COLORREF crColor)
{
m_colTextSelected =crColor;
}
//////////////////////////////////////////////////////初始化上下文菜单;
void CMenuEx::InitPopupMenu(CMenu *pPopupMenu,UINT uToolBar, CToolBar *pToolBar)
{
if(m_bInitial)
return ;
GetImageFromToolBar(uToolBar,pToolBar);
ChangeStyle(pPopupMenu,pToolBar);
m_bInitial =TRUE;
}
////////////////////////////////////////////////////在程序中使用CMenuEx类对象实现菜单的自画;
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
……………………………..
if (!m_wndStatusBar.Create(this) ||!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
m_wndView.m_pToolBar =&m_wndToolBar; // 将视图内的工具条变量附值
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




