只能是自绘实现吧,或者直接贴图

解决方案 »

  1.   

    把图片加入到工具栏的菜单中
    //CMenuItemInfo结构用于记录菜单项信息
    struct CMenuItemInfo
    {
    CString m_ItemText;//菜单项文本
    int m_IconIndex;//菜单项索引
    int m_ItemID;//菜单标记 -2顶层菜单,-1弹出式菜单,0分隔条,其他普通菜单
    };
    //定义成员变量
    int m_index; //临时索引
    int m_iconindex; //菜单项图标索引
    CImageList m_imagelist;//存储菜单项图标
    //向CIconMenu菜单中添加AttatchMenu方法
    BOOL  CIconMenu::AttatchMenu(HMENU m_hmenu)
    {
    this->Attach(m_hmenu);
    return TRUE;
    }//codego.net/tags/7/1/
    //编写CIconMenu类构造函数
    CIconMenu::CIconMenu()
    {
    m_index= 0;
    m_iconindex= 0; //创建图像列表
    m_imagelist.Create(16,16,ILC_COLOR24|ILC_MASK,0,0); //添加图标
    m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON1));
    m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON2));
    m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON3));
    m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON4));
    m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON5));
    m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON6));
    m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON7));
    m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON8));
    m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON9));
    m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON10));}
    //向CIconMenu中添加修改菜单信息项并存储在成员变量中
    BOOL CIconMenu::ChangeMenuItem(CMenu* m_menu,BOOL m_Toped)
    {
    if (m_menu != NULL)
    {
    int m_itemcount = m_menu->GetMenuItemCount();
    for (int i=0;i<m_itemcount;i++)
    {
    m_menu->GetMenuString(i,m_ItemLists[m_index].m_ItemText,MF_BYPOSITION);
    int m_itemID = m_menu->GetMenuItemID(i);
    if (m_itemID==-1 && m_Toped)
    {
    m_itemID = -2;//顶层菜单
    };
    m_ItemLists[m_index].m_ItemID = m_itemID;
    if (m_itemID>0)
    {
    m_ItemLists[m_index].m_IconIndex= m_iconindex;
    m_iconindex+=1;
    }
    m_menu->ModifyMenu(i,MF_OWNERDRAW|MF_BYPOSITION |MF_STRING,m_ItemLists[m_index].m_ItemID,(LPSTR)&(m_ItemLists[m_index]));

    m_index+=1;
    CMenu* m_subMenu = m_menu->GetSubMenu(i); if (m_subMenu)
    {
    ChangeMenuItem(m_subMenu);
    }
    }
    }
    return TRUE ;
    }
    //改写菜单类的虚拟方法
    void CIconMenu::MeasureItem( LPMEASUREITEMSTRUCT lpStruct )
    {
    if (lpStruct->CtlType==ODT_MENU)
    {
    lpStruct->itemHeight = ITEMHEIGHT;
    lpStruct->itemWidth = ITEMWIDTH;
    CMenuItemInfo* m_iteminfo;
    m_iteminfo = (CMenuItemInfo*)lpStruct->itemData;
    lpStruct->itemWidth = ((CMenuItemInfo*)lpStruct->itemData)->m_ItemText.GetLength()*10;
    switch(m_iteminfo->m_ItemID)
    {
    case 0: //分隔条
    {
    lpStruct->itemHeight = 1;
    break;
    }
    }
    }
    }
    //添加成员函数用于绘制菜单项文本
    void CIconMenu::DrawItemText(CDC* m_pdc,LPSTR str,CRect m_rect)
    {
    m_rect.DeflateRect(20,0);
    m_pdc->DrawText(str,m_rect,DT_SINGLELINE|DT_VCENTER|DT_LEFT);
    }
    //绘制菜单项图标
    void CIconMenu::DrawMenuIcon(CDC* m_pdc,CRect m_rect,int m_icon )
    {
    m_imagelist.Draw(m_pdc,m_icon,CPoint(m_rect.left+2,m_rect.top+4),ILD_TRANSPARENT);
    }
    //绘制分隔条
    void CIconMenu::DrawSeparater(CDC* m_pdc,CRect m_rect)
    {
    if (m_pdc != NULL)
    {
    m_pdc->Draw3dRect(m_rect,RGB(255,0,0),RGB(0,0,255));
    }
    }
    //绘制顶层菜单
    void CIconMenu::DrawTopMenu(CDC* m_pdc,CRect m_rect,BOOL m_selected )
    {
    if (m_selected)
    {
    m_pdc->SelectStockObject(BLACK_PEN);
    m_pdc->Rectangle(&m_rect);
    m_rect.DeflateRect(1,1);
    m_pdc->FillSolidRect(m_rect,RGB(150, 185, 255));
    }
    else
    {
    CRect rect;
    AfxGetMainWnd()->GetClientRect(rect);
    rect.top = m_rect.top;
    rect.bottom = m_rect.bottom;
    rect.left= 360;
    rect.right +=4;
    //CRect c_rect(m_rect);
    m_pdc->FillSolidRect(&rect,RGB(200,187, 255));
    m_pdc->FillSolidRect(&m_rect,RGB(200,187, 255));
    //m_pdc->SelectStockObject(BLACK_PEN);
    //m_pdc->FillSolidRect(m_rect,RGB(100, 185, 255));
    }
    }
    //改写菜单中的虚拟方法、绘制不同状态的菜单
    void CIconMenu::DrawItem( LPDRAWITEMSTRUCT lpStruct )
    {
    if (lpStruct->CtlType==ODT_MENU)
    {
    if(lpStruct->itemData == NULL) return;
    unsigned int m_state = lpStruct->itemState;
    CDC* m_dc = CDC::FromHandle(lpStruct->hDC);
    //m_dc.Attach(lpStruct->hDC); CString str =  ((CMenuItemInfo*)(lpStruct->itemData))->m_ItemText;
    LPSTR m_str = str.GetBuffer(str.GetLength()); int m_itemID = ((CMenuItemInfo*)(lpStruct->itemData))->m_ItemID;
    int m_itemicon = ((CMenuItemInfo*)(lpStruct->itemData))->m_IconIndex;
    CRect m_rect = lpStruct->rcItem; m_dc->SetBkMode(TRANSPARENT); switch(m_itemID)
    {
    case -2:
    { DrawTopMenu(m_dc,m_rect,(m_state&ODS_SELECTED)||(m_state&0x0040)); //0x0040 ==ODS_HOTLIGHT DrawItemText(m_dc,m_str,m_rect);
    break;
    }
    case -1:
    {
    DrawItemText(m_dc,m_str,m_rect);
    break;
    }
    case 0:
    {
    DrawSeparater(m_dc,m_rect);
    break;
    }
    default:
    {
    DrawComMenu(m_dc,m_rect,0xfaa0,0xf00ff,m_state&ODS_SELECTED);
    DrawItemText(m_dc,m_str,m_rect);
    DrawMenuIcon(m_dc,m_rect,m_itemicon);
    break;
    }
    }
    //框架中引入头文件、调用对象的菜单方法
    void CMainFrame::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
    {
    m_menu.MeasureItem(lpMeasureItemStruct);
    // CFrameWnd::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
    }
    //关联菜单窗口
    m_menu.AttatchMenu(this->GetMenu()->GetSafeHmenu());
    m_menu.ChangeMenuItem(&m_menu,TRUE);