15,979
社区成员
发帖
与我相关
我的任务
分享
void CSFC_Menu::InitMenu(CMenu *pMenu, BOOL bMainMenu)
{
ASSERT(pMenu);
MENU_LPITEMINFO m_pItemData;
for(int nItem=(int)pMenu->GetMenuItemCount()-1 ;nItem>=0; nItem--)
{
m_pItemData =new MENU_ITEMINFO;
m_pItemData->nMenuID = pMenu->GetMenuItemID(nItem);
if( m_pItemData->nMenuID < 0 && bMainMenu )//主菜单
{
m_pItemData->nMenuID = -2 ;
}
m_pItemData->nItem = nItem ;
m_pItemData->nImage = GetMenuImage(m_pItemData->nMenuID);
pMenu->GetMenuString(nItem, m_pItemData->strItemText, MF_BYPOSITION);
//如果该项下还有子菜单,则递归调用该函数来修改其子菜单的风格
CMenu *pSubMenu =pMenu->GetSubMenu(nItem);
if(pSubMenu && m_pItemData->nMenuID != -2 && !bMainMenu )
m_pItemData->nMenuID = -1;
if(pSubMenu)
InitMenu(pSubMenu);
//修改菜单风格为自绘
pMenu->ModifyMenu(nItem, MF_BYPOSITION | MF_OWNERDRAW, m_pItemData->nMenuID,
(LPCTSTR)m_pItemData);//我觉得问题应该出在这里,没有加nState,但我DrawItem里是。。而且CMainFrame下的是正常的
m_gListMenuInfo.AddTail(m_pItemData);
}
}
void CSFC_Menu::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
int nSaveDC=pDC->SaveDC();
lpDrawItemStruct->CtlType = ODT_MENU;
CRect rcItem = lpDrawItemStruct->rcItem ;
UINT nState = lpDrawItemStruct->itemState;
//UINT nState = GetMenuItemState(this, lpDrawItemStruct->itemID, FALSE);
CRect rcImage(rcItem);
rcImage.right = rcImage.left + 20 ;
CRect rcText(rcItem);
rcText.left = rcText.left + 20 ;
if(lpDrawItemStruct->itemData==NULL) return;
MENU_ITEMINFO *pItemData = (MENU_LPITEMINFO)lpDrawItemStruct->itemData;
if( pItemData == NULL ) return;
int nItem = pItemData->nItem ;
int nMenuID = pItemData->nMenuID;
int nImage = pItemData->nImage ;
CString strItemText = pItemData->strItemText;
CMenu *pMenu = pItemData->pMenu ;
switch(nMenuID)//因为之前ModiftyMenu时把 顶层菜单ID设为了-2
{
case -2://画顶层菜单
DrawTopItemBk(pDC, rcItem, nState);
DrawTopItemBorder(pDC, rcItem, nState);
DrawItemText(pDC, rcItem, strItemText, nState);
break;
case -1://画弹出菜单
DrawItemBk(pDC, rcItem, nState);
DrawItemBorder(pDC, rcItem, nState);
DrawItemText(pDC, rcText, strItemText, nState);
break;
case 0://画分隔条
DrawItemSeparate(pDC, rcItem);
break;
default://画一般的菜单,包括POP菜单
DrawItemBk(pDC, rcItem, nState);
DrawItemBorder(pDC, rcItem, nState);
DrawItemText(pDC, rcText, strItemText, nState);
DrawItemImage(pDC, rcImage, nState, nImage);
break;
}
pDC->RestoreDC(nSaveDC);
}