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




