Hello,
I'd like to modify ISvItemCm_fnQueryContextMenu (shell32/shv_item_cmenu.c) in a way that it loads the strings from the .rc file.
But I have some trouble. I modified the shell32_En.rc to look like the created context menu, but which puzzles me is that there are two times the same ID: FCIDM_SHVIEW_OPEN for "&Select" and for "&Open" which are shown at the same time! Depending on context (i.e. flags), I need to remove the "&Select" and switch the order of Explore and Open. But somehow the code below does not work (I think MF_BYPOSITION might cause the problem, but since Select and Open have the same id, I cannot use MF_BYCOMMAND). Any pointer what I'm doing wrong?
Tobias
shell32_En.rc =================================================================== MENU_SHV_FILE MENU DISCARDABLE BEGIN POPUP "" BEGIN + MENUITEM "&Select", FCIDM_SHVIEW_OPEN MENUITEM "E&xplore", FCIDM_SHVIEW_EXPLORE MENUITEM "&Open", FCIDM_SHVIEW_OPEN MENUITEM SEPARATOR MENUITEM "C&ut", FCIDM_SHVIEW_CUT MENUITEM "&Copy", FCIDM_SHVIEW_COPY MENUITEM SEPARATOR - MENUITEM "Create &Link", FCIDM_SHVIEW_CREATELINK +/* MENUITEM "Create &Link", FCIDM_SHVIEW_CREATELINK*/ MENUITEM "&Delete", FCIDM_SHVIEW_DELETE MENUITEM "&Rename", FCIDM_SHVIEW_RENAME - MENUITEM SEPARATOR - MENUITEM "&Properties", FCIDM_SHVIEW_PROPERTIES +/* MENUITEM SEPARATOR + MENUITEM "&Properties", FCIDM_SHVIEW_PROPERTIES*/ END END ===================================================================
Index: shv_item_cmenu.c (deleted lines omitted in the ISvItemCm_fnQueryContextMenu function) =================================================================== @@ -36,6 +36,7 @@
#include "shell32_main.h" #include "shellfolder.h" +#include "shresdef.h"
WINE_DEFAULT_DEBUG_CHANNEL(shell);
@@ -208,57 +209,127 @@ InsertMenuItemA( hmenu, indexMenu, fByPosition, &mii); }
+ /************************************************************************** * ISvItemCm_fnQueryContextMenu() -* FIXME: load menu MENU_SHV_FILE out of resources instead if creating -* each menu item by calling _InsertMenuItem() */ static HRESULT WINAPI ISvItemCm_fnQueryContextMenu( IContextMenu2 *iface, - HMENU hmenu, + HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) { + const DWORD buflen = 80; + WCHAR szString[buflen]; + HMENU hMyMenu; + HRESULT hr; + UINT idMax; + MENUITEMINFOW mii; + + ItemCmImpl *This = (ItemCmImpl *)iface; + + TRACE("(%p)->(hMenu=%p indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )\n",This, hMenu, indexMenu, idCmdFirst, idCmdLa st, uFlags); + + if (idCmdFirst != 0) + FIXME("We should use idCmdFirst=%d and idCmdLast=%d for command ids\n", idCmdFirst, idCmdLast); + + if(!(CMF_DEFAULTONLY & uFlags) && This->cidl>0) + { + hMyMenu = LoadMenuA(shell32_hInstance, "MENU_SHV_FILE"); + + if((uFlags || CMF_EXPLORE)) { /* Remove "&Select" */ + RemoveMenu(hMyMenu, 0, MF_BYPOSITION); + } + if(!This->bAllValues) { / * Change order of OPEN and EXPLORE */ + GetMenuItemInfoW(hMyMenu, 2, TRUE, &mii); + DeleteMenu(hMyMenu, 2, MF_BYPOSITION); + InsertMenuItemW(hMyMenu, 1, TRUE, &mii); + } + + if(ISvItemCm_CanRenameItems(This) == MFS_DISABLED) { + EnableMenuItem(hMyMenu, FCIDM_SHVIEW_RENAME, MFS_DISABLED); + } + + idMax = Shell_MergeMenus (hMenu, GetSubMenu(hMyMenu,0), indexMenu, + idCmdFirst, idCmdLast, MM_SUBMENUSHAVEIDS); + hr = MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, idMax-idCmdFirst+1); + SetMenuDefaultItem(hMenu, 0, MF_BYPOSITION); + + DestroyMenu(hMyMenu); + } + else { + return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 0); + } + TRACE("(%p)->returning 0x%lx\n",This,hr); + return hr; }