Visual C++中自绘菜单的实现(6)
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);