很奇怪,所有自建的菜单项都是灰的。下面的弹出菜单 1 2 3 都是灰的。为什么啊?
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
if(m_Menu.m_hMenu==NULL)
{
CMenu temp;
temp.CreateMenu();
temp.AppendMenu(MF_STRING,2000,"1");
temp.AppendMenu(MF_STRING,2001,"2");
temp.AppendMenu(MF_STRING,2002,"3"); m_Menu.CreateMenu();
m_Menu.AppendMenu(MF_POPUP,(UINT)temp.m_hMenu,"1"); temp.Detach();
}
cs.hMenu=m_Menu.m_hMenu;
return TRUE;
}

解决方案 »

  1.   

    是啊,你可以通过两种方式来让它变成可用的:
    1. 针对你增加的菜单项写事件;
    2. 你可将框架的成员变量m_bAutoMenuEnable设置成FALSE;
    这两种方法我都试过了,行的通哦!
      

  2.   

    继续研究。
    经过添加消息处理函数,菜单可用了。
    下一个问题,系统怎么知道存在消息处理函数呢?他根据什么来判断菜单是应该黑的还是灰的?我试了一下,加了ON_COMMAND(...)之后,相应的菜单项就可用了,但在显示这个菜单的时候并不会调用这个函数。到这一步为止,我加与不加ON_COMMAND(...)的两个程序所执行的代码都是一样的。而这时菜单上有消息处理的项就已经时可用的了,那系统是从哪知道的呢?
      

  3.   

    消息机制问题,主要是没有消息映射对!ON_COMMAND(IDM_a001,OnA001Message).候老师的<深入浅出MFC>看一下。在菜单上安鼠标右键进入classwizard,在,messages一栏找到对应的消息add function...这样生成的。
      

  4.   

    候老师的<深入浅出MFC>:jjhou.csdn.net
      

  5.   

    有结果啦。我看了一下CFrame的源代码,wzhing(从不留言)所说的m_bAutoMenuEnable这个变量很关键。在CFrame中有一个OnInitilizeMenu()事件,在点击菜单栏显示弹出菜单之前会被调用,在这个函数里,如果m_bAutoMenuEnable为true,则会依次检查View、Document、Frame的消息映射表是否有这个弹出菜单中每个菜单项的处理函数,如果没有就会把那一项改为灰的。所以wzhing(从不留言)说的很对,改一下m_bAutoMenuEnable就可以了。