//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1995 - 1995. // // File: menuutil.cxx // // Contents: Context menu utilities, stolen from the shell. This is // basically CDefFolderMenu_MergeMenu and its support. // // History: 20-Dec-95 BruceFo Created // //---------------------------------------------------------------------------- #include "headers.hxx" #pragma hdrstop #include "menuutil.hxx" // Cannonical command names stolen from the shell TCHAR const c_szDelete[] = TEXT("delete"); TCHAR const c_szCut[] = TEXT("cut"); TCHAR const c_szCopy[] = TEXT("copy"); TCHAR const c_szLink[] = TEXT("link"); TCHAR const c_szProperties[] = TEXT("properties"); TCHAR const c_szPaste[] = TEXT("paste"); TCHAR const c_szPasteLink[] = TEXT("pastelink"); TCHAR const c_szRename[] = TEXT("rename"); HMENU LoadPopupMenu( HINSTANCE hinst, UINT id ) { HMENU hmParent = LoadMenu(hinst, MAKEINTRESOURCE(id)); if (NULL == hmParent) { return NULL; } HMENU hmPopup = GetSubMenu(hmParent, 0); RemoveMenu(hmParent, 0, MF_BYPOSITION); DestroyMenu(hmParent); return hmPopup; } HMENU MyGetMenuFromID( HMENU hmMain, UINT uID ) { MENUITEMINFO mii; mii.cbSize = sizeof(mii); mii.fMask = MIIM_SUBMENU; mii.cch = 0; // just in case if (!GetMenuItemInfo(hmMain, uID, FALSE, &mii)) { return NULL; } return mii.hSubMenu; } int MyMergePopupMenus( HMENU hmMain, HMENU hmMerge, int idCmdFirst, int idCmdLast) { int i; int idTemp; int idMax = idCmdFirst; for (i = GetMenuItemCount(hmMerge) - 1; i >= 0; --i) { MENUITEMINFO mii; mii.cbSize = sizeof(mii); mii.fMask = MIIM_ID | MIIM_SUBMENU; mii.cch = 0; // just in case if (!GetMenuItemInfo(hmMerge, i, TRUE, &mii)) { continue; } idTemp = Shell_MergeMenus( MyGetMenuFromID(hmMain, mii.wID), mii.hSubMenu, 0, idCmdFirst, idCmdLast, MM_ADDSEPARATOR | MM_SUBMENUSHAVEIDS); if (idMax < idTemp) { idMax = idTemp; } } return idMax; } VOID MyMergeMenu( HINSTANCE hinst, UINT idMainMerge, UINT idPopupMerge, LPQCMINFO pqcm) { HMENU hmMerge; UINT idMax = pqcm->idCmdFirst; UINT idTemp; if (idMainMerge && (hmMerge = LoadPopupMenu(hinst, idMainMerge)) != NULL) { idMax = Shell_MergeMenus( pqcm->hmenu, hmMerge, pqcm->indexMenu, pqcm->idCmdFirst, pqcm->idCmdLast, MM_ADDSEPARATOR | MM_SUBMENUSHAVEIDS); DestroyMenu(hmMerge); } if (idPopupMerge && (hmMerge = LoadMenu(hinst, MAKEINTRESOURCE(idPopupMerge))) != NULL) { idTemp = MyMergePopupMenus( pqcm->hmenu, hmMerge, pqcm->idCmdFirst, pqcm->idCmdLast); if (idMax < idTemp) { idMax = idTemp; } DestroyMenu(hmMerge); } pqcm->idCmdFirst = idMax; } VOID MyInsertMenu( HINSTANCE hinst, UINT idInsert, LPQCMINFO pqcm) { HMENU hmInsert; UINT idMax = pqcm->idCmdFirst; if (idInsert && (hmInsert = LoadPopupMenu(hinst, idInsert)) != NULL) { for (int i = GetMenuItemCount(hmInsert) - 1; i >= 0; --i) { MENUITEMINFO mii; mii.cbSize = sizeof(mii); mii.fMask = MIIM_ID | MIIM_SUBMENU; mii.cch = 0; // just in case if (!GetMenuItemInfo(hmInsert, i, TRUE, &mii)) { continue; } if (!InsertMenuItem(pqcm->hmenu, idMax, TRUE, &mii)) { ++idMax; } } DestroyMenu(hmInsert); } pqcm->idCmdFirst = idMax; }