mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 22:33:00 +00:00
[RSHELL]
* CMenuBand: Improve the code structure. * Make the class selection better managed. Thanks Giannis. CORE-7881 svn path=/branches/shell-experiments/; revision=62231
This commit is contained in:
parent
3aaf437172
commit
d5f6a80f41
3 changed files with 77 additions and 74 deletions
|
@ -54,6 +54,8 @@ public:
|
|||
|
||||
HRESULT OnHotItemChange(const NMTBHOTITEM * hot);
|
||||
|
||||
HRESULT PopupSubMenu(UINT uItem, IShellMenu* childShellMenu);
|
||||
|
||||
static LRESULT CALLBACK s_SubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
protected:
|
||||
|
||||
|
@ -955,6 +957,72 @@ HRESULT CMenuToolbarBase::OnHotItemChange(const NMTBHOTITEM * hot)
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT CMenuToolbarBase::PopupSubMenu(UINT uItem, IShellMenu* childShellMenu)
|
||||
{
|
||||
RECT rc;
|
||||
TBBUTTONINFO info = { 0 };
|
||||
info.cbSize = sizeof(TBBUTTONINFO);
|
||||
info.dwMask = 0;
|
||||
int index = SendMessage(m_hwnd, TB_GETBUTTONINFO, uItem, (LPARAM) &info);
|
||||
if (index < 0)
|
||||
return E_FAIL;
|
||||
if (!SendMessage(m_hwnd, TB_GETITEMRECT, index, (LPARAM) &rc))
|
||||
return E_FAIL;
|
||||
|
||||
POINT a = { rc.left, rc.top };
|
||||
POINT b = { rc.right, rc.bottom };
|
||||
|
||||
ClientToScreen(m_hwnd, &a);
|
||||
ClientToScreen(m_hwnd, &b);
|
||||
|
||||
POINTL pt = { b.x, b.y };
|
||||
RECTL rcl = { a.x, a.y, b.x, b.y }; // maybe-TODO: fetch client area of deskbar?
|
||||
|
||||
IBandSite* pBandSite;
|
||||
IDeskBar* pDeskBar;
|
||||
|
||||
HRESULT hr;
|
||||
|
||||
#ifndef USE_BUILTIN_MENUSITE
|
||||
hr = CoCreateInstance(CLSID_MenuBandSite,
|
||||
NULL,
|
||||
CLSCTX_INPROC_SERVER,
|
||||
IID_PPV_ARG(IBandSite, &pBandSite));
|
||||
#else
|
||||
hr = CMenuSite_Constructor(IID_PPV_ARG(IBandSite, &pBandSite));
|
||||
#endif
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
#ifndef USE_BUILTIN_MENUDESKBAR
|
||||
hr = CoCreateInstance(CLSID_MenuDeskBar,
|
||||
NULL,
|
||||
CLSCTX_INPROC_SERVER,
|
||||
IID_PPV_ARG(IDeskBar, &pDeskBar));
|
||||
#else
|
||||
hr = CMenuDeskBar_Constructor(IID_PPV_ARG(IDeskBar, &pDeskBar));
|
||||
#endif
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
hr = pDeskBar->SetClient(pBandSite);
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
hr = pBandSite->AddBand(childShellMenu);
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
CComPtr<IMenuPopup> popup;
|
||||
hr = pDeskBar->QueryInterface(IID_PPV_ARG(IMenuPopup, &popup));
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
popup->Popup(&pt, &rcl, MPPF_TOP | MPPF_RIGHT);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
BOOL
|
||||
AllocAndGetMenuString(HMENU hMenu, UINT ItemIDByPosition, WCHAR** String)
|
||||
{
|
||||
|
@ -1058,38 +1126,12 @@ HRESULT CMenuStaticToolbar::OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *the
|
|||
|
||||
HRESULT CMenuStaticToolbar::PopupItem(UINT uItem)
|
||||
{
|
||||
RECT rc;
|
||||
TBBUTTONINFO info = { 0 };
|
||||
info.cbSize = sizeof(TBBUTTONINFO);
|
||||
info.dwMask = 0;
|
||||
int index = SendMessage(m_hwnd, TB_GETBUTTONINFO, uItem, (LPARAM) &info);
|
||||
if (index < 0)
|
||||
return E_FAIL;
|
||||
if (!SendMessage(m_hwnd, TB_GETITEMRECT, index, (LPARAM) &rc))
|
||||
return E_FAIL;
|
||||
|
||||
POINT a = { rc.left, rc.top };
|
||||
POINT b = { rc.right, rc.bottom };
|
||||
|
||||
ClientToScreen(m_hwnd, &a);
|
||||
ClientToScreen(m_hwnd, &b);
|
||||
|
||||
POINTL pt = { b.x, b.y };
|
||||
RECTL rcl = { a.x, a.y, b.x, b.y }; // maybe-TODO: fetch client area of deskbar?
|
||||
|
||||
CComPtr<IShellMenu> shellMenu;
|
||||
HRESULT hr = m_menuBand->CallCBWithId(uItem, SMC_GETOBJECT, (WPARAM) &IID_IShellMenu, (LPARAM) &shellMenu);
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
CComPtr<IMenuPopup> popup;
|
||||
hr = CSubMenu_Constructor(shellMenu, IID_PPV_ARG(IMenuPopup, &popup));
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
popup->Popup(&pt, &rcl, MPPF_TOP | MPPF_RIGHT);
|
||||
|
||||
return S_OK;
|
||||
return PopupSubMenu(uItem, shellMenu);
|
||||
}
|
||||
|
||||
HRESULT CMenuStaticToolbar::HasSubMenu(UINT uItem)
|
||||
|
|
|
@ -125,7 +125,7 @@ private:
|
|||
case IDM_DOCUMENTS: csidl = CSIDL_RECENT; break;
|
||||
}
|
||||
|
||||
#if 0
|
||||
#ifndef USE_BUILTIN_MENUBAND
|
||||
hr = CoCreateInstance(CLSID_MenuBand,
|
||||
NULL,
|
||||
CLSCTX_INPROC_SERVER,
|
||||
|
@ -262,7 +262,7 @@ CStartMenu_Constructor(
|
|||
IShellFolder *shellFolder;
|
||||
IShellFolder *psfStartMenu;
|
||||
|
||||
#if 0
|
||||
#ifndef USE_BUILTIN_MENUBAND
|
||||
hr = CoCreateInstance(CLSID_MenuBand,
|
||||
NULL,
|
||||
CLSCTX_INPROC_SERVER,
|
||||
|
@ -273,7 +273,7 @@ CStartMenu_Constructor(
|
|||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
#if 0
|
||||
#ifndef USE_BUILTIN_MENUSITE
|
||||
hr = CoCreateInstance(CLSID_MenuBandSite,
|
||||
NULL,
|
||||
CLSCTX_INPROC_SERVER,
|
||||
|
@ -284,7 +284,7 @@ CStartMenu_Constructor(
|
|||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
#if 0
|
||||
#ifndef USE_BUILTIN_MENUDESKBAR
|
||||
hr = CoCreateInstance(CLSID_MenuDeskBar,
|
||||
NULL,
|
||||
CLSCTX_INPROC_SERVER,
|
||||
|
@ -325,45 +325,3 @@ CStartMenu_Constructor(
|
|||
|
||||
return pDeskBar->QueryInterface(riid, ppv);
|
||||
}
|
||||
|
||||
extern "C"
|
||||
HRESULT
|
||||
CSubMenu_Constructor(IShellMenu * pShellMenu, REFIID riid, void **ppv)
|
||||
{
|
||||
IBandSite* pBandSite;
|
||||
IDeskBar* pDeskBar;
|
||||
|
||||
HRESULT hr;
|
||||
|
||||
#if 0
|
||||
hr = CoCreateInstance(CLSID_MenuBandSite,
|
||||
NULL,
|
||||
CLSCTX_INPROC_SERVER,
|
||||
IID_PPV_ARG(IBandSite, &pBandSite));
|
||||
#else
|
||||
hr = CMenuSite_Constructor(IID_PPV_ARG(IBandSite, &pBandSite));
|
||||
#endif
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
#if 0
|
||||
hr = CoCreateInstance(CLSID_MenuDeskBar,
|
||||
NULL,
|
||||
CLSCTX_INPROC_SERVER,
|
||||
IID_PPV_ARG(IDeskBar, &pDeskBar));
|
||||
#else
|
||||
hr = CMenuDeskBar_Constructor(IID_PPV_ARG(IDeskBar, &pDeskBar));
|
||||
#endif
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
hr = pDeskBar->SetClient(pBandSite);
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
hr = pBandSite->AddBand(pShellMenu);
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
return pDeskBar->QueryInterface(riid, ppv);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,8 @@
|
|||
|
||||
#define USE_BUILTIN_MENUDESKBAR
|
||||
#define USE_BUILTIN_MENUSITE
|
||||
#define USE_BUILTIN_MENUBAND
|
||||
|
||||
#include <stdio.h>
|
||||
#include <tchar.h>
|
||||
|
||||
|
@ -33,4 +37,3 @@ extern "C" INT WINAPI Shell_GetCachedImageIndex(LPCWSTR szPath, INT nIndex, UINT
|
|||
extern "C" HRESULT CMenuDeskBar_Constructor(REFIID riid, LPVOID *ppv);
|
||||
extern "C" HRESULT CMenuSite_Constructor(REFIID riid, LPVOID *ppv);
|
||||
extern "C" HRESULT CMenuBand_Constructor(REFIID riid, LPVOID *ppv);
|
||||
extern "C" HRESULT CSubMenu_Constructor(IShellMenu * pShellMenu, REFIID riid, void **ppv);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue