CMenu menu;
if(menu.LoadMenu(IDR_MENU2))
{
((CMenu*)menu.GetSubMenu(0))->ModifyMenu(MF_STRING,MF_BYPOSITION,0,(LPCTSTR)id1);
((CMenu*)menu.GetSubMenu(1))->ModifyMenu(MF_STRING,MF_BYPOSITION,1,(LPCTSTR)id2);
((CMenu*)menu.GetSubMenu(0))->TrackPopupMenu(TPM_LEFTBUTTON | TPM_LEFTALIGN,
point.x, point.y,this);
}问一下,为什么在
((CMenu*)menu.GetSubMenu(1))->ModifyMenu(MF_STRING,MF_BYPOSITION,1,(LPCTSTR)id2);
这里跟进去GetSubMenu里面的menu句柄忽然空了,导致这句话最后报错,我前面LoadMenu是成功的,而且前面GetSubMenu(0)是正确的,这个菜单是点击右键出来的菜单,而且有3个菜单项,我想知道是什么原因就是跟到这儿的时候
CMenu* PASCAL CMenu::FromHandle(HMENU hMenu)
{
CHandleMap* pMap = afxMapHMENU(TRUE); // create map if not exist
ASSERT(pMap != NULL);
CMenu* pMenu = (CMenu*)pMap->FromHandle(hMenu);
ASSERT(pMenu == NULL || pMenu->m_hMenu == hMenu);
return pMenu;
}传进来的hMenu为空,但是我又不知道是什么地方调用的这个FromHandle,直接F11跟进来了

解决方案 »

  1.   

    这个菜单是点击右键出来的菜单,而且有3个菜单项
    ==是这样的三个菜单项吗?
    MENUA    MENUB    MENUC
    --SMENUA
    --SMENUB
    --SMENUC
    --SMENUD
    是有这样的MENUA,MENUB和MENUC三个菜单项么?
      

  2.   

    是这样的3个菜单项,在右键点出来以后也是这样排列的
    MENUA
    --SMENUA 
    --SMENUB 
    --SMENUC
      

  3.   

    本帖最后由 happyparrot 于 2009-11-06 13:12:26 编辑
      

  4.   


    那我要获得其中的第二项怎么获得,就是--SMENUB这一项
      

  5.   

    你要活得这个子菜单项干什么呢?用ModifyMenu就可以直接修改其属性,用其它函数可以获得它的信息。
    ((CMenu*)menu.GetSubMenu(0))->ModifyMenu(MF_STRING,MF_BYPOSITION,1,(LPCTSTR)id2); 
    这里的1就是指修改第二项的属性
      

  6.   


    ModifyMenu中的1不是修改的第二项,这样修改的还是第一项,至少我试的结果是这样,谢谢
      

  7.   

    OK了,应该是这样的一个结构((CMenu*)menu.GetSubMenu(0))->ModifyMenu(0,MF_BYPOSITION,ID_ID1,(LPCTSTR)id1);

    ((CMenu*)menu.GetSubMenu(0))->ModifyMenu(1,MF_BYPOSITION,ID_ID2,(LPCTSTR)id2);第一个参数代表该项下的第几个子项结贴散分,谢谢happyparrot