windows-nt/Source/XPSP1/NT/shell/osshell/lmui/shareui/menuutil.cxx
2020-09-26 16:20:57 +08:00

188 lines
4.1 KiB
C++

//+---------------------------------------------------------------------------
//
// 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;
}