Author: gadamopoulos
Date: Sun Jul 9 20:57:01 2017
New Revision: 75313
URL:
http://svn.reactos.org/svn/reactos?rev=75313&view=rev
Log:
[EXPLORER]
- CTrayWindow: Implement the IContextMenu interface. This will be used by the CBandSite to
query the context menu of its site (the CTrayWindow) and add it in its context menu.
- CTrayWindowCtxMenu: Use Shell_MergeMenus in QueryContextMenu and respect its
parameters.
Modified:
trunk/reactos/base/shell/explorer/resource.h
trunk/reactos/base/shell/explorer/traywnd.cpp
Modified: trunk/reactos/base/shell/explorer/resource.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/explorer/resour…
==============================================================================
--- trunk/reactos/base/shell/explorer/resource.h [iso-8859-1] (original)
+++ trunk/reactos/base/shell/explorer/resource.h [iso-8859-1] Sun Jul 9 20:57:01 2017
@@ -177,15 +177,15 @@
#define ID_SHELL_CMD_FIRST 0xF
#define ID_SHELL_CMD_LAST 0x7FEF
-#define ID_SHELL_CMD_PROPERTIES (ID_SHELL_CMD_LAST + 1)
-#define ID_SHELL_CMD_OPEN_ALL_USERS (ID_SHELL_CMD_LAST + 2)
-#define ID_SHELL_CMD_EXPLORE_ALL_USERS (ID_SHELL_CMD_LAST + 3)
-#define ID_LOCKTASKBAR (ID_SHELL_CMD_LAST + 4)
-#define ID_SHELL_CMD_OPEN_TASKMGR (ID_SHELL_CMD_LAST + 5)
-#define ID_SHELL_CMD_UNDO_ACTION (ID_SHELL_CMD_LAST + 6)
-#define ID_SHELL_CMD_SHOW_DESKTOP (ID_SHELL_CMD_LAST + 7)
-#define ID_SHELL_CMD_TILE_WND_V (ID_SHELL_CMD_LAST + 8)
-#define ID_SHELL_CMD_TILE_WND_H (ID_SHELL_CMD_LAST + 9)
-#define ID_SHELL_CMD_CASCADE_WND (ID_SHELL_CMD_LAST + 10)
-#define ID_SHELL_CMD_CUST_NOTIF (ID_SHELL_CMD_LAST + 11)
-#define ID_SHELL_CMD_ADJUST_DAT (ID_SHELL_CMD_LAST + 12)
+#define ID_SHELL_CMD_PROPERTIES (401)
+#define ID_SHELL_CMD_OPEN_ALL_USERS (402)
+#define ID_SHELL_CMD_EXPLORE_ALL_USERS (403)
+#define ID_LOCKTASKBAR (404)
+#define ID_SHELL_CMD_OPEN_TASKMGR (405)
+#define ID_SHELL_CMD_UNDO_ACTION (406)
+#define ID_SHELL_CMD_SHOW_DESKTOP (407)
+#define ID_SHELL_CMD_TILE_WND_V (408)
+#define ID_SHELL_CMD_TILE_WND_H (409)
+#define ID_SHELL_CMD_CASCADE_WND (410)
+#define ID_SHELL_CMD_CUST_NOTIF (411)
+#define ID_SHELL_CMD_ADJUST_DAT (412)
Modified: trunk/reactos/base/shell/explorer/traywnd.cpp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/explorer/traywn…
==============================================================================
--- trunk/reactos/base/shell/explorer/traywnd.cpp [iso-8859-1] (original)
+++ trunk/reactos/base/shell/explorer/traywnd.cpp [iso-8859-1] Sun Jul 9 20:57:01 2017
@@ -190,7 +190,8 @@
public CWindowImpl < CTrayWindow, CWindow, CControlWinTraits >,
public ITrayWindow,
public IShellDesktopTray,
- public IOleWindow
+ public IOleWindow,
+ public IContextMenu
{
CStartButton m_StartButton;
@@ -198,6 +199,7 @@
CComPtr<IMenuPopup> m_StartMenuPopup;
CComPtr<IDeskBand> m_TaskBand;
+ CComPtr<IContextMenu> m_ContextMenu;
HTHEME m_Theme;
HFONT m_Font;
@@ -2078,8 +2080,44 @@
}
-
-
+ /*
+ * IContextMenu
+ */
+ HRESULT STDMETHODCALLTYPE QueryContextMenu(HMENU hPopup,
+ UINT indexMenu,
+ UINT idCmdFirst,
+ UINT idCmdLast,
+ UINT uFlags)
+ {
+ if (!m_ContextMenu)
+ {
+ HRESULT hr = TrayWindowCtxMenuCreator(this, m_hWnd, &m_ContextMenu);
+ if (FAILED_UNEXPECTEDLY(hr))
+ return hr;
+ }
+
+ return m_ContextMenu->QueryContextMenu(hPopup, indexMenu, idCmdFirst,
idCmdLast, uFlags);
+ }
+
+ HRESULT STDMETHODCALLTYPE InvokeCommand(LPCMINVOKECOMMANDINFO lpici)
+ {
+ if (!m_ContextMenu)
+ return E_INVALIDARG;
+
+ return m_ContextMenu->InvokeCommand(lpici);
+ }
+
+ HRESULT STDMETHODCALLTYPE GetCommandString(UINT_PTR idCmd,
+ UINT uType,
+ UINT *pwReserved,
+ LPSTR pszName,
+ UINT cchMax)
+ {
+ if (!m_ContextMenu)
+ return E_INVALIDARG;
+
+ return m_ContextMenu->GetCommandString(idCmd, uType, pwReserved, pszName,
cchMax);
+ }
/**********************************************************
@@ -2590,9 +2628,7 @@
{
HandleTrayContextMenu:
/* Tray the default tray window context menu */
- CComPtr<IContextMenu> ctxMenu;
- TrayWindowCtxMenuCreator(this, m_hWnd, &ctxMenu);
- TrackCtxMenu(ctxMenu, ppt, NULL, FALSE, this);
+ TrackCtxMenu(this, ppt, NULL, FALSE, this);
}
}
return Ret;
@@ -2998,6 +3034,7 @@
/*COM_INTERFACE_ENTRY_IID(IID_ITrayWindow, ITrayWindow)*/
COM_INTERFACE_ENTRY_IID(IID_IShellDesktopTray, IShellDesktopTray)
COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow)
+ COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
END_COM_MAP()
};
@@ -3009,12 +3046,14 @@
HWND hWndOwner;
CComPtr<CTrayWindow> TrayWnd;
CComPtr<IContextMenu> pcm;
+ UINT m_idCmdCmFirst;
public:
HRESULT Initialize(ITrayWindow * pTrayWnd, IN HWND hWndOwner)
{
this->TrayWnd = (CTrayWindow *) pTrayWnd;
this->hWndOwner = hWndOwner;
+ this->m_idCmdCmFirst = 0;
return S_OK;
}
@@ -3026,30 +3065,8 @@
UINT uFlags)
{
HMENU menubase = LoadPopupMenu(hExplorerInstance,
MAKEINTRESOURCEW(IDM_TRAYWND));
-
if (!menubase)
return HRESULT_FROM_WIN32(GetLastError());
-
- int count = ::GetMenuItemCount(menubase);
-
- for (int i = 0; i < count; i++)
- {
- WCHAR label[128];
-
- MENUITEMINFOW mii = { 0 };
- mii.cbSize = sizeof(mii);
- mii.fMask = MIIM_STATE | MIIM_ID | MIIM_SUBMENU | MIIM_CHECKMARKS
- | MIIM_DATA | MIIM_STRING | MIIM_BITMAP | MIIM_FTYPE;
- mii.dwTypeData = label;
- mii.cch = _countof(label);
- ::GetMenuItemInfoW(menubase, i, TRUE, &mii);
-
- TRACE("Adding item %d label %S type %d\n", mii.wID, mii.dwTypeData,
mii.fType);
-
- ::InsertMenuItemW(hPopup, i + 1, TRUE, &mii);
- }
-
- ::DestroyMenu(menubase);
if (SHRestricted(REST_CLASSICSHELL) != 0)
{
@@ -3062,13 +3079,19 @@
ID_LOCKTASKBAR,
MF_BYCOMMAND | (TrayWnd->Locked ? MF_CHECKED : MF_UNCHECKED));
+ UINT idCmdNext;
+ idCmdNext = Shell_MergeMenus(hPopup, menubase, indexMenu, idCmdFirst, idCmdLast,
MM_SUBMENUSHAVEIDS | MM_ADDSEPARATOR);
+ m_idCmdCmFirst = idCmdNext - idCmdFirst;
+
+ ::DestroyMenu(menubase);
+
if (TrayWnd->m_TrayBandSite != NULL)
{
if (FAILED(TrayWnd->m_TrayBandSite->AddContextMenus(
hPopup,
- 0,
- ID_SHELL_CMD_FIRST,
- ID_SHELL_CMD_LAST,
+ indexMenu,
+ idCmdNext,
+ idCmdLast,
CMF_NORMAL,
&pcm)))
{
@@ -3086,7 +3109,7 @@
UINT uiCmdId = (UINT) lpici->lpVerb;
if (uiCmdId != 0)
{
- if (uiCmdId >= ID_SHELL_CMD_FIRST && uiCmdId <=
ID_SHELL_CMD_LAST)
+ if (uiCmdId >= m_idCmdCmFirst)
{
CMINVOKECOMMANDINFO cmici = { 0 };
@@ -3095,7 +3118,7 @@
/* Setup and invoke the shell command */
cmici.cbSize = sizeof(cmici);
cmici.hwnd = hWndOwner;
- cmici.lpVerb = (LPCSTR) MAKEINTRESOURCEW(uiCmdId -
ID_SHELL_CMD_FIRST);
+ cmici.lpVerb = (LPCSTR) MAKEINTRESOURCEW(uiCmdId - m_idCmdCmFirst);
cmici.nShow = SW_NORMAL;
pcm->InvokeCommand(&cmici);