BUG: Selecting DocObject Server Menu Disables IE's Menu Options

ID: Q181677


The information in this article applies to:
  • Microsoft Internet Explorer (Programming) versions 4.0, 4.01, 5.0
  • The Microsoft Foundation Classes (MFC), included with:
    • Microsoft Visual C++, 32-bit Editions, versions 4.2, 4.2b


SYMPTOMS

When an Active Document (DocObject) server is loaded into Internet Explorer (IE) 4.0x, and a pop-up menu that is owned by the DocObject server is selected, Internet Explorer's menu options are disabled.


CAUSE

The Microsoft Foundation Classes (MFC) enables and disables menu options in its WM_INITMENUPOPUP message handler. Menu items that do not have a handler function are disabled. This is fine for menu options that are owned by the DocObject server. The problem is Internet Explorer sends a WM_INITMENUPOPUP message to the DocObject server even for menus that it does not own. This is a bug in Internet Explorer 4.0x.


RESOLUTION

A workaround is to override the WM_INITMENUPOPUP message handler in the COleDocIPFrameWnd-derived class(CInPlaceFrame) and verify that it is a menu owned by the DocObject server before calling the base class implementation:


/*
========================================================================
     Name: FindMenu
 Purpose : Helper function for finding a submenu within a menu
Arguments: hFindMenu   - HMENU to look for
           hSearchMenu - HMENU to search in
========================================================================
*/ 
BOOL FindMenu (HMENU hFindMenu, HMENU hSearchMenu)
{
   BOOL bRet = FALSE;
   // get number of items in hSearchMenu
   int iMenuItemCount = GetMenuItemCount (hSearchMenu);
   // loop through hSearchMenu to find hFindMenu
   for (int iCntr=0; iCntr<iMenuItemCount; iCntr++)
   {
      // get each submenu in hSearchMenu
      HMENU hSubMenu = GetSubMenu (hSearchMenu, iCntr);
      if (hSubMenu)
      {
         // if we find a match, get out
         if (hFindMenu == hSubMenu)
            break;
         // recurse into FindMenu looking for hFindMenu in each submenu
         if (FindMenu (hFindMenu, hSubMenu))
            break;
      }
   }
   // match found
   if (iCntr != iMenuItemCount)
      bRet = TRUE;
   return bRet;
}

void CInPlaceFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex,
                                    BOOL bSysMenu)
{
   COleServerDoc* pDoc = (COleServerDoc*)GetActiveDocument();
   ASSERT (pDoc);
   // if we're created as a docobject
   if (pDoc->IsDocObject())
   {
// if submenu is not found in in-place menu, return
      if (FALSE == FindMenu (pPopupMenu->GetSafeHmenu(),
                             GetInPlaceMenu()))
         return;
   }
   COleDocIPFrameWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
} 


STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article.

Additional query words: ActiveX documents

Keywords : kbole kbIE400bug kbIE401bug kbMFC kbVC kbIE500bug
Version :
Platform :
Issue type : kbbug


Last Reviewed: April 9, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.