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

VisualC 中自绘菜单的实现

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

  void SetBackColor(COLORREF);
  void SetTextColor(COLORREF);
  void SetImageLeft(UINT idBmpLeft);
  void MeasureItem(LPMEASUREITEMSTRUCT lpMIS);
  void InitMenu(CMenu *pMenu,UINT uToolBar,CToolBar *pToolBar);
  void DrawItem(LPDRAWITEMSTRUCT lpDIS);
  CMenuEx();
  virtual ~CMenuEx();

 protected:
  int m_nSeparator;
  CSize m_szImageLeft; //纵向位图尺寸;
  CBitmap m_bmpImageLeft; //纵向位图对象;
  int m_nWidthLeftImage; //纵向位图的宽度;
  BOOL m_bHasImageLeft; //是否有纵向位图
  BOOL m_bInitial; //菜单是否已初始化,即设定了自绘风格
  int GetImageFromToolBar(UINT uToolBar,CToolBar *pToolBar,COLORREF crMask=RGB(192,192,192)); //从工具条中获取图标信息;
  CList<MENUITEM *,MENUITEM *> m_ListMenu;
  COLORREF m_colMenu;
  COLORREF m_colTextSelected;
  void DrawImageLeft(CDC *pDC,CRect &rect,LPMENUITEM lpItem); //画纵向位图;
  void TextMenu(CDC *pDC,CRect &rect,CRect rtText,BOOL bSelected,BOOL bGrayed,LPMENUITEM lpItem); //画菜单文本;
  CImageList m_ImageList; //图像列表;
  COLORREF m_colText;
  CSize m_szImage; //菜单项位图的大小
  void DrawMenuItemImage(CDC *pDC,CRect &rect,BOOL bSelected,BOOL bChecked,BOOL bGrayed,BOOL bHasImage,LPMENUITEM lpItem);//画菜单图标;
  void GrayString(CDC *pDC,const CString &str,const CRect rect);//显示灰色字符串;
 };

 #endif

 /////////////////////////////////////////////////CMenuEx类的实现文件;
 #include "stdafx.h"
 #include "MenuEx.h"

 #ifdef _DEBUG
  #undef THIS_FILE
  static char THIS_FILE[]=__FILE__;
  #define new DEBUG_NEW
 #endif
 ///////////////////////////////////////////// //构造函数;
 CMenuEx::CMenuEx():m_szImage(16,15)
 {
  m_colMenu =::GetSysColor(COLOR_MENU);
  m_colText =::GetSysColor(COLOR_MENUTEXT);
  m_colTextSelected =::GetSysColor(COLOR_HIGHLIGHTTEXT);
  m_bInitial =FALSE;
  m_bHasImageLeft =FALSE;
  m_nSeparator = 10; //菜单分割条的默认高度
 }
 //////////////////////////////////////////////析构函数;
 CMenuEx::~CMenuEx()
 {
  m_ImageList.DeleteImageList(); //清空图像列表;
  while(!m_ListMenu.IsEmpty()) //清空菜单项信息列表;
   delete m_ListMenu.RemoveHead();
   if(m_bHasImageLeft) //释放纵向位图对象;
    m_bmpImageLeft.DeleteObject();
 }
 ///////////////////////////////////////////////////当菜单项为不可用时绘制灰色的文本;
 void CMenuEx::GrayString(CDC *pDC, const CString &str, const CRect rect)
 {
  CRect rt(rect);
  rt.left =1;
  rt.top =1;
  pDC->SetTextColor(RGB(255,255,255));
  pDC->DrawText(str,&rt,DT_EXPANDTABS|DT_VCENTER|DT_SINGLELINE);
  rt.left -=1;
  rt.top -=1;
  pDC->SetTextColor(RGB(127,127,127));
  pDC->DrawText(str,&rt,DT_EXPANDTABS|DT_VCENTER|DT_SINGLELINE);
 }
 ///////////////////////////////////////////////////绘制菜单项位图
 void CMenuEx::DrawMenuItemImage(CDC *pDC, CRect &rect, BOOL bSelected, BOOL bChecked, BOOL bGrayed, BOOL bHasImage,LPMENUITEM lpItem)
 {
  CRect rt(rect.left ,rect.top ,rect.left m_szImage.cx 4, rect.top m_szImage.cy 4);
  //确定显示图标的位置;
  if(bChecked) //根据不同的状态画菜单的选择标志;
  {
   if(bGrayed)
   {
    //菜单不可用
    GrayString(pDC,"√",rt);
   }
   else
   {
    if(bSelected)
    {
     //当该菜单项被选中时绘制一个立体矩形
     pDC->Draw3dRect(&rt,RGB(255,255,255),RGB(127,127,127));
    }
    rt.InflateRect(-2,-2);
    //画出"√"
    pDC->SetBkMode(TRANSPARENT);
    pDC->SetTextColor(m_colText);
    pDC->DrawText("√",&rt,DT_EXPANDTABS|DT_VCENTER|DT_SINGLELINE);
   }
   rect.left =m_szImage.cx 4 2 ;
   //重新计算rect的尺寸,为显示菜单文本作准备;
   return ;
  }
  if(bHasImage) //如果菜单有图标
  {
   CPoint pt(rt.left 2 , rt.top 2 );
   UINT uStyle =ILD_TRANSPARENT; //CImageList::Draw()绘制位图的风格
   if(bGrayed)
   {
    uStyle |=ILD_BLEND50; //菜单不可用所以位图较暗
   }
   else
   {
    if(bSelected)
    {
     //当该项被选中仅多绘制一个立体矩形
     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)
  {

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!