关于重绘的Menu在CXXXView里响应pop菜单,菜单项状态不更新

bobo3198 2010-03-02 12:03:29
Menu里主要的两个地方:


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);
}



说明,在CMainFrame里无论是主菜单还是pop弹出菜单,都是正常的, 但是CXXXView里响应右键菜单后, 弹出的菜单全部都没有check, radio, enable(false)等之分。查了资料说是要引入OnInitPopupMenu消息到CView里,然后用CView全局CSFC_Menu变量m_gMenu.InitMenu(pSubMenu),但还是没效果
...全文
80 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
bobo3198 2010-03-02
  • 打赏
  • 举报
回复
自己沙发。 补充一下,已经在CXXXView::OnInitpupupMenu里处理了

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧