mirror of
https://github.com/reactos/reactos.git
synced 2025-01-01 03:54:02 +00:00
[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. svn path=/trunk/; revision=75313
This commit is contained in:
parent
1c0aedce83
commit
0e8444a310
2 changed files with 66 additions and 43 deletions
|
@ -177,15 +177,15 @@
|
||||||
|
|
||||||
#define ID_SHELL_CMD_FIRST 0xF
|
#define ID_SHELL_CMD_FIRST 0xF
|
||||||
#define ID_SHELL_CMD_LAST 0x7FEF
|
#define ID_SHELL_CMD_LAST 0x7FEF
|
||||||
#define ID_SHELL_CMD_PROPERTIES (ID_SHELL_CMD_LAST + 1)
|
#define ID_SHELL_CMD_PROPERTIES (401)
|
||||||
#define ID_SHELL_CMD_OPEN_ALL_USERS (ID_SHELL_CMD_LAST + 2)
|
#define ID_SHELL_CMD_OPEN_ALL_USERS (402)
|
||||||
#define ID_SHELL_CMD_EXPLORE_ALL_USERS (ID_SHELL_CMD_LAST + 3)
|
#define ID_SHELL_CMD_EXPLORE_ALL_USERS (403)
|
||||||
#define ID_LOCKTASKBAR (ID_SHELL_CMD_LAST + 4)
|
#define ID_LOCKTASKBAR (404)
|
||||||
#define ID_SHELL_CMD_OPEN_TASKMGR (ID_SHELL_CMD_LAST + 5)
|
#define ID_SHELL_CMD_OPEN_TASKMGR (405)
|
||||||
#define ID_SHELL_CMD_UNDO_ACTION (ID_SHELL_CMD_LAST + 6)
|
#define ID_SHELL_CMD_UNDO_ACTION (406)
|
||||||
#define ID_SHELL_CMD_SHOW_DESKTOP (ID_SHELL_CMD_LAST + 7)
|
#define ID_SHELL_CMD_SHOW_DESKTOP (407)
|
||||||
#define ID_SHELL_CMD_TILE_WND_V (ID_SHELL_CMD_LAST + 8)
|
#define ID_SHELL_CMD_TILE_WND_V (408)
|
||||||
#define ID_SHELL_CMD_TILE_WND_H (ID_SHELL_CMD_LAST + 9)
|
#define ID_SHELL_CMD_TILE_WND_H (409)
|
||||||
#define ID_SHELL_CMD_CASCADE_WND (ID_SHELL_CMD_LAST + 10)
|
#define ID_SHELL_CMD_CASCADE_WND (410)
|
||||||
#define ID_SHELL_CMD_CUST_NOTIF (ID_SHELL_CMD_LAST + 11)
|
#define ID_SHELL_CMD_CUST_NOTIF (411)
|
||||||
#define ID_SHELL_CMD_ADJUST_DAT (ID_SHELL_CMD_LAST + 12)
|
#define ID_SHELL_CMD_ADJUST_DAT (412)
|
||||||
|
|
|
@ -190,7 +190,8 @@ class CTrayWindow :
|
||||||
public CWindowImpl < CTrayWindow, CWindow, CControlWinTraits >,
|
public CWindowImpl < CTrayWindow, CWindow, CControlWinTraits >,
|
||||||
public ITrayWindow,
|
public ITrayWindow,
|
||||||
public IShellDesktopTray,
|
public IShellDesktopTray,
|
||||||
public IOleWindow
|
public IOleWindow,
|
||||||
|
public IContextMenu
|
||||||
{
|
{
|
||||||
CStartButton m_StartButton;
|
CStartButton m_StartButton;
|
||||||
|
|
||||||
|
@ -198,6 +199,7 @@ class CTrayWindow :
|
||||||
CComPtr<IMenuPopup> m_StartMenuPopup;
|
CComPtr<IMenuPopup> m_StartMenuPopup;
|
||||||
|
|
||||||
CComPtr<IDeskBand> m_TaskBand;
|
CComPtr<IDeskBand> m_TaskBand;
|
||||||
|
CComPtr<IContextMenu> m_ContextMenu;
|
||||||
HTHEME m_Theme;
|
HTHEME m_Theme;
|
||||||
|
|
||||||
HFONT m_Font;
|
HFONT m_Font;
|
||||||
|
@ -2078,8 +2080,44 @@ ChangePos:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 @@ ChangePos:
|
||||||
{
|
{
|
||||||
HandleTrayContextMenu:
|
HandleTrayContextMenu:
|
||||||
/* Tray the default tray window context menu */
|
/* Tray the default tray window context menu */
|
||||||
CComPtr<IContextMenu> ctxMenu;
|
TrackCtxMenu(this, ppt, NULL, FALSE, this);
|
||||||
TrayWindowCtxMenuCreator(this, m_hWnd, &ctxMenu);
|
|
||||||
TrackCtxMenu(ctxMenu, ppt, NULL, FALSE, this);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Ret;
|
return Ret;
|
||||||
|
@ -2998,6 +3034,7 @@ HandleTrayContextMenu:
|
||||||
/*COM_INTERFACE_ENTRY_IID(IID_ITrayWindow, ITrayWindow)*/
|
/*COM_INTERFACE_ENTRY_IID(IID_ITrayWindow, ITrayWindow)*/
|
||||||
COM_INTERFACE_ENTRY_IID(IID_IShellDesktopTray, IShellDesktopTray)
|
COM_INTERFACE_ENTRY_IID(IID_IShellDesktopTray, IShellDesktopTray)
|
||||||
COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow)
|
COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow)
|
||||||
|
COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
|
||||||
END_COM_MAP()
|
END_COM_MAP()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3009,12 +3046,14 @@ class CTrayWindowCtxMenu :
|
||||||
HWND hWndOwner;
|
HWND hWndOwner;
|
||||||
CComPtr<CTrayWindow> TrayWnd;
|
CComPtr<CTrayWindow> TrayWnd;
|
||||||
CComPtr<IContextMenu> pcm;
|
CComPtr<IContextMenu> pcm;
|
||||||
|
UINT m_idCmdCmFirst;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
HRESULT Initialize(ITrayWindow * pTrayWnd, IN HWND hWndOwner)
|
HRESULT Initialize(ITrayWindow * pTrayWnd, IN HWND hWndOwner)
|
||||||
{
|
{
|
||||||
this->TrayWnd = (CTrayWindow *) pTrayWnd;
|
this->TrayWnd = (CTrayWindow *) pTrayWnd;
|
||||||
this->hWndOwner = hWndOwner;
|
this->hWndOwner = hWndOwner;
|
||||||
|
this->m_idCmdCmFirst = 0;
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3026,31 +3065,9 @@ public:
|
||||||
UINT uFlags)
|
UINT uFlags)
|
||||||
{
|
{
|
||||||
HMENU menubase = LoadPopupMenu(hExplorerInstance, MAKEINTRESOURCEW(IDM_TRAYWND));
|
HMENU menubase = LoadPopupMenu(hExplorerInstance, MAKEINTRESOURCEW(IDM_TRAYWND));
|
||||||
|
|
||||||
if (!menubase)
|
if (!menubase)
|
||||||
return HRESULT_FROM_WIN32(GetLastError());
|
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)
|
if (SHRestricted(REST_CLASSICSHELL) != 0)
|
||||||
{
|
{
|
||||||
DeleteMenu(hPopup,
|
DeleteMenu(hPopup,
|
||||||
|
@ -3062,13 +3079,19 @@ public:
|
||||||
ID_LOCKTASKBAR,
|
ID_LOCKTASKBAR,
|
||||||
MF_BYCOMMAND | (TrayWnd->Locked ? MF_CHECKED : MF_UNCHECKED));
|
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 (TrayWnd->m_TrayBandSite != NULL)
|
||||||
{
|
{
|
||||||
if (FAILED(TrayWnd->m_TrayBandSite->AddContextMenus(
|
if (FAILED(TrayWnd->m_TrayBandSite->AddContextMenus(
|
||||||
hPopup,
|
hPopup,
|
||||||
0,
|
indexMenu,
|
||||||
ID_SHELL_CMD_FIRST,
|
idCmdNext,
|
||||||
ID_SHELL_CMD_LAST,
|
idCmdLast,
|
||||||
CMF_NORMAL,
|
CMF_NORMAL,
|
||||||
&pcm)))
|
&pcm)))
|
||||||
{
|
{
|
||||||
|
@ -3086,7 +3109,7 @@ public:
|
||||||
UINT uiCmdId = (UINT) lpici->lpVerb;
|
UINT uiCmdId = (UINT) lpici->lpVerb;
|
||||||
if (uiCmdId != 0)
|
if (uiCmdId != 0)
|
||||||
{
|
{
|
||||||
if (uiCmdId >= ID_SHELL_CMD_FIRST && uiCmdId <= ID_SHELL_CMD_LAST)
|
if (uiCmdId >= m_idCmdCmFirst)
|
||||||
{
|
{
|
||||||
CMINVOKECOMMANDINFO cmici = { 0 };
|
CMINVOKECOMMANDINFO cmici = { 0 };
|
||||||
|
|
||||||
|
@ -3095,7 +3118,7 @@ public:
|
||||||
/* Setup and invoke the shell command */
|
/* Setup and invoke the shell command */
|
||||||
cmici.cbSize = sizeof(cmici);
|
cmici.cbSize = sizeof(cmici);
|
||||||
cmici.hwnd = hWndOwner;
|
cmici.hwnd = hWndOwner;
|
||||||
cmici.lpVerb = (LPCSTR) MAKEINTRESOURCEW(uiCmdId - ID_SHELL_CMD_FIRST);
|
cmici.lpVerb = (LPCSTR) MAKEINTRESOURCEW(uiCmdId - m_idCmdCmFirst);
|
||||||
cmici.nShow = SW_NORMAL;
|
cmici.nShow = SW_NORMAL;
|
||||||
|
|
||||||
pcm->InvokeCommand(&cmici);
|
pcm->InvokeCommand(&cmici);
|
||||||
|
|
Loading…
Reference in a new issue