Visual C++中自绘菜单的实现(5)
} //////////////////////////////////////////////析构函数; CMenuEx::~CMenuEx() { m_ImageList.DeleteImageList(); //清空图像列表; while(!m_ListMenu.IsEmpty()) //清空菜单项信息列表;
}
//////////////////////////////////////////////析构函数;
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)
{
//////////////////////////////////////////////析构函数;
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)
{
精彩图集