ON_UPDATE_COMMAND_UI_RANGE(MIN_MENU_ID,MAX_MENU_ID,OnUpdateMenu)
能否通过消息拦截的方法去实现上面的宏所实现的功能呢?已经把窗口子类化,可以获得所有的消息.请高手指点,分不够还可以给....

解决方案 »

  1.   

    我的菜单是动态生成的,所以我拦截了所有消息,只不过刚加进的菜单全是灰化的.我希望能在菜单状态更新那里把菜单全使能化.
    也就是如下:
    void CMainFrame::OnUpdateMenu(CCmdUI* pCmdUI)
    {
    pCmdUI->Enable();
    }在拦截WM_INITMENUPOPUP,没办法把动态加进的菜单使能化,调用的是EnableMenuItem 函数
      

  2.   

    不需要拦截WM_INITMENUPOPUP,直接处理菜单所属窗口的WM_INITMENUPOPUP就可以了。另,动态加入或修改菜单后,应调用DrawMenuBar(hWnd)使菜单立即得到更新。
      

  3.   


    直接处理菜单所属窗口的WM_INITMENUPOPUP就可以了
    --------------------------------------------------我的菜单是动态加在某个下拉菜单里面的,所以不用DrawMenuBar也可以的呀(我在ActivateFrame函数里面添加菜单的),只是我希望把加进的菜单变成使能而已.我处理的是菜单所属窗口的WM_INITMENUPOPUP消息.能否更详细点?
      

  4.   

    LRESULT CALLBACK newWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
    switch(uMsg)
    {
    case WM_COMMAND:
    {
    WORD nId =LOWORD(wParam) ;
    if((nId >= 8888) && (nId <= 9999))
    AfxMessageBox(_T("Hello"));
    }
    break;
    case WM_INITMENUPOPUP:
    {

    }
    break;
    }
    return CallWindowProc(oldWndProc,hWnd,uMsg,wParam,lParam);
    }
      

  5.   

    加进的菜单变成使能一般用SetMenuInfo或EnableMenuItem,如果更改的是window menu, 使用后必须立即调用DrawMenuBar
      

  6.   

    好像不可以用EnbleMenuItem,如果要用这个函数好像要把m_bAutoMenuEnable 这个变量设为FALSE,这样就会把原本其他菜单的使能化变乱了.
      

  7.   

    看你上面的代码,用的是SDK API
    如果用win32 SDK API,会发现MFC中的可能出现的问题在这里都不存在了。(MFC框架使用虽方便,但也会将一些简单的操作复杂化)。EnableMenuItem只修改你指定的菜单项的状态,对其他项无影响。
      

  8.   

    EnableMenuItem只修改你指定的菜单项的状态,对其他项无影响。------------------------------------
    这个我知道,但用这个函数之前需要把m_bAutoMenuEnable = FALSE;
    设置这个变量,会使原本主菜单灰掉的选项变成使能了,这一切都发生在我加动态菜单项之前的.
      

  9.   

    我现在基本已不用MFC,m_bAutoMenuEnable的副作用不是很了解。如果直接使用API,根本不存在这种问题。
    仔细看了一下,你似乎用的是窗口子类化。不知为什么要这么用。另:如果你处理了WM_INITMENUPOPUP, 应返回0
    case WM_INITMENUPOPUP:
    {

    }
    return 0L;
      

  10.   

    用窗口子类化的原因是因为,我封装了一个可以动态创建删除菜单的类,里面已经可以完成一切的菜单处理,现在只少一点点缺陷,就是刚开始的时候新加的菜单会灰掉,我需要在FRAME里面添加
    ON_UPDATE_COMMAND_UI_RANGE(MIN_MENU_ID,MAX_MENU_ID,OnUpdateMenu)void CMainFrame::OnUpdateMenu(CCmdUI* pCmdUI)
    {
    pCmdUI->Enable();
    }因为我希望能把所有与动态菜单相关的操作放在我地类里面,SO.....