龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

Visual C++中自绘菜单的实现(6)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
//当该项被选中仅多绘制一个立体矩形 pDC-Draw3dRect(rt,RGB(255,255,255),RGB(127,127,127)); } } m_ImageList.Draw(pDC,lpItem-uIndex,pt,uStyle); //在菜单项中绘制图标; //调整可绘
     //当该项被选中仅多绘制一个立体矩形
     pDC->Draw3dRect(&rt,RGB(255,255,255),RGB(127,127,127));
    }
   }
   m_ImageList.Draw(pDC,lpItem->uIndex,pt,uStyle); //在菜单项中绘制图标;
   //调整可绘制矩形的大小,位图外接矩形比位图大4,菜单文本与位图外接矩形的间隔为2
   rect.left +=m_szImage.cx + 4 + 2;
  }
 }
 ///////////////////////////////////////////////////绘制菜单项文本
 void CMenuEx::TextMenu(CDC *pDC, CRect &rect,CRect rtText,BOOL bSelected, BOOL bGrayed, LPMENUITEM lpItem)
 {
  //选中状态的菜单项要先画出立体矩形
  if(bSelected)
   pDC->Draw3dRect(&rect,RGB(127,127,127),RGB(255,255,255));
  if(bGrayed)
  {
   GrayString(pDC,lpItem->strText,rtText);
  }
  else
  {
   pDC->DrawText(lpItem->strText,rtText,DT_LEFT|DT_EXPANDTABS|DT_VCENTER);
  }
 }

 ///////////////////////////////////////////////////画菜单的纵向位图;
 void CMenuEx::DrawImageLeft(CDC *pDC, CRect &rect,LPMENUITEM lpItem)
 {
  if(!m_bHasImageLeft || lpItem->uPositionImageLeft ==-1)
   return ;
  CDC memDC;
  memDC.CreateCompatibleDC(pDC);
  //装载位图;
  CBitmap *oldBmp =(CBitmap *) memDC.SelectObject(&m_bmpImageLeft);
  int cy; //设定该菜单项应从哪画起
  if(m_szImageLeft.cy >= lpItem->uPositionImageLeft + rect.Height())
  {
   cy =(int) m_szImageLeft.cy - lpItem->uPositionImageLeft - rect.Height();
   ASSERT(cy>=0);
  }
  else
   cy =0;
   //画图;
   pDC->BitBlt(rect.left ,rect.top ,m_szImageLeft.cx ,rect.Height(),&memDC,0,cy,SRCCOPY);
   memDC.SelectObject(oldBmp);
   memDC.DeleteDC();
   rect.left +=m_szImageLeft.cx+1;
  }
  /////////////////////////////////////////////////////////////菜单自画;
  void CMenuEx::DrawItem(LPDRAWITEMSTRUCT lpDIS)
  {
   CDC dc;
   LPMENUITEM lpItem;
   CRect rect(lpDIS->rcItem);
   dc.Attach(lpDIS->hDC);
   //得到自画菜单所需要的信息;
   lpItem =(LPMENUITEM)lpDIS->itemData;
   //根据不同的状态设置菜单的文本颜色;
   if(lpDIS->itemState & ODS_SELECTED)
    dc.SetTextColor(m_colTextSelected);
   else
    dc.SetTextColor(m_colText);
    //设定背景色
   CBrush brush(m_colMenu);
   dc.FillRect(&rect, &brush);
   //设定显示模式
   dc.SetBkMode(TRANSPARENT);
   //绘制侧边位图
   DrawImageLeft(&dc,rect,lpItem);

精彩图集

赞助商链接