我给对话框加了一个菜单,并给菜单添加了COMMAND和UPDATE_COMMAND_UI消息处理函数,都是添加在对话框类里面的。为什么只有COMMAND处理函数有用,UPDATE_COMMAND_UI处理函数没用?

解决方案 »

  1.   

    对话框本身不支持ON_UPDATE_COMMAND_UI机制
    你可以在PretranslateMessage中加入UpdateDialogControls(this, TRUE);
      

  2.   

    刚刚试过,支队按钮等控件有效
    再出手
    添加消息WM_KICKIDEL消息的响应函数
    在头文件Afxpriv中声明在响应函数中
    调用UpdateDialogControl可以更新按钮等控件
    菜单可以处理消息WM_INITMENUPOPUP加入以下代码
        CCmdUI cmdUI;
        for (UINT n = 0; n < pPopupMenu->GetMenuItemCount(); ++n)
        {
            CMenu* pSubMenu = pPopupMenu->GetSubMenu(n);
    if (pSubMenu == NULL)
    pSubMenu = pPopupMenu;

            cmdUI.m_nIndexMax = pSubMenu->GetMenuItemCount();
            for (UINT i = 0; i < cmdUI.m_nIndexMax;++i)
            {
                cmdUI.m_nIndex = i;
                cmdUI.m_nID = pSubMenu->GetMenuItemID(i);
                cmdUI.m_pMenu = pSubMenu;
                cmdUI.DoUpdate(this, FALSE);
            }
        }
      

  3.   

    我是新手,没看明白,我把你的代码加到PreTranslateMessage没用。
    BOOL CmychessDlg::PreTranslateMessage(MSG* pMsg)
    {
    // TODO: 在此添加专用代码和/或调用基类
    if(pMsg->message==WM_INITMENUPOPUP)
    {
    CCmdUI cmdUI;
    CMenu* pPopupMenu;
    pPopupMenu=GetMenu();
    for (UINT n = 0;n<pPopupMenu->GetMenuItemCount(); ++n)
    {
    CMenu* pSubMenu =pPopupMenu->GetSubMenu(n);
    if (pSubMenu == NULL)
    pSubMenu = pPopupMenu;
    cmdUI.m_nIndexMax = pSubMenu->GetMenuItemCount();
    for (UINT i = 0; i < cmdUI.m_nIndexMax;++i)
    {
    cmdUI.m_nIndex = i;
    cmdUI.m_nID = pSubMenu->GetMenuItemID(i);
    cmdUI.m_pMenu = pSubMenu;
    cmdUI.DoUpdate(this, FALSE);
    }
    }
    }
    return CDialog::PreTranslateMessage(pMsg);
    }
      

  4.   

    void CTest1Dlg::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) 
    {
    CDialog::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);

        CCmdUI cmdUI;
        for (UINT n = 0; n < pPopupMenu->GetMenuItemCount(); ++n)
        {
            CMenu* pSubMenu = pPopupMenu->GetSubMenu(n);
    if (pSubMenu == NULL)
    pSubMenu = pPopupMenu;

            cmdUI.m_nIndexMax = pSubMenu->GetMenuItemCount();
            for (UINT i = 0; i < cmdUI.m_nIndexMax;++i)
            {
                cmdUI.m_nIndex = i;
                cmdUI.m_nID = pSubMenu->GetMenuItemID(i);
                cmdUI.m_pMenu = pSubMenu;
                cmdUI.DoUpdate(this, FALSE);
            }
        }

    // TODO: Add your message handler code here

    }
    if(pMsg->message==WM_INITMENUPOPUP)
    这一段代码就没有执行到
      

  5.   

    包含头文件:#include <afxpriv.h>
    添加消息出来函数:
    afx_msg LRESULT OnKickIdle(WPARAM , LPARAM );
    消息影射:
    ON_MESSAGE(WM_KICKIDLE, OnKickIdle)
    定义:
    LRESULT CMy24DianDlg::OnKickIdle(WPARAM wParam, LPARAM lParam)
    { CMenu* pMainMenu = GetMenu();
     CCmdUI cmdUI;
     for (UINT n = 0; n < pMainMenu->GetMenuItemCount(); ++n)
     {
      CMenu* pSubMenu = pMainMenu->GetSubMenu(n);
      cmdUI.m_nIndexMax = pSubMenu->GetMenuItemCount();
      for (UINT i = 0; i < cmdUI.m_nIndexMax;++i)
      {
       cmdUI.m_nIndex = i;
       cmdUI.m_nID = pSubMenu->GetMenuItemID(i);
       cmdUI.m_pMenu = pSubMenu;
       cmdUI.DoUpdate(this, FALSE);
      }
     }
     return TRUE;}