手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

VisualC 中自绘菜单的实现

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

 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
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!