* Fixed the context menu for shell items.
* Some more code style improvements.
* Moved the toggles between using system classes and rshell classes into the constructor functions, so the code is easier to read.
CORE-7586

svn path=/branches/shell-experiments/; revision=62752
This commit is contained in:
David Quintana 2014-04-15 10:08:08 +00:00
parent 9b472f38cb
commit ba203171e1
6 changed files with 151 additions and 150 deletions

View file

@ -35,6 +35,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(CMenuBand);
extern "C" extern "C"
HRESULT WINAPI CMenuBand_Constructor(REFIID riid, LPVOID *ppv) HRESULT WINAPI CMenuBand_Constructor(REFIID riid, LPVOID *ppv)
{ {
#if USE_SYSTEM_MENUBAND
hr = CoCreateInstance(CLSID_MenuBand,
NULL,
CLSCTX_INPROC_SERVER,
riid, ppv);
#else
*ppv = NULL; *ppv = NULL;
CMenuBand * site = new CComObject<CMenuBand>(); CMenuBand * site = new CComObject<CMenuBand>();
@ -48,6 +54,7 @@ HRESULT WINAPI CMenuBand_Constructor(REFIID riid, LPVOID *ppv)
site->Release(); site->Release();
return hr; return hr;
#endif
} }
CMenuBand::CMenuBand() : CMenuBand::CMenuBand() :
@ -687,18 +694,11 @@ HRESULT CMenuBand::_CallCB(UINT uMsg, WPARAM wParam, LPARAM lParam, UINT id, LPI
HRESULT CMenuBand::_TrackSubMenu(HMENU popup, INT x, INT y, RECT& rcExclude) HRESULT CMenuBand::_TrackSubMenu(HMENU popup, INT x, INT y, RECT& rcExclude)
{ {
TPMPARAMS params = { sizeof(TPMPARAMS), rcExclude }; TPMPARAMS params = { sizeof(TPMPARAMS), rcExclude };
UINT flags = TPM_VERPOSANIMATION | TPM_VERTICAL | TPM_LEFTALIGN;
UINT flags = TPM_VERPOSANIMATION | TPM_VERTICAL | TPM_LEFTALIGN; HWND hwnd = m_menuOwner ? m_menuOwner : m_topLevelWindow;
m_focusManager->PushTrackedPopup(popup); m_focusManager->PushTrackedPopup(popup);
if (m_menuOwner) ::TrackPopupMenuEx(popup, flags, x, y, hwnd, &params);
{
::TrackPopupMenuEx(popup, flags, x, y, m_menuOwner, &params);
}
else
{
::TrackPopupMenuEx(popup, flags, x, y, m_topLevelWindow, &params);
}
m_focusManager->PopTrackedPopup(popup); m_focusManager->PopTrackedPopup(popup);
_DisableMouseTrack(FALSE); _DisableMouseTrack(FALSE);
@ -715,27 +715,34 @@ HRESULT CMenuBand::_TrackContextMenu(IContextMenu * contextMenu, INT x, INT y)
if (popup == NULL) if (popup == NULL)
return E_FAIL; return E_FAIL;
DbgPrint("Before Query\n");
hr = contextMenu->QueryContextMenu(popup, 0, 0, UINT_MAX, CMF_NORMAL); hr = contextMenu->QueryContextMenu(popup, 0, 0, UINT_MAX, CMF_NORMAL);
if (FAILED_UNEXPECTEDLY(hr)) if (FAILED_UNEXPECTEDLY(hr))
{ {
DbgPrint("Query failed\n");
DestroyMenu(popup); DestroyMenu(popup);
return hr; return hr;
} }
HWND hwnd = m_menuOwner ? m_menuOwner : m_topLevelWindow; HWND hwnd = m_menuOwner ? m_menuOwner : m_topLevelWindow;
m_focusManager->PushTrackedPopup(popup); DbgPrint("Before Tracking\n");
uCommand = ::TrackPopupMenuEx(popup, TPM_RETURNCMD, x, y, m_menuOwner, NULL); uCommand = ::TrackPopupMenuEx(popup, TPM_RETURNCMD, x, y, hwnd, NULL);
m_focusManager->PopTrackedPopup(popup);
if (uCommand == 0) if (uCommand != 0)
return S_FALSE; {
DbgPrint("Before InvokeCommand\n");
CMINVOKECOMMANDINFO cmi = { 0 }; CMINVOKECOMMANDINFO cmi = { 0 };
cmi.cbSize = sizeof(cmi); cmi.cbSize = sizeof(cmi);
cmi.lpVerb = MAKEINTRESOURCEA(uCommand); cmi.lpVerb = MAKEINTRESOURCEA(uCommand);
cmi.hwnd = hwnd; cmi.hwnd = hwnd;
hr = contextMenu->InvokeCommand(&cmi); hr = contextMenu->InvokeCommand(&cmi);
}
else
{
DbgPrint("TrackPopupMenu failed. Code=%d, LastError=%d\n", uCommand, GetLastError());
hr = S_FALSE;
}
DestroyMenu(popup); DestroyMenu(popup);
return hr; return hr;
@ -787,7 +794,7 @@ HRESULT CMenuBand::_KeyboardItemChange(DWORD change)
if (!tb) if (!tb)
{ {
// If no hot item was selected // If no hot item was selected
// choose the first toolbar (prefer shell-folder, which will be positionedat the top) // choose the first toolbar (prefer shell-folder, which will be positioned at the top)
if (m_SFToolbar) if (m_SFToolbar)
tb = m_SFToolbar; tb = m_SFToolbar;
@ -895,26 +902,11 @@ HRESULT CMenuBand::_OnPopupSubMenu(IShellMenu * childShellMenu, POINTL * pAt, RE
IDeskBar* pDeskBar; IDeskBar* pDeskBar;
// Create the necessary objects // Create the necessary objects
#if USE_SYSTEM_MENUSITE
hr = CoCreateInstance(CLSID_MenuBandSite,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARG(IBandSite, &pBandSite));
#else
hr = CMenuSite_Constructor(IID_PPV_ARG(IBandSite, &pBandSite)); hr = CMenuSite_Constructor(IID_PPV_ARG(IBandSite, &pBandSite));
#endif
if (FAILED_UNEXPECTEDLY(hr)) if (FAILED_UNEXPECTEDLY(hr))
return hr; return hr;
#if USE_SYSTEM_MENUDESKBAR
hr = CoCreateInstance(CLSID_MenuDeskBar,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARG(IDeskBar, &pDeskBar));
#else
hr = CMenuDeskBar_Constructor(IID_PPV_ARG(IDeskBar, &pDeskBar)); hr = CMenuDeskBar_Constructor(IID_PPV_ARG(IDeskBar, &pDeskBar));
#endif
if (FAILED_UNEXPECTEDLY(hr)) if (FAILED_UNEXPECTEDLY(hr))
return hr; return hr;

View file

@ -30,6 +30,12 @@ const static GUID CGID_MenuDeskBar = { 0x5C9F0A12, 0x959E, 0x11D0, { 0xA3, 0xA4,
extern "C" extern "C"
HRESULT WINAPI CMenuDeskBar_Constructor(REFIID riid, LPVOID *ppv) HRESULT WINAPI CMenuDeskBar_Constructor(REFIID riid, LPVOID *ppv)
{ {
#if USE_SYSTEM_MENUDESKBAR
hr = CoCreateInstance(CLSID_MenuDeskBar,
NULL,
CLSCTX_INPROC_SERVER,
riid, ppv);
#else
*ppv = NULL; *ppv = NULL;
CMenuDeskBar * deskbar = new CComObject<CMenuDeskBar>(); CMenuDeskBar * deskbar = new CComObject<CMenuDeskBar>();
@ -43,6 +49,7 @@ HRESULT WINAPI CMenuDeskBar_Constructor(REFIID riid, LPVOID *ppv)
deskbar->Release(); deskbar->Release();
return hr; return hr;
#endif
} }
CMenuDeskBar::CMenuDeskBar() : CMenuDeskBar::CMenuDeskBar() :

View file

@ -28,6 +28,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(menusite);
extern "C" extern "C"
HRESULT WINAPI CMenuSite_Constructor(REFIID riid, LPVOID *ppv) HRESULT WINAPI CMenuSite_Constructor(REFIID riid, LPVOID *ppv)
{ {
#if USE_SYSTEM_MENUSITE
hr = CoCreateInstance(CLSID_MenuBandSite,
NULL,
CLSCTX_INPROC_SERVER,
riid, ppv);
#else
*ppv = NULL; *ppv = NULL;
CMenuSite * site = new CComObject<CMenuSite>(); CMenuSite * site = new CComObject<CMenuSite>();
@ -41,6 +47,7 @@ HRESULT WINAPI CMenuSite_Constructor(REFIID riid, LPVOID *ppv)
site->Release(); site->Release();
return hr; return hr;
#endif
} }
CMenuSite::CMenuSite() : CMenuSite::CMenuSite() :

View file

@ -539,7 +539,7 @@ HRESULT CMenuToolbarBase::OnGetInfoTip(NMTBGETINFOTIP * tip)
GetDataFromId(iItem, &index, &dwData); GetDataFromId(iItem, &index, &dwData);
return GetInfoTip(tip->pszText, tip->cchTextMax, iItem, index, dwData); return InternalGetTooltip(iItem, index, dwData, tip->pszText, tip->cchTextMax);
} }
HRESULT CMenuToolbarBase::OnPopupTimer(DWORD timerId) HRESULT CMenuToolbarBase::OnPopupTimer(DWORD timerId)
@ -784,13 +784,14 @@ HRESULT CMenuToolbarBase::PopupSubMenu(UINT iItem, UINT index, HMENU menu)
return S_OK; return S_OK;
} }
HRESULT CMenuToolbarBase::DoContextMenu(IContextMenu* contextMenu) HRESULT CMenuToolbarBase::TrackContextMenu(IContextMenu* contextMenu, POINT pt)
{ {
// Calculate the context menu position // Cancel submenus
DWORD dwPos = GetMessagePos(); m_menuBand->_KillPopupTimers();
POINT pt = { GET_X_LPARAM(dwPos), GET_Y_LPARAM(dwPos) }; if (m_popupBar)
m_menuBand->_CancelCurrentPopup();
// Display the submenu // Display the context menu
return m_menuBand->_TrackContextMenu(contextMenu, pt.x, pt.y); return m_menuBand->_TrackContextMenu(contextMenu, pt.x, pt.y);
} }
@ -827,7 +828,24 @@ HRESULT CMenuToolbarBase::OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theRe
if (FAILED_UNEXPECTEDLY(hr)) if (FAILED_UNEXPECTEDLY(hr))
return hr; return hr;
return OnCommandInternal(wParam, lParam, theResult); INT iItem = wParam;
INT index;
DWORD_PTR data;
GetDataFromId(iItem, &index, &data);
return InternalExecuteItem(iItem, index, data);
}
HRESULT CMenuToolbarBase::OnContextMenu(NMMOUSE * rclick)
{
INT iItem = rclick->dwItemSpec;
INT index = rclick->dwHitInfo;
DWORD_PTR data = rclick->dwItemData;
GetDataFromId(iItem, &index, &data);
return InternalContextMenu(iItem, index, data, rclick->pt);
} }
HRESULT CMenuToolbarBase::KeyboardItemChange(DWORD dwSelectType) HRESULT CMenuToolbarBase::KeyboardItemChange(DWORD dwSelectType)
@ -839,14 +857,6 @@ HRESULT CMenuToolbarBase::KeyboardItemChange(DWORD dwSelectType)
{ {
int count = SendMessage(m_hwndToolbar, TB_BUTTONCOUNT, 0, 0); int count = SendMessage(m_hwndToolbar, TB_BUTTONCOUNT, 0, 0);
if (m_hotItem >= 0)
{
TBBUTTONINFO info = { 0 };
info.cbSize = sizeof(TBBUTTONINFO);
info.dwMask = 0;
index = SendMessage(m_hwndToolbar, TB_GETBUTTONINFO, m_hotItem, reinterpret_cast<LPARAM>(&info));
}
if (dwSelectType == VK_HOME) if (dwSelectType == VK_HOME)
{ {
index = 0; index = 0;
@ -857,26 +867,37 @@ HRESULT CMenuToolbarBase::KeyboardItemChange(DWORD dwSelectType)
index = count - 1; index = count - 1;
dwSelectType = VK_UP; dwSelectType = VK_UP;
} }
else if (index < 0)
{
if (dwSelectType == VK_UP)
{
index = count - 1;
}
else if (dwSelectType == VK_DOWN)
{
index = 0;
}
}
else else
{ {
if (dwSelectType == VK_UP) if (m_hotItem >= 0)
{ {
index--; TBBUTTONINFO info = { 0 };
info.cbSize = sizeof(TBBUTTONINFO);
info.dwMask = 0;
index = SendMessage(m_hwndToolbar, TB_GETBUTTONINFO, m_hotItem, reinterpret_cast<LPARAM>(&info));
} }
else if (dwSelectType == VK_DOWN)
if (index < 0)
{ {
index++; if (dwSelectType == VK_UP)
{
index = count - 1;
}
else if (dwSelectType == VK_DOWN)
{
index = 0;
}
}
else
{
if (dwSelectType == VK_UP)
{
index--;
}
else if (dwSelectType == VK_DOWN)
{
index++;
}
} }
} }
@ -980,6 +1001,15 @@ HRESULT CMenuToolbarBase::AddPlaceholder()
return S_OK; return S_OK;
} }
HRESULT CMenuToolbarBase::ClearToolbar()
{
while (SendMessage(m_hwndToolbar, TB_DELETEBUTTON, 0, 0))
{
// empty;
}
return S_OK;
}
HRESULT CMenuToolbarBase::GetDataFromId(INT iItem, INT* pIndex, DWORD_PTR* pData) HRESULT CMenuToolbarBase::GetDataFromId(INT iItem, INT* pIndex, DWORD_PTR* pData)
{ {
if (pData) if (pData)
@ -1086,10 +1116,7 @@ HRESULT CMenuStaticToolbar::FillToolbar(BOOL clearFirst)
if (clearFirst) if (clearFirst)
{ {
while (SendMessage(m_hwndToolbar, TB_DELETEBUTTON, 0, 0)) ClearToolbar();
{
// empty;
}
} }
int count = 0; int count = 0;
@ -1141,7 +1168,7 @@ HRESULT CMenuStaticToolbar::FillToolbar(BOOL clearFirst)
return S_OK; return S_OK;
} }
HRESULT CMenuStaticToolbar::GetInfoTip(LPWSTR pszText, INT cchTextMax, INT iItem, INT index, DWORD_PTR dwData) HRESULT CMenuStaticToolbar::InternalGetTooltip(INT iItem, INT index, DWORD_PTR dwData, LPWSTR pszText, INT cchTextMax)
{ {
//SMINFO * info = reinterpret_cast<SMINFO*>(dwData); //SMINFO * info = reinterpret_cast<SMINFO*>(dwData);
UNIMPLEMENTED; UNIMPLEMENTED;
@ -1154,19 +1181,20 @@ HRESULT CMenuStaticToolbar::OnDeletingButton(const NMTOOLBAR * tb)
return S_OK; return S_OK;
} }
HRESULT CMenuStaticToolbar::OnContextMenu(NMMOUSE * rclick) HRESULT CMenuStaticToolbar::InternalContextMenu(INT iItem, INT index, DWORD_PTR dwData, POINT pt)
{ {
CComPtr<IContextMenu> contextMenu; CComPtr<IContextMenu> contextMenu;
HRESULT hr = m_menuBand->_CallCBWithItemId(rclick->dwItemSpec, SMC_GETOBJECT, reinterpret_cast<WPARAM>(&IID_IContextMenu), reinterpret_cast<LPARAM>(&contextMenu)); HRESULT hr = m_menuBand->_CallCBWithItemId(iItem, SMC_GETOBJECT,
reinterpret_cast<WPARAM>(&IID_IContextMenu), reinterpret_cast<LPARAM>(&contextMenu));
if (hr != S_OK) if (hr != S_OK)
return hr; return hr;
return DoContextMenu(contextMenu); return TrackContextMenu(contextMenu, pt);
} }
HRESULT CMenuStaticToolbar::OnCommandInternal(WPARAM wParam, LPARAM lParam, LRESULT *theResult) HRESULT CMenuStaticToolbar::InternalExecuteItem(INT iItem, INT index, DWORD_PTR data)
{ {
return m_menuBand->_CallCBWithItemId(wParam, SMC_EXEC, 0, 0); return m_menuBand->_CallCBWithItemId(iItem, SMC_EXEC, 0, 0);
} }
HRESULT CMenuStaticToolbar::InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData) HRESULT CMenuStaticToolbar::InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData)
@ -1214,7 +1242,7 @@ HRESULT CMenuSFToolbar::FillToolbar(BOOL clearFirst)
PWSTR MenuString; PWSTR MenuString;
IEnumIDList * eidl; IEnumIDList * eidl;
m_shellFolder->EnumObjects(m_hwndToolbar, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &eidl); m_shellFolder->EnumObjects(GetToolbar(), SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &eidl);
LPITEMIDLIST item = static_cast<LPITEMIDLIST>(CoTaskMemAlloc(sizeof(ITEMIDLIST))); LPITEMIDLIST item = static_cast<LPITEMIDLIST>(CoTaskMemAlloc(sizeof(ITEMIDLIST)));
ULONG fetched; ULONG fetched;
@ -1259,7 +1287,7 @@ HRESULT CMenuSFToolbar::FillToolbar(BOOL clearFirst)
return hr; return hr;
} }
HRESULT CMenuSFToolbar::GetInfoTip(LPWSTR pszText, INT cchTextMax, INT iItem, INT index, DWORD_PTR dwData) HRESULT CMenuSFToolbar::InternalGetTooltip(INT iItem, INT index, DWORD_PTR dwData, LPWSTR pszText, INT cchTextMax)
{ {
//ITEMIDLIST * pidl = reinterpret_cast<LPITEMIDLIST>(dwData); //ITEMIDLIST * pidl = reinterpret_cast<LPITEMIDLIST>(dwData);
UNIMPLEMENTED; UNIMPLEMENTED;
@ -1312,25 +1340,27 @@ HRESULT CMenuSFToolbar::GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REF
return hr; return hr;
} }
HRESULT CMenuSFToolbar::OnContextMenu(NMMOUSE * rclick) HRESULT CMenuSFToolbar::InternalContextMenu(INT iItem, INT index, DWORD_PTR dwData, POINT pt)
{ {
HRESULT hr; HRESULT hr;
CComPtr<IContextMenu> contextMenu; CComPtr<IContextMenu> contextMenu = NULL;
LPCITEMIDLIST pidl = reinterpret_cast<LPCITEMIDLIST>(rclick->dwItemData); LPCITEMIDLIST pidl = reinterpret_cast<LPCITEMIDLIST>(dwData);
hr = m_shellFolder->GetUIObjectOf(m_hwndToolbar, 1, &pidl, IID_IContextMenu, NULL, reinterpret_cast<VOID **>(&contextMenu)); #define IID_NULL_PPV_ARG(Itype, ppType) IID_##Itype, NULL, reinterpret_cast<void**>((static_cast<Itype**>(ppType)))
if (hr != S_OK)
hr = m_shellFolder->GetUIObjectOf(GetToolbar(), 1, &pidl, IID_NULL_PPV_ARG(IContextMenu, &contextMenu));
if (FAILED_UNEXPECTEDLY(hr))
{
return hr; return hr;
}
return DoContextMenu(contextMenu); hr = TrackContextMenu(contextMenu, pt);
return hr;
} }
HRESULT CMenuSFToolbar::OnCommandInternal(WPARAM wParam, LPARAM lParam, LRESULT *theResult) HRESULT CMenuSFToolbar::InternalExecuteItem(INT iItem, INT index, DWORD_PTR data)
{ {
DWORD_PTR data;
GetDataFromId(wParam, NULL, &data);
return m_menuBand->_CallCBWithItemPidl(reinterpret_cast<LPITEMIDLIST>(data), SMC_SFEXEC, 0, 0); return m_menuBand->_CallCBWithItemPidl(reinterpret_cast<LPITEMIDLIST>(data), SMC_SFEXEC, 0, 0);
} }
@ -1348,14 +1378,7 @@ HRESULT CMenuSFToolbar::InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData
if (!pidl) if (!pidl)
return E_FAIL; return E_FAIL;
#if USE_SYSTEM_MENUBAND
hr = CoCreateInstance(CLSID_MenuBand,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARG(IShellMenu, &shellMenu));
#else
hr = CMenuBand_Constructor(IID_PPV_ARG(IShellMenu, &shellMenu)); hr = CMenuBand_Constructor(IID_PPV_ARG(IShellMenu, &shellMenu));
#endif
if (FAILED_UNEXPECTEDLY(hr)) if (FAILED_UNEXPECTEDLY(hr))
return hr; return hr;

View file

@ -25,20 +25,19 @@ class CMenuFocusManager;
#define WM_USER_ISTRACKEDITEM (WM_APP+41) #define WM_USER_ISTRACKEDITEM (WM_APP+41)
#define WM_USER_CHANGETRACKEDITEM (WM_APP+42) #define WM_USER_CHANGETRACKEDITEM (WM_APP+42)
class CMenuToolbarBase class CMenuToolbarBase
{ {
private: private:
HWND m_hwnd; // May be the pager HWND m_hwnd; // May be the pager
HFONT m_marlett; HWND m_hwndToolbar;
BOOL m_useFlatMenus; HFONT m_marlett;
BOOL m_useFlatMenus;
WNDPROC m_SubclassOld; WNDPROC m_SubclassOld;
BOOL m_disableMouseTrack; BOOL m_disableMouseTrack;
BOOL m_timerEnabled; BOOL m_timerEnabled;
protected: protected:
CMenuBand * m_menuBand; CMenuBand * m_menuBand;
HWND m_hwndToolbar;
DWORD m_dwMenuFlags; DWORD m_dwMenuFlags;
BOOL m_hasSizes; BOOL m_hasSizes;
SIZE m_idealSize; SIZE m_idealSize;
@ -55,6 +54,8 @@ protected:
private: private:
static LRESULT CALLBACK s_SubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); static LRESULT CALLBACK s_SubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT SubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
public: public:
CMenuToolbarBase(CMenuBand *menuBand, BOOL usePager); CMenuToolbarBase(CMenuBand *menuBand, BOOL usePager);
virtual ~CMenuToolbarBase(); virtual ~CMenuToolbarBase();
@ -72,7 +73,7 @@ public:
HRESULT PopupSubMenu(UINT itemId, UINT index, IShellMenu* childShellMenu); HRESULT PopupSubMenu(UINT itemId, UINT index, IShellMenu* childShellMenu);
HRESULT PopupSubMenu(UINT itemId, UINT index, HMENU menu); HRESULT PopupSubMenu(UINT itemId, UINT index, HMENU menu);
HRESULT DoContextMenu(IContextMenu* contextMenu); HRESULT TrackContextMenu(IContextMenu* contextMenu, POINT pt);
HRESULT KeyboardItemChange(DWORD changeType); HRESULT KeyboardItemChange(DWORD changeType);
@ -87,7 +88,6 @@ public:
HRESULT DisableMouseTrack(BOOL bDisable); HRESULT DisableMouseTrack(BOOL bDisable);
virtual HRESULT FillToolbar(BOOL clearFirst=FALSE) = 0; virtual HRESULT FillToolbar(BOOL clearFirst=FALSE) = 0;
virtual HRESULT OnContextMenu(NMMOUSE * rclick) = 0;
HRESULT CancelCurrentPopup(); HRESULT CancelCurrentPopup();
HRESULT PopupItem(INT iItem); HRESULT PopupItem(INT iItem);
@ -96,26 +96,28 @@ public:
HRESULT KillPopupTimer(); HRESULT KillPopupTimer();
protected: protected:
virtual HRESULT OnCommandInternal(WPARAM wParam, LPARAM lParam, LRESULT *theResult) = 0;
virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb) = 0; virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb) = 0;
virtual HRESULT InternalGetTooltip(INT iItem, INT index, DWORD_PTR dwData, LPWSTR pszText, INT cchTextMax) = 0;
virtual HRESULT InternalExecuteItem(INT iItem, INT index, DWORD_PTR dwData) = 0;
virtual HRESULT InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData) = 0; virtual HRESULT InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData) = 0;
virtual HRESULT InternalHasSubMenu(INT iItem, INT index, DWORD_PTR dwData) = 0; virtual HRESULT InternalHasSubMenu(INT iItem, INT index, DWORD_PTR dwData) = 0;
virtual HRESULT InternalContextMenu(INT iItem, INT index, DWORD_PTR dwData, POINT pt) = 0;
virtual HRESULT GetInfoTip(LPWSTR pszText, INT cchTextMax, INT iItem, INT index, DWORD_PTR dwData)=0;
LRESULT CALLBACK SubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
HRESULT AddButton(DWORD commandId, LPCWSTR caption, BOOL hasSubMenu, INT iconId, DWORD_PTR buttonData, BOOL last); HRESULT AddButton(DWORD commandId, LPCWSTR caption, BOOL hasSubMenu, INT iconId, DWORD_PTR buttonData, BOOL last);
HRESULT AddSeparator(BOOL last); HRESULT AddSeparator(BOOL last);
HRESULT AddPlaceholder(); HRESULT AddPlaceholder();
HRESULT ClearToolbar();
HRESULT UpdateImageLists(); HWND GetToolbar() { return m_hwndToolbar; }
private: private:
HRESULT UpdateImageLists();
HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult); HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult);
HRESULT OnPagerCalcSize(LPNMPGCALCSIZE csize); HRESULT OnPagerCalcSize(LPNMPGCALCSIZE csize);
HRESULT OnPopupTimer(DWORD timerId); HRESULT OnPopupTimer(DWORD timerId);
HRESULT OnContextMenu(NMMOUSE * rclick);
HRESULT OnCustomDraw(LPNMTBCUSTOMDRAW cdraw, LRESULT * theResult); HRESULT OnCustomDraw(LPNMTBCUSTOMDRAW cdraw, LRESULT * theResult);
HRESULT OnGetInfoTip(NMTBGETINFOTIP * tip); HRESULT OnGetInfoTip(NMTBGETINFOTIP * tip);
}; };
@ -134,16 +136,15 @@ public:
HRESULT GetMenu(HMENU *phmenu, HWND *phwnd, DWORD *pdwFlags); HRESULT GetMenu(HMENU *phmenu, HWND *phwnd, DWORD *pdwFlags);
virtual HRESULT FillToolbar(BOOL clearFirst=FALSE); virtual HRESULT FillToolbar(BOOL clearFirst=FALSE);
virtual HRESULT OnCommandInternal(WPARAM wParam, LPARAM lParam, LRESULT *theResult);
virtual HRESULT OnContextMenu(NMMOUSE * rclick);
protected: protected:
virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb); virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb);
virtual HRESULT GetInfoTip(LPWSTR pszText, INT cchTextMax, INT iItem, INT index, DWORD_PTR dwData); virtual HRESULT InternalGetTooltip(INT iItem, INT index, DWORD_PTR dwData, LPWSTR pszText, INT cchTextMax);
virtual HRESULT InternalExecuteItem(INT iItem, INT index, DWORD_PTR dwData);
virtual HRESULT InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData); virtual HRESULT InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData);
virtual HRESULT InternalHasSubMenu(INT iItem, INT index, DWORD_PTR dwData); virtual HRESULT InternalHasSubMenu(INT iItem, INT index, DWORD_PTR dwData);
virtual HRESULT InternalContextMenu(INT iItem, INT index, DWORD_PTR dwData, POINT pt);
}; };
class CMenuSFToolbar : class CMenuSFToolbar :
@ -162,14 +163,13 @@ public:
HRESULT GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REFIID riid, void **ppv); HRESULT GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REFIID riid, void **ppv);
virtual HRESULT FillToolbar(BOOL clearFirst=FALSE); virtual HRESULT FillToolbar(BOOL clearFirst=FALSE);
virtual HRESULT OnCommandInternal(WPARAM wParam, LPARAM lParam, LRESULT *theResult);
virtual HRESULT OnContextMenu(NMMOUSE * rclick);
protected: protected:
virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb); virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb);
virtual HRESULT GetInfoTip(LPWSTR pszText, INT cchTextMax, INT iItem, INT index, DWORD_PTR dwData); virtual HRESULT InternalGetTooltip(INT iItem, INT index, DWORD_PTR dwData, LPWSTR pszText, INT cchTextMax);
virtual HRESULT InternalExecuteItem(INT iItem, INT index, DWORD_PTR dwData);
virtual HRESULT InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData); virtual HRESULT InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData);
virtual HRESULT InternalHasSubMenu(INT iItem, INT index, DWORD_PTR dwData); virtual HRESULT InternalHasSubMenu(INT iItem, INT index, DWORD_PTR dwData);
virtual HRESULT InternalContextMenu(INT iItem, INT index, DWORD_PTR dwData, POINT pt);
}; };

View file

@ -148,14 +148,7 @@ private:
case IDM_DOCUMENTS: csidl = CSIDL_RECENT; break; case IDM_DOCUMENTS: csidl = CSIDL_RECENT; break;
} }
#if USE_SYSTEM_MENUBAND
hr = CoCreateInstance(CLSID_MenuBand,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARG(IShellMenu, &pShellMenu));
#else
hr = CMenuBand_Constructor(IID_PPV_ARG(IShellMenu, &pShellMenu)); hr = CMenuBand_Constructor(IID_PPV_ARG(IShellMenu, &pShellMenu));
#endif
if (FAILED_UNEXPECTEDLY(hr)) if (FAILED_UNEXPECTEDLY(hr))
return hr; return hr;
@ -291,36 +284,15 @@ CStartMenu_Constructor(REFIID riid, void **ppv)
IShellFolder *psfStartMenuAll; IShellFolder *psfStartMenuAll;
#endif #endif
#if USE_SYSTEM_MENUBAND
hr = CoCreateInstance(CLSID_MenuBand,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARG(IShellMenu, &pShellMenu));
#else
hr = CMenuBand_Constructor(IID_PPV_ARG(IShellMenu, &pShellMenu)); hr = CMenuBand_Constructor(IID_PPV_ARG(IShellMenu, &pShellMenu));
#endif
if (FAILED_UNEXPECTEDLY(hr)) if (FAILED_UNEXPECTEDLY(hr))
return hr; return hr;
#if USE_SYSTEM_MENUSITE
hr = CoCreateInstance(CLSID_MenuBandSite,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARG(IBandSite, &pBandSite));
#else
hr = CMenuSite_Constructor(IID_PPV_ARG(IBandSite, &pBandSite)); hr = CMenuSite_Constructor(IID_PPV_ARG(IBandSite, &pBandSite));
#endif
if (FAILED_UNEXPECTEDLY(hr)) if (FAILED_UNEXPECTEDLY(hr))
return hr; return hr;
#if USE_SYSTEM_MENUDESKBAR
hr = CoCreateInstance(CLSID_MenuDeskBar,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARG(IDeskBar, &pDeskBar));
#else
hr = CMenuDeskBar_Constructor(IID_PPV_ARG(IDeskBar, &pDeskBar)); hr = CMenuDeskBar_Constructor(IID_PPV_ARG(IDeskBar, &pDeskBar));
#endif
if (FAILED_UNEXPECTEDLY(hr)) if (FAILED_UNEXPECTEDLY(hr))
return hr; return hr;