在最近的几次项目中,对主框架类上的菜单,工具栏等的ID在ClassWizard对话框里在CListView的选项下也有,
比如我在对某个菜单项进行消息响应之后想进一步是该菜单变灰或不能用,我在该相应函数的末尾加入如下代码:
    ……
    ……
    mmenu=GetMenu();//在CListView中定义:CMenu *mmenu;CMenu *submenu;
   submenu = mmenu->GetSubMenu(4);
   submenu->EnableMenuItem(ID_MATH_SCORE, MF_DISABLED | MF_GRAYED);但实际运行却会出错,指针mmen在调试过程中为一个不合理的内存地址,请问该如何改呢???????
CListView与CMainFrame类到底是个什么样的关系,为什么对菜单的响应函数要设置在CListView类中而不设置在CMainFrame类中啊?????我另外的一个帖子是关于按下菜单显示对话框的工程,结果也是一样的,也是对话框对象是不合理的内存地址!!
  声明:我用VC6编的,

解决方案 »

  1.   

    // The code fragment below shows how to disable (and gray out) the 
    // File\New menu item.
    // NOTE: m_bAutoMenuEnable is set to FALSE in the constructor of 
    // CMainFrame so no ON_UPDATE_COMMAND_UI or ON_COMMAND handlers are 
    // needed, and CMenu::EnableMenuItem() will work as expected.CMenu* mmenu = GetMenu();
    CMenu* submenu = mmenu->GetSubMenu(0);
    submenu->EnableMenuItem(ID_FILE_NEW, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
      

  2.   

    可以在 CMainFrame 类中定义一个数据成员保存菜单项目的状态,如:BOOL m_bEnabled。然后处理 ID_MATH_SCORE 菜单项目的 UPDATE_COMMAND_UI 消息,在其中设置其状态:
    void CMainFrame::OnUpdateXXXX(CCmdUI* pCmdUI) 

        pCmdUI->Enable(m_bEnabled); //TRUE 为可用,FALSE 为不能用。 
    } 最后处理 ID_MATH_SCORE 菜单项目的 COMMAND 消息,在其中更新变量。 
    void CMainFrame::OnXXXX() 

      ...其它代码。
      m_bEnabled = !m_bEnabled; 

      

  3.   

    GetMenu获取的是当前类对象关联的窗口中的菜单,菜单是在框架窗口上的,视图窗口上没有菜单,所以在视图类中GetMenu得到的是NULL,使用NULL指针来操作所以会出问题。
    文档—视图架构的程序应该响应UPDATE_COMMAND_UI来处理菜单的禁用,参考2楼代码。