HMENU fsODMenu::CopyMenu(HMENU hMenu) { HMENU hCopy = CreateMenu (); for (int i = 0; i < GetMenuItemCount (hMenu); i++) { UINT uState = GetMenuState (hMenu, i, MF_BYPOSITION); UINT nID; char szMenuText [100]; if (uState & MF_POPUP) { nID = (UINT) CopyMenu (GetSubMenu (hMenu, i)); uState = MF_POPUP | MF_STRING; } else nID = GetMenuItemID (hMenu, i); GetMenuString (hMenu, i, szMenuText, sizeof (szMenuText), MF_BYPOSITION); AppendMenu (hCopy, uState, nID, szMenuText); } return hCopy; }
int fsODMenu::InsertMenu(CMenu *pMenu, int iWhere, CMenu *pMenuWhere) { BOOL bMenuBar = FALSE; if (pMenuWhere == NULL) { pMenuWhere = CMenu::FromHandle (m_hMenu); bMenuBar = TRUE; } for (UINT i = 0; i < (UINT)pMenu->GetMenuItemCount (); i++) { CString strText; pMenu->GetMenuString (i, strText, MF_BYPOSITION); HMENU hMenu = CopyMenu (pMenu->GetSubMenu (i)->m_hMenu); CMenu *menu = CMenu::FromHandle (hMenu); pMenuWhere->InsertMenu (iWhere, MF_BYPOSITION | MF_POPUP, (UINT_PTR) menu->m_hMenu, strText); AttachMenu (menu); AttachMenuItem (pMenuWhere, iWhere++)->bMenuBar = bMenuBar; } return pMenu->GetMenuItemCount (); }
wxMenu* CopyMenu(wxMenu* mnu, bool with_accelerators) { if (!mnu || mnu->GetMenuItemCount() < 1) return nullptr; wxMenu* theMenu = new wxMenu(); for (size_t i = 0; i < mnu->GetMenuItemCount();++i) { wxMenuItem* tmpItem = mnu->FindItemByPosition(i); wxMenuItem* theItem = new wxMenuItem(nullptr, tmpItem->GetId(), with_accelerators?tmpItem->GetItemLabel():tmpItem->GetItemLabelText(), tmpItem->GetHelp(), tmpItem->GetKind(), CopyMenu(tmpItem->GetSubMenu())); theMenu->Append(theItem); } return theMenu; }
// ========================================================================= // This function *requires* dummy menu resource IDR_MENU_DUMMY_LEFTRIGHT with // two buttons HWND SetupMenu_Softkey( HWND hWnd, int MenuID, int leftMenuItemCtrlID, WCHAR* rightMenuTitle ) { HWND retval; MENUITEMINFO menuInfoLeft; HMENU hMenuRight; TBBUTTON tbb[2]; HMENU hMenuLoaded; WCHAR buffer[1024]; // Just a value large enough to store menu text WCHAR defaultRightTitle[1024]; // Just a value large enough to store menu text WCHAR* useRightTitle; retval = SetupMenu_NonSoftkey(hWnd, IDR_MENU_DUMMY_LEFTRIGHT); useRightTitle = rightMenuTitle; if (useRightTitle == NULL) { wcscpy(defaultRightTitle, _("Menu")); useRightTitle = defaultRightTitle; } if (retval != NULL) { // Ditch the dummy buttons... SendMessage((HWND)retval, TB_DELETEBUTTON, 0, 0); SendMessage((HWND)retval, TB_DELETEBUTTON, 0, 0); hMenuLoaded = LoadMenu(G_hInstance, MAKEINTRESOURCE(MenuID)); if (hMenuLoaded != NULL) { menuInfoLeft.cbSize = sizeof(menuInfoLeft); menuInfoLeft.fMask = (MIIM_TYPE | MIIM_ID); menuInfoLeft.cch = sizeof(buffer); menuInfoLeft.dwTypeData = buffer; // Identify menuitem for left button text if (GetMenuItemInfo( hMenuLoaded, leftMenuItemCtrlID, FALSE, &menuInfoLeft )) { // Lose any "..." following the command wcstok(buffer, TEXT(".")); } else { wsprintf(buffer, TEXT("???")); } hMenuRight = CreatePopupMenu(); CopyMenu(hMenuLoaded, hMenuRight); DestroyMenu(hMenuLoaded); memset(&tbb, 0, sizeof(tbb)); // Setup left menubutton... tbb[0].idCommand = leftMenuItemCtrlID; tbb[0].iBitmap = I_IMAGENONE; tbb[0].fsState = TBSTATE_ENABLED; tbb[0].fsStyle = ( TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE | 0x80 // magic flag ); tbb[0].dwData = (DWORD)0; tbb[0].iString = (int)buffer; // Setup right menubutton... tbb[1].idCommand = TB_MENU_RIGHT; tbb[1].iBitmap = I_IMAGENONE; tbb[1].fsState = TBSTATE_ENABLED; tbb[1].fsStyle = ( TBSTYLE_DROPDOWN | TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE | 0x80 // magic flag ); tbb[1].dwData = (DWORD)hMenuRight; tbb[1].iString = (int)useRightTitle; SendMessage((HWND)retval, TB_ADDBUTTONSW, 2, (LPARAM)(&tbb)); DrawMenuBar(retval); } } return retval; }
// ========================================================================= // Because we can't load a main menu with separators, any menuitem with // an ID of ID_SEPARATOR will be replaced with a separator void CopyMenu(HMENU hOrigMenu, HMENU hNewMenu) { MENUITEMINFO menuItemInfo; int i; WCHAR buffer[1024]; // Just a value large enough to store menu text UINT newID; UINT newItemFlags; HMENU hNewPopup; i = 0; while (TRUE) { ZeroMemory(&menuItemInfo, sizeof(menuItemInfo)); menuItemInfo.cbSize = sizeof(menuItemInfo); menuItemInfo.fMask = ( MIIM_CHECKMARKS | MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_SUBMENU | MIIM_TYPE ); menuItemInfo.dwTypeData = buffer; menuItemInfo.cch = sizeof(buffer); if (!(GetMenuItemInfo(hOrigMenu, i, TRUE, &menuItemInfo))) { break; } // Recursively copy submenus: newItemFlags = MF_BYPOSITION; newID = menuItemInfo.wID; if ( (menuItemInfo.fType && MFT_SEPARATOR) || (newID == ID_SEPARATOR) ) { newItemFlags |= MF_SEPARATOR; } if (menuItemInfo.hSubMenu) { newItemFlags |= MF_POPUP; hNewPopup = CreatePopupMenu(); CopyMenu(menuItemInfo.hSubMenu, hNewPopup); menuItemInfo.hSubMenu = hNewPopup; newID = (int)hNewPopup; } /* MF_STRING MF_UNCHECKED MF_MENUBREAK MF_GRAYED MF_ENABLED MF_CHECKED MF_MENUBARBREAK MF_SEPARATOR */ // Add the copy... InsertMenu(hNewMenu, i, newItemFlags, newID, buffer); // Setup this for enabled and checkmarks... SetMenuItemInfo(hNewMenu, i, TRUE, &menuItemInfo); i++; } }