网上有很多关于菜单变成灰色的方法,可是我发现我用On_Commmand_UI这种方法对于快捷菜单(也就是右键弹出的菜单)好像没有什么作用啊。我在CTreeCtrl中建立了一个快捷菜单,然后在这个类里面添加了On_Command_UI的消息相应函数,结果不管我设置的TRUE还是FALSE,菜单都是黑色,没有变成灰色啊,我试了一下,只有那种一般的菜单消息相应才管用啊,快捷菜单好像不行啊。问问高手,如何解决这个问题啊

解决方案 »

  1.   

    感觉应该是文档类的程序,右键快捷菜单式可以变灰的。通过GetMenu(),GetSubMenu(),UINT EnableMenuItem( UINT nIDEnableItem, UINT nEnable );就可以了
      

  2.   

    是单文档,然后我在旁边加了一个树形控件,然后树形控件有快捷菜单,不知怎么的,就是不能让她变成灰色,还有为什么On——Command——UI这个函数不行呢
      

  3.   

    这个我专门研究过:
    使用过MFC的都知道,自制的左键弹出菜单不会响应自动更新.除非你的左键菜单同时做到了主菜单上,才能响应自动更新,这是让人无法容忍的.如:你在资源中做好弹出菜单,如IDR_POPUP,项ID从ID_POPUPMENU_FIRST到ID_POPUPMENU_LAST,按照自动更新的常规做法://首先做好自动更新宏
    ON_UPDATE_COMMAND_UI_RANGE(ID_POPUPMENU_FIRST, ID_POPUPMENU_LAST, OnUpdatePopupMenuCmd)
    //再声明更新消息函数
    afx_msg void OnUpdatePopupMenuCmd(CCmdUI* pCmdUI);
    //再做好函数
    void CYourView::OnUpdatePopupMenuCmd(CCmdUI* pCmdUI)
    {
      BOOL bEnable = FALSE;
      switch (pCmdUI->m_nID)
      {
        case ID_POPUPMENU_FIRST:
          if (....)
          {
            bEnable = TRUE;
          }
          break;
        case //........
        case ID_POPUPMENU_LAST:
          if (....)
          {
            bEnable = TRUE;
          }
          break;
        }
        pCmdUI->Enable(bEnable);
    }
    //在WM_CONTEXTMENU消息中做好弹出代码,或把代码放到WM_RBUTTONUP消息中
    void CYourView::OnContextMenu(CWnd* pWnd, CPoint point)
    {
      HMENU hMenu = ::LoadMenu(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDR_POPUP));//弹出菜单资源
      HMENU hPopup = GetSubMenu(hMenu, 0);//第0个子菜单
      POINT pt = {point.x, point.y};
      ::ClientToScreen(m_hWnd, &pt);
      ::TrackPopupMenu(hPopup, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_VERTICAL, pt.x, pt.y, 0, m_hWnd, NULL);//弹出它
    }你运行时会发现,你的弹出的菜单不会响应自动更新.跟踪一下,你会发现,你的自动更新函数没有被执行.如何做才能让左键弹出菜单响应自动更新呢?其实很简单://添加WM_INITMENUPOPUP消息响应函数
    void CYourView::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) 
    {
      CScrollView::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
      int nCount = pPopupMenu->GetMenuItemCount();
      CCmdUI cmd;//创建自动更新类
      cmd.m_pMenu = pPopupMenu;
      cmd.m_nIndexMax = nCount;//MSDN上未介绍的成员变量
      for (int i = 0; i < nCount; i ++)
      {
        UINT nID = pPopupMenu->GetMenuItemID(i);
        if (nID != 0)//如果不是分隔符
        {
          cmd.m_nIndex = i;
          cmd.m_nID = nID;
          cmd.DoUpdate(this, TRUE);//MSDN上未介绍的成员函数,可以找到自动更新宏,传入CCmdUI指针,来执行自动更新
        }
      }
    }这样就可以了,以上代码在VC6.0上测试通过...