BOOL COleIPFrameWnd::BuildSharedMenu() { HMENU hMenu = GetInPlaceMenu(); // create shared menu ASSERT(m_hSharedMenu == NULL); if ((m_hSharedMenu = ::CreateMenu()) == NULL) return FALSE; // start out by getting menu from container memset(&m_menuWidths, 0, sizeof m_menuWidths); if (m_lpFrame->InsertMenus(m_hSharedMenu, &m_menuWidths) != S_OK) { ::DestroyMenu(m_hSharedMenu); m_hSharedMenu = NULL; return FALSE; } // only copy the popups if there is a menu loaded if (hMenu == NULL) return TRUE; BOOL bMergeHelpMenus = FALSE; // special case - we're embedded in a docobject server that's in a docobject container if (m_menuWidths.width[5] != 0) bMergeHelpMenus = TRUE; // insert our menu popups amongst the container menus m_hMenuHelpPopup = AfxMergeMenus(m_hSharedMenu, hMenu, &m_menuWidths.width[0], 1, bMergeHelpMenus); // finally create the special OLE menu descriptor m_hOleMenu = ::OleCreateMenuDescriptor(m_hSharedMenu, &m_menuWidths); return m_hOleMenu != NULL; }
BOOL COleIPFrameWnd::BuildSharedMenu() { HMENU hMenu = GetInPlaceMenu(); // create shared menu ASSERT(m_hSharedMenu == NULL); if ((m_hSharedMenu = ::CreateMenu()) == NULL) return FALSE; // start out by getting menu from container memset(&m_menuWidths, 0, sizeof m_menuWidths); if (m_lpFrame->InsertMenus(m_hSharedMenu, &m_menuWidths) != S_OK) { ::DestroyMenu(m_hSharedMenu); m_hSharedMenu = NULL; return FALSE; } // container shouldn't touch these ASSERT(m_menuWidths.width[1] == 0); ASSERT(m_menuWidths.width[3] == 0); ASSERT(m_menuWidths.width[5] == 0); // only copy the popups if there is a menu loaded if (hMenu == NULL) return TRUE; // insert our menu popups amongst the container menus AfxMergeMenus(CMenu::FromHandle(m_hSharedMenu), CMenu::FromHandle(hMenu), &m_menuWidths.width[0], 1); #ifndef _MAC // finally create the special OLE menu descriptor m_hOleMenu = ::OleCreateMenuDescriptor(m_hSharedMenu, &m_menuWidths); return m_hOleMenu != NULL; #else return TRUE; #endif }
_AFXCTL_UIACTIVE_INFO::_AFXCTL_UIACTIVE_INFO(HMENU hInPlaceMenu, LPOLEINPLACEFRAME pInPlaceFrame) { memset(&m_menuWidths, 0, sizeof m_menuWidths); m_hSharedMenu = NULL; m_hOleMenu = NULL; if (hInPlaceMenu != NULL) { // Create shared menu if ((m_hSharedMenu = ::CreateMenu()) == NULL) return; // Start out by getting menu from container if (pInPlaceFrame->InsertMenus(m_hSharedMenu, &m_menuWidths) != S_OK) { ::DestroyMenu(m_hSharedMenu); m_hSharedMenu = NULL; } else { // Container shouldn't touch these ASSERT(m_menuWidths.width[1] == 0); ASSERT(m_menuWidths.width[3] == 0); ASSERT(m_menuWidths.width[5] == 0); // Only copy the popups if there is a menu loaded if (hInPlaceMenu != NULL) { // Insert our menu popups amongst the container menus AfxMergeMenus(m_hSharedMenu, hInPlaceMenu, &m_menuWidths.width[0], 1); } } } // Finally create the special OLE menu descriptor m_hOleMenu = ::OleCreateMenuDescriptor(m_hSharedMenu, &m_menuWidths); }
void COleClientItem::OnInsertMenus(CMenu* pMenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths) { ASSERT_VALID(this); ASSERT_VALID(pMenuShared); ASSERT(AfxIsValidAddress(lpMenuWidths, sizeof(OLEMENUGROUPWIDTHS))); // initialize the group widths array lpMenuWidths->width[0] = 0; lpMenuWidths->width[2] = 0; lpMenuWidths->width[4] = 0; // get menu from document template CDocTemplate* pTemplate = GetDocument()->GetDocTemplate(); HMENU hMenuOLE = pTemplate->m_hMenuInPlace; // only copy the popups if there is a menu loaded if (hMenuOLE == NULL) return; // insert our menu items and adjust group widths array AfxMergeMenus(pMenuShared->GetSafeHmenu(), hMenuOLE, &lpMenuWidths->width[0], 0); }