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

Reply via email to