精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>一般性编程问题>>如何在对话框中响应CmdUI消息?

主题:如何在对话框中响应CmdUI消息?
发信人: dowhile()
整理人: wenbobo(2002-12-06 23:27:39), 站内信件
在对话框应用程序中,加入以下代码,就可以响应CmdUI以取消激活菜单了,
这段代码是从FrameWnd中取出的,略作修改。

一、在对话框类定义中加入以下成员函数。
二、在消息映射表中加入ON_INITMENUPOPUP。
三、在CPP中加入以下成员函数体

void CDemoDlg::OnInitMenuPopup(CMenu* pMenu, UINT nIndex, BOOL bSysMen

u)
{
  if (bSysMenu)
    return;     // don't support system menu

  ASSERT(pMenu != NULL);
  // check the enabled state of various menu items

  CCmdUI state;
  state.m_pMenu = pMenu;
  ASSERT(state.m_pOther == NULL);
  ASSERT(state.m_pParentMenu == NULL);

  // determine if menu is popup in top-level menu and set m_pOther to


  //  it if so (m_pParentMenu == NULL indicates that it is secondary p

opup)
  HMENU hParentMenu;
  if (AfxGetThreadState()->m_hTrackingMenu == pMenu->m_hMenu)
    state.m_pParentMenu = pMenu;    // parent == child for tracking po

pup
  else if ((hParentMenu = ::GetMenu(m_hWnd)) != NULL)
  {
    CWnd* pParent = GetTopLevelParent();
      // child windows don't have menus -- need to go to the top!
    if (pParent != NULL &&
      (hParentMenu = ::GetMenu(pParent->m_hWnd)) != NULL)
    {
      int nIndexMax = ::GetMenuItemCount(hParentMenu);
      for (int nIndex = 0; nIndex < nIndexMax; nIndex++)
{
if (::GetSubMenu(hParentMenu, nIndex) == pMenu->m_hMenu)
        {
          // when popup is found, m_pParentMenu is containing menu
          state.m_pParentMenu = CMenu::FromHandle(hParentMenu);
          break;
        }
      }
    }
  }

  state.m_nIndexMax = pMenu->GetMenuItemCount();
  for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax;
state.m_nIndex++)
{
state.m_nID = pMenu->GetMenuItemID(state.m_nIndex);
    if (state.m_nID == 0)
      continue; // menu separator or invalid cmd - ignore it

    ASSERT(state.m_pOther == NULL);
    ASSERT(state.m_pMenu != NULL);
    if (state.m_nID == (UINT)-1)
    {
      // possibly a popup menu, route to first item of that popup
      state.m_pSubMenu = pMenu->GetSubMenu(state.m_nIndex);
      if (state.m_pSubMenu == NULL ||
        (state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0 ||
        state.m_nID == (UINT)-1)
      {
        continue;       // first item of popup can't be routed to
      }
      state.DoUpdate(this, FALSE);    // popups are never auto disable

d
    }
    else
    {
      // normal menu item
      // Auto enable/disable if frame window has 'm_bAutoMenuEnable'
      //    set and command is _not_ a system command.
      state.m_pSubMenu = NULL;
            state.DoUpdate(this, state.m_nID < 0xF000);
}

// adjust for menu deletions and additions
UINT nCount = pMenu->GetMenuItemCount();
    if (nCount < state.m_nIndexMax)
{
state.m_nIndex -= (state.m_nIndexMax - nCount);
while (state.m_nIndex < nCount &&
pMenu->GetMenuItemID(state.m_nIndex) == state.m_nID)
      {
        state.m_nIndex++;
      }
    }
    state.m_nIndexMax = nCount;
  }
}



--
※ 修改:.dowhile 于 Nov 18 09:42:51 修改本文.[FROM: 202.102.240.99]
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.102.240.99]

[关闭][返回]