对话框程序无法响应菜单更新的问题

 对话框中的菜单无法响应ON_COMMAND_UI消息,也无法在点击菜单的时候用SETCHECK来达到设置菜单是否打勾的目的,因此只能通过另外的方法解决:
        解决方法为:
        使对话框响应WM_INITMENUPOPUP消息,然后在消息响应中加入以下代码(以下代码为MFC的FRAME响应菜单更新的源代码)
  1.         ASSERT(pPopupMenu != NULL);
  2.     // Check the enabled state of various menu items.
  3.     CCmdUI state;
  4.     state.m_pMenu = pPopupMenu;
  5.     ASSERT(state.m_pOther == NULL);
  6.     ASSERT(state.m_pParentMenu == NULL);
  7.     // Determine if menu is popup in top-level menu and set m_pOther to
  8.     // it if so (m_pParentMenu == NULL indicates that it is secondary popup).
  9.     HMENU hParentMenu;
  10.     if (AfxGetThreadState()->m_hTrackingMenu == pPopupMenu->m_hMenu)
  11.         state.m_pParentMenu = pPopupMenu;    // Parent == child for tracking popup.
  12.     else if ((hParentMenu = ::GetMenu(m_hWnd)) != NULL)
  13.     {
  14.         CWnd* pParent = this;
  15.            // Child windows don't have menus--need to go to the top!
  16.         if (pParent != NULL &
  17.            (hParentMenu = ::GetMenu(pParent->m_hWnd)) != NULL)
  18.         {
  19.            int nIndexMax = ::GetMenuItemCount(hParentMenu);
  20.            for (int nIndex = 0; nIndex < nIndexMax; nIndex++)
  21.            {
  22.             if (::GetSubMenu(hParentMenu, nIndex) == pPopupMenu->m_hMenu)
  23.             {
  24.                 // When popup is found, m_pParentMenu is containing menu.
  25.                 state.m_pParentMenu = CMenu::FromHandle(hParentMenu);
  26.                 break;
  27.             }
  28.            }
  29.         }
  30.     }
  31.     state.m_nIndexMax = pPopupMenu->GetMenuItemCount();
  32.     for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax;
  33.       state.m_nIndex++)
  34.     {
  35.         state.m_nID = pPopupMenu->GetMenuItemID(state.m_nIndex);
  36.         if (state.m_nID == 0)
  37.            continue// Menu separator or invalid cmd - ignore it.
  38.         ASSERT(state.m_pOther == NULL);
  39.         ASSERT(state.m_pMenu != NULL);
  40.         if (state.m_nID == (UINT)-1)
  41.         {
  42.            // Possibly a popup menu, route to first item of that popup.
  43.            state.m_pSubMenu = pPopupMenu->GetSubMenu(state.m_nIndex);
  44.            if (state.m_pSubMenu == NULL ||
  45.             (state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0 ||
  46.             state.m_nID == (UINT)-1)
  47.            {
  48.             continue;       // First item of popup can't be routed to.
  49.            }
  50.            state.DoUpdate(this, TRUE);   // Popups are never auto disabled.
  51.         }
  52.         else
  53.         {
  54.            // Normal menu item.
  55.            // Auto enable/disable if frame window has m_bAutoMenuEnable
  56.            // set and command is _not_ a system command.
  57.            state.m_pSubMenu = NULL;
  58.            state.DoUpdate(this, FALSE);
  59.         }
  60.         // Adjust for menu deletions and additions.
  61.         UINT nCount = pPopupMenu->GetMenuItemCount();
  62.         if (nCount < state.m_nIndexMax)
  63.         {
  64.            state.m_nIndex -= (state.m_nIndexMax - nCount);
  65.            while (state.m_nIndex < nCount &
  66.             pPopupMenu->GetMenuItemID(state.m_nIndex) == state.m_nID)
  67.            {
  68.             state.m_nIndex++;
  69.            }
  70.         }
  71.         state.m_nIndexMax = nCount;
  72.     }


添加完成之后,就可以使对话框正常响应菜单更新消息了。

若要更详细的说明,请参阅MSDN的 242577号知识库文章。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值