* Fix some more C-style casts, and misc coding style changes.
* CMenuBand: Create a skeleton of the functions that would handle SMIF_TRACKPOPUP submenus.
* CMenuDeskBar: Fix the redraw issue that prevented submenus from working as expected.
CORE-7886

svn path=/branches/shell-experiments/; revision=62248
This commit is contained in:
David Quintana 2014-02-18 18:18:08 +00:00
parent 7c921822b4
commit f1281f1369
5 changed files with 100 additions and 51 deletions

View file

@ -402,7 +402,7 @@ LRESULT CALLBACK CDesktopBrowser::ProgmanWindowProc(IN HWND hwnd, IN UINT uMsg,
switch (uMsg) switch (uMsg)
{ {
case WM_ERASEBKGND: case WM_ERASEBKGND:
return (LRESULT) PaintDesktop((HDC) wParam); return (LRESULT) PaintDesktop(reinterpret_cast<HDC>(wParam));
case WM_GETISHELLBROWSER: case WM_GETISHELLBROWSER:
Ret = reinterpret_cast<LRESULT>(static_cast<IShellBrowser *>(pThis)); Ret = reinterpret_cast<LRESULT>(static_cast<IShellBrowser *>(pThis));
@ -456,7 +456,7 @@ LRESULT CALLBACK CDesktopBrowser::ProgmanWindowProc(IN HWND hwnd, IN UINT uMsg,
case WM_NCCREATE: case WM_NCCREATE:
{ {
LPCREATESTRUCT CreateStruct = (LPCREATESTRUCT) lParam; LPCREATESTRUCT CreateStruct = reinterpret_cast<LPCREATESTRUCT>(lParam);
pThis = SHDESK_Create(hwnd, CreateStruct); pThis = SHDESK_Create(hwnd, CreateStruct);
if (pThis == NULL) if (pThis == NULL)
{ {
@ -466,7 +466,7 @@ LRESULT CALLBACK CDesktopBrowser::ProgmanWindowProc(IN HWND hwnd, IN UINT uMsg,
SetWindowLongPtrW(hwnd, SetWindowLongPtrW(hwnd,
0, 0,
(LONG_PTR) pThis); reinterpret_cast<LONG_PTR>(pThis));
Ret = TRUE; Ret = TRUE;
break; break;
} }
@ -543,7 +543,7 @@ HANDLE WINAPI SHCreateDesktop(IShellDesktopTray *ShellDesk)
hWndDesk = CreateWindowExW(0, szProgmanClassName, szProgmanWindowName, hWndDesk = CreateWindowExW(0, szProgmanClassName, szProgmanWindowName,
WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
rcDesk.left, rcDesk.top, rcDesk.right, rcDesk.bottom, rcDesk.left, rcDesk.top, rcDesk.right, rcDesk.bottom,
NULL, NULL, shell32_hInstance, (LPVOID) ShellDesk); NULL, NULL, shell32_hInstance, reinterpret_cast<LPVOID>(ShellDesk));
if (hWndDesk != NULL) if (hWndDesk != NULL)
return (HANDLE) GetWindowLongPtrW(hWndDesk, 0); return (HANDLE) GetWindowLongPtrW(hWndDesk, 0);

View file

@ -23,7 +23,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(CMenuBand); WINE_DEFAULT_DEBUG_CHANNEL(CMenuBand);
#define WRAP_LOG 1 #define WRAP_LOG 0
#define TBSTYLE_EX_VERTICAL 4 #define TBSTYLE_EX_VERTICAL 4
@ -56,6 +56,7 @@ public:
HRESULT OnHotItemChange(const NMTBHOTITEM * hot); HRESULT OnHotItemChange(const NMTBHOTITEM * hot);
HRESULT PopupSubMenu(UINT index, IShellMenu* childShellMenu); HRESULT PopupSubMenu(UINT index, IShellMenu* childShellMenu);
HRESULT PopupSubMenu(UINT index, HMENU menu);
HRESULT DoContextMenu(IContextMenu* contextMenu); HRESULT DoContextMenu(IContextMenu* contextMenu);
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);
@ -68,7 +69,7 @@ protected:
CMenuBand *m_menuBand; CMenuBand *m_menuBand;
HWND m_hwnd; HWND m_hwnd;
DWORD m_dwMenuFlags; DWORD m_dwMenuFlags;
UINT m_hotItem; INT m_hotItem;
WNDPROC m_SubclassOld; WNDPROC m_SubclassOld;
}; };
@ -164,6 +165,7 @@ private:
DWORD m_dwFlags; DWORD m_dwFlags;
PVOID m_UserData; PVOID m_UserData;
HMENU m_hmenu; HMENU m_hmenu;
HWND m_menuOwner;
#endif #endif
BOOL m_useBigIcons; BOOL m_useBigIcons;
@ -254,6 +256,7 @@ public:
HRESULT CallCBWithId(UINT Id, UINT uMsg, WPARAM wParam, LPARAM lParam); HRESULT CallCBWithId(UINT Id, UINT uMsg, WPARAM wParam, LPARAM lParam);
HRESULT CallCBWithPidl(LPITEMIDLIST pidl, UINT uMsg, WPARAM wParam, LPARAM lParam); HRESULT CallCBWithPidl(LPITEMIDLIST pidl, UINT uMsg, WPARAM wParam, LPARAM lParam);
HRESULT TrackPopup(HMENU popup, INT x, INT y, RECT& rc);
BOOL UseBigIcons() { BOOL UseBigIcons() {
return m_useBigIcons; return m_useBigIcons;
@ -868,11 +871,11 @@ HRESULT CMenuToolbarBase::ShowWindow(BOOL fShow)
if (m_menuBand->UseBigIcons()) if (m_menuBand->UseBigIcons())
{ {
SendMessageW(m_hwnd, TB_SETIMAGELIST, 0, (LPARAM) ilBig); SendMessageW(m_hwnd, TB_SETIMAGELIST, 0, reinterpret_cast<LPARAM>(ilBig));
} }
else else
{ {
SendMessageW(m_hwnd, TB_SETIMAGELIST, 0, (LPARAM) ilSmall); SendMessageW(m_hwnd, TB_SETIMAGELIST, 0, reinterpret_cast<LPARAM>(ilSmall));
} }
return S_OK; return S_OK;
@ -934,15 +937,15 @@ HRESULT CMenuToolbarBase::CreateToolbar(HWND hwndParent, DWORD dwFlags)
//else //else
if (m_menuBand->UseBigIcons()) if (m_menuBand->UseBigIcons())
{ {
SendMessageW(m_hwnd, TB_SETIMAGELIST, 0, (LPARAM) ilBig); SendMessageW(m_hwnd, TB_SETIMAGELIST, 0, reinterpret_cast<LPARAM>(ilBig));
} }
else else
{ {
SendMessageW(m_hwnd, TB_SETIMAGELIST, 0, (LPARAM) ilSmall); SendMessageW(m_hwnd, TB_SETIMAGELIST, 0, reinterpret_cast<LPARAM>(ilSmall));
} }
SetWindowLongPtr(m_hwnd, GWLP_USERDATA, (LONG_PTR)this); SetWindowLongPtr(m_hwnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(this));
m_SubclassOld = (WNDPROC) SetWindowLongPtr(m_hwnd, GWLP_WNDPROC, (LONG_PTR) CMenuToolbarBase::s_SubclassProc); m_SubclassOld = (WNDPROC) SetWindowLongPtr(m_hwnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(CMenuToolbarBase::s_SubclassProc));
return S_OK; return S_OK;
} }
@ -1009,7 +1012,7 @@ HRESULT CMenuToolbarBase::PopupSubMenu(UINT index, IShellMenu* childShellMenu)
HRESULT hr; HRESULT hr;
RECT rc; RECT rc;
if (!SendMessage(m_hwnd, TB_GETITEMRECT, index, (LPARAM) &rc)) if (!SendMessage(m_hwnd, TB_GETITEMRECT, index, reinterpret_cast<LPARAM>(&rc)))
return E_FAIL; return E_FAIL;
POINT a = { rc.left, rc.top }; POINT a = { rc.left, rc.top };
@ -1062,6 +1065,27 @@ HRESULT CMenuToolbarBase::PopupSubMenu(UINT index, IShellMenu* childShellMenu)
return S_OK; return S_OK;
} }
HRESULT CMenuToolbarBase::PopupSubMenu(UINT index, HMENU menu)
{
RECT rc;
if (!SendMessage(m_hwnd, TB_GETITEMRECT, index, reinterpret_cast<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);
SetRect(&rc, a.x, a.y, b.x, b.y); // maybe-TODO: fetch client area of deskbar?
HMENU popup = GetSubMenu(menu, index);
m_menuBand->TrackPopup(popup, rc.right, rc.bottom, rc);
return S_OK;
}
HRESULT CMenuToolbarBase::DoContextMenu(IContextMenu* contextMenu) HRESULT CMenuToolbarBase::DoContextMenu(IContextMenu* contextMenu)
{ {
HRESULT hr; HRESULT hr;
@ -1174,11 +1198,13 @@ HRESULT CMenuStaticToolbar::FillToolbar()
tbb.iString = (INT_PTR) MenuString; tbb.iString = (INT_PTR) MenuString;
tbb.idCommand = info.wID; tbb.idCommand = info.wID;
SMINFO sminfo = { 0 }; SMINFO * sminfo = new SMINFO();
sminfo.dwMask = SMIM_ICON; sminfo->dwMask = SMIM_ICON | SMIM_FLAGS;
if (info.wID >= 0 && SUCCEEDED(m_menuBand->CallCBWithId(info.wID, SMC_GETINFO, 0, (LPARAM) &sminfo))) if (info.wID >= 0 && SUCCEEDED(m_menuBand->CallCBWithId(info.wID, SMC_GETINFO, 0, reinterpret_cast<LPARAM>(sminfo))))
{ {
tbb.iBitmap = sminfo.iIcon; tbb.iBitmap = sminfo->iIcon;
tbb.dwData = reinterpret_cast<DWORD_PTR>(sminfo);
// FIXME: remove before deleting the toolbar or it will leak
} }
} }
else else
@ -1186,7 +1212,7 @@ HRESULT CMenuStaticToolbar::FillToolbar()
tbb.fsStyle |= BTNS_SEP; tbb.fsStyle |= BTNS_SEP;
} }
SendMessageW(m_hwnd, TB_ADDBUTTONS, 1, (LPARAM) (LPTBBUTTON) &tbb); SendMessageW(m_hwnd, TB_ADDBUTTONS, 1, reinterpret_cast<LPARAM>(&tbb));
if (MenuString) if (MenuString)
HeapFree(GetProcessHeap(), 0, MenuString); HeapFree(GetProcessHeap(), 0, MenuString);
@ -1198,7 +1224,7 @@ HRESULT CMenuStaticToolbar::FillToolbar()
HRESULT CMenuStaticToolbar::OnContextMenu(NMMOUSE * rclick) HRESULT CMenuStaticToolbar::OnContextMenu(NMMOUSE * rclick)
{ {
CComPtr<IContextMenu> contextMenu; CComPtr<IContextMenu> contextMenu;
HRESULT hr = m_menuBand->CallCBWithId(rclick->dwItemSpec, SMC_GETOBJECT, (WPARAM) &IID_IContextMenu, (LPARAM) &contextMenu); HRESULT hr = m_menuBand->CallCBWithId(rclick->dwItemSpec, SMC_GETOBJECT, reinterpret_cast<WPARAM>(&IID_IContextMenu), reinterpret_cast<LPARAM>(&contextMenu));
if (hr != S_OK) if (hr != S_OK)
return hr; return hr;
@ -1216,19 +1242,30 @@ HRESULT CMenuStaticToolbar::OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *the
HRESULT CMenuStaticToolbar::PopupItem(UINT uItem) HRESULT CMenuStaticToolbar::PopupItem(UINT uItem)
{ {
CComPtr<IShellMenu> shellMenu;
HRESULT hr = m_menuBand->CallCBWithId(uItem, SMC_GETOBJECT, (WPARAM) &IID_IShellMenu, (LPARAM) &shellMenu);
if (FAILED(hr))
return hr;
TBBUTTONINFO info = { 0 }; TBBUTTONINFO info = { 0 };
info.cbSize = sizeof(TBBUTTONINFO); info.cbSize = sizeof(TBBUTTONINFO);
info.dwMask = 0; info.dwMask = 0;
int index = SendMessage(m_hwnd, TB_GETBUTTONINFO, uItem, (LPARAM) &info); int index = SendMessage(m_hwnd, TB_GETBUTTONINFO, uItem, reinterpret_cast<LPARAM>(&info));
if (index < 0) if (index < 0)
return E_FAIL; return E_FAIL;
TBBUTTON btn = { 0 };
SendMessage(m_hwnd, TB_GETBUTTON, index, reinterpret_cast<LPARAM>(&btn));
SMINFO * nfo = reinterpret_cast<SMINFO*>(btn.dwData);
if (nfo->dwFlags&SMIF_TRACKPOPUP)
{
return PopupSubMenu(index, m_hmenu);
}
else
{
CComPtr<IShellMenu> shellMenu;
HRESULT hr = m_menuBand->CallCBWithId(uItem, SMC_GETOBJECT, reinterpret_cast<WPARAM>(&IID_IShellMenu), reinterpret_cast<LPARAM>(&shellMenu));
if (FAILED(hr))
return hr;
return PopupSubMenu(index, shellMenu); return PopupSubMenu(index, shellMenu);
}
} }
HRESULT CMenuStaticToolbar::HasSubMenu(UINT uItem) HRESULT CMenuStaticToolbar::HasSubMenu(UINT uItem)
@ -1236,7 +1273,7 @@ HRESULT CMenuStaticToolbar::HasSubMenu(UINT uItem)
TBBUTTONINFO info = { 0 }; TBBUTTONINFO info = { 0 };
info.cbSize = sizeof(TBBUTTONINFO); info.cbSize = sizeof(TBBUTTONINFO);
info.dwMask = 0; info.dwMask = 0;
int index = SendMessage(m_hwnd, TB_GETBUTTONINFO, uItem, (LPARAM) &info); int index = SendMessage(m_hwnd, TB_GETBUTTONINFO, uItem, reinterpret_cast<LPARAM>(&info));
if (index < 0) if (index < 0)
return E_FAIL; return E_FAIL;
return ::GetSubMenu(m_hmenu, index) ? S_OK : S_FALSE; return ::GetSubMenu(m_hmenu, index) ? S_OK : S_FALSE;
@ -1265,7 +1302,7 @@ HRESULT CMenuSFToolbar::FillToolbar()
IEnumIDList * eidl; IEnumIDList * eidl;
m_shellFolder->EnumObjects(m_hwnd, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &eidl); m_shellFolder->EnumObjects(m_hwnd, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &eidl);
LPITEMIDLIST item = (LPITEMIDLIST) CoTaskMemAlloc(sizeof(ITEMIDLIST)); LPITEMIDLIST item = static_cast<LPITEMIDLIST>(CoTaskMemAlloc(sizeof(ITEMIDLIST)));
ULONG fetched; ULONG fetched;
while ((hr = eidl->Next(1, &item, &fetched)) == S_OK) while ((hr = eidl->Next(1, &item, &fetched)) == S_OK)
{ {
@ -1292,9 +1329,10 @@ HRESULT CMenuSFToolbar::FillToolbar()
tbb.idCommand = i++; tbb.idCommand = i++;
tbb.iString = (INT_PTR) MenuString; tbb.iString = (INT_PTR) MenuString;
tbb.iBitmap = index; tbb.iBitmap = index;
tbb.dwData = (DWORD_PTR) ILClone(item); tbb.dwData = reinterpret_cast<DWORD_PTR>(ILClone(item));
// FIXME: remove before deleting the toolbar or it will leak
SendMessageW(m_hwnd, TB_ADDBUTTONS, 1, (LPARAM) (LPTBBUTTON) &tbb); SendMessageW(m_hwnd, TB_ADDBUTTONS, 1, reinterpret_cast<LPARAM>(&tbb));
HeapFree(GetProcessHeap(), 0, MenuString); HeapFree(GetProcessHeap(), 0, MenuString);
} }
@ -1348,7 +1386,7 @@ LPITEMIDLIST CMenuSFToolbar::GetPidlFromId(UINT uItem, INT* pIndex)
TBBUTTONINFO info = { 0 }; TBBUTTONINFO info = { 0 };
info.cbSize = sizeof(TBBUTTONINFO); info.cbSize = sizeof(TBBUTTONINFO);
info.dwMask = 0; info.dwMask = 0;
int index = SendMessage(m_hwnd, TB_GETBUTTONINFO, uItem, (LPARAM) &info); int index = SendMessage(m_hwnd, TB_GETBUTTONINFO, uItem, reinterpret_cast<LPARAM>(&info));
if (index < 0) if (index < 0)
return NULL; return NULL;
@ -1356,10 +1394,10 @@ LPITEMIDLIST CMenuSFToolbar::GetPidlFromId(UINT uItem, INT* pIndex)
*pIndex = index; *pIndex = index;
TBBUTTON btn = { 0 }; TBBUTTON btn = { 0 };
if (!SendMessage(m_hwnd, TB_GETBUTTON, index, (LPARAM) &btn)) if (!SendMessage(m_hwnd, TB_GETBUTTON, index, reinterpret_cast<LPARAM>(&btn)))
return NULL; return NULL;
return (LPITEMIDLIST) btn.dwData; return reinterpret_cast<LPITEMIDLIST>(btn.dwData);
} }
HRESULT CMenuSFToolbar::OnContextMenu(NMMOUSE * rclick) HRESULT CMenuSFToolbar::OnContextMenu(NMMOUSE * rclick)
@ -1479,7 +1517,7 @@ HRESULT STDMETHODCALLTYPE CMenuBand::Initialize(
{ {
m_psmc->AddRef(); m_psmc->AddRef();
_CallCB(SMC_CREATE, 0, (LPARAM) &m_UserData); _CallCB(SMC_CREATE, 0, reinterpret_cast<LPARAM>(&m_UserData));
} }
return S_OK; return S_OK;
@ -1518,6 +1556,7 @@ HRESULT STDMETHODCALLTYPE CMenuBand::SetMenu(
m_staticToolbar = new CMenuStaticToolbar(this); m_staticToolbar = new CMenuStaticToolbar(this);
} }
m_hmenu = hmenu; m_hmenu = hmenu;
m_menuOwner;
HRESULT hResult = m_staticToolbar->SetMenu(hmenu, hwnd, dwFlags); HRESULT hResult = m_staticToolbar->SetMenu(hmenu, hwnd, dwFlags);
if (FAILED(hResult)) if (FAILED(hResult))
@ -1635,8 +1674,8 @@ HRESULT STDMETHODCALLTYPE CMenuBand::OnPosRectChangeDB(RECT *prc)
if (hwndStatic == NULL && hwndShlFld == NULL) if (hwndStatic == NULL && hwndShlFld == NULL)
return E_FAIL; return E_FAIL;
if (hwndStatic) SendMessageW(hwndStatic, TB_GETIDEALSIZE, TRUE, (LPARAM) &sizeStaticY); if (hwndStatic) SendMessageW(hwndStatic, TB_GETIDEALSIZE, TRUE, reinterpret_cast<LPARAM>(&sizeStaticY));
if (hwndShlFld) SendMessageW(hwndShlFld, TB_GETIDEALSIZE, TRUE, (LPARAM) &sizeShlFldY); if (hwndShlFld) SendMessageW(hwndShlFld, TB_GETIDEALSIZE, TRUE, reinterpret_cast<LPARAM>(&sizeShlFldY));
int sy = max(prc->bottom - prc->top, sizeStaticY.cy + sizeShlFldY.cy); int sy = max(prc->bottom - prc->top, sizeStaticY.cy + sizeShlFldY.cy);
@ -1699,8 +1738,8 @@ HRESULT STDMETHODCALLTYPE CMenuBand::GetBandInfo(
SIZE sizeStatic = { 0 }; SIZE sizeStatic = { 0 };
SIZE sizeShlFld = { 0 }; SIZE sizeShlFld = { 0 };
if (hwndStatic) SendMessageW(hwndStatic, TB_GETIDEALSIZE, TRUE, (LPARAM) &sizeStatic); if (hwndStatic) SendMessageW(hwndStatic, TB_GETIDEALSIZE, TRUE, reinterpret_cast<LPARAM>(&sizeStatic));
if (hwndShlFld) SendMessageW(hwndShlFld, TB_GETIDEALSIZE, TRUE, (LPARAM) &sizeShlFld); if (hwndShlFld) SendMessageW(hwndShlFld, TB_GETIDEALSIZE, TRUE, reinterpret_cast<LPARAM>(&sizeShlFld));
pdbi->ptMinSize.x = 0; pdbi->ptMinSize.x = 0;
pdbi->ptMinSize.y = sizeStatic.cy + sizeShlFld.cy; pdbi->ptMinSize.y = sizeStatic.cy + sizeShlFld.cy;
@ -1710,8 +1749,8 @@ HRESULT STDMETHODCALLTYPE CMenuBand::GetBandInfo(
SIZE sizeStatic = { 0 }; SIZE sizeStatic = { 0 };
SIZE sizeShlFld = { 0 }; SIZE sizeShlFld = { 0 };
if (hwndStatic) SendMessageW(hwndStatic, TB_GETMAXSIZE, 0, (LPARAM) &sizeStatic); if (hwndStatic) SendMessageW(hwndStatic, TB_GETMAXSIZE, 0, reinterpret_cast<LPARAM>(&sizeStatic));
if (hwndShlFld) SendMessageW(hwndShlFld, TB_GETMAXSIZE, 0, (LPARAM) &sizeShlFld); if (hwndShlFld) SendMessageW(hwndShlFld, TB_GETMAXSIZE, 0, reinterpret_cast<LPARAM>(&sizeShlFld));
pdbi->ptMaxSize.x = max(sizeStatic.cx, sizeShlFld.cx); // ignored pdbi->ptMaxSize.x = max(sizeStatic.cx, sizeShlFld.cx); // ignored
pdbi->ptMaxSize.y = sizeStatic.cy + sizeShlFld.cy; pdbi->ptMaxSize.y = sizeStatic.cy + sizeShlFld.cy;
@ -1726,12 +1765,12 @@ HRESULT STDMETHODCALLTYPE CMenuBand::GetBandInfo(
SIZE sizeStatic = { 0 }; SIZE sizeStatic = { 0 };
SIZE sizeShlFld = { 0 }; SIZE sizeShlFld = { 0 };
if (hwndStatic) SendMessageW(hwndStatic, TB_GETIDEALSIZE, FALSE, (LPARAM) &sizeStatic); if (hwndStatic) SendMessageW(hwndStatic, TB_GETIDEALSIZE, FALSE, reinterpret_cast<LPARAM>(&sizeStatic));
if (hwndShlFld) SendMessageW(hwndShlFld, TB_GETIDEALSIZE, FALSE, (LPARAM) &sizeShlFld); if (hwndShlFld) SendMessageW(hwndShlFld, TB_GETIDEALSIZE, FALSE, reinterpret_cast<LPARAM>(&sizeShlFld));
pdbi->ptActual.x = max(sizeStatic.cx, sizeShlFld.cx); pdbi->ptActual.x = max(sizeStatic.cx, sizeShlFld.cx);
if (hwndStatic) SendMessageW(hwndStatic, TB_GETIDEALSIZE, TRUE, (LPARAM) &sizeStatic); if (hwndStatic) SendMessageW(hwndStatic, TB_GETIDEALSIZE, TRUE, reinterpret_cast<LPARAM>(&sizeStatic));
if (hwndShlFld) SendMessageW(hwndShlFld, TB_GETIDEALSIZE, TRUE, (LPARAM) &sizeShlFld); if (hwndShlFld) SendMessageW(hwndShlFld, TB_GETIDEALSIZE, TRUE, reinterpret_cast<LPARAM>(&sizeShlFld));
pdbi->ptActual.y = sizeStatic.cy + sizeShlFld.cy; pdbi->ptActual.y = sizeStatic.cy + sizeShlFld.cy;
} }
if (pdbi->dwMask & DBIM_TITLE) if (pdbi->dwMask & DBIM_TITLE)
@ -2196,4 +2235,10 @@ HRESULT CMenuBand::_CallCB(UINT uMsg, WPARAM wParam, LPARAM lParam, UINT id, LPI
smData.psf->Release(); smData.psf->Release();
return hr; return hr;
} }
HRESULT CMenuBand::TrackPopup(HMENU popup, INT x, INT y, RECT& rc)
{
::TrackPopupMenu(popup, 0, x, y, 0, m_menuOwner, &rc);
return S_OK;
}
#endif #endif

View file

@ -24,7 +24,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(CMenuDeskBar); WINE_DEFAULT_DEBUG_CHANNEL(CMenuDeskBar);
#define WRAP_LOG 1 #define WRAP_LOG 0
typedef CWinTraits< typedef CWinTraits<
WS_POPUP | WS_DLGFRAME | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, WS_POPUP | WS_DLGFRAME | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
@ -680,7 +680,7 @@ LRESULT CMenuDeskBar::OnWindowPosChanged(UINT uMsg, WPARAM wParam, LPARAM lParam
LRESULT CMenuDeskBar::OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) LRESULT CMenuDeskBar::OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{ {
TRACE("OnPaint\n"); bHandled = FALSE;
if (m_Banner && !m_IconSize) if (m_Banner && !m_IconSize)
{ {
@ -716,7 +716,7 @@ LRESULT CMenuDeskBar::OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHa
EndPaint(&ps); EndPaint(&ps);
} }
return 0; return TRUE;
} }
HRESULT STDMETHODCALLTYPE CMenuDeskBar::Popup(POINTL *ppt, RECTL *prcExclude, MP_POPUPFLAGS dwFlags) HRESULT STDMETHODCALLTYPE CMenuDeskBar::Popup(POINTL *ppt, RECTL *prcExclude, MP_POPUPFLAGS dwFlags)
@ -849,7 +849,7 @@ HRESULT STDMETHODCALLTYPE CMenuDeskBar::OnSelect(
case MPOS_EXECUTE: case MPOS_EXECUTE:
bubbleUp = true; bubbleUp = true;
cancel = true; cancel = true;
// fall through break;
case MPOS_CANCELLEVEL: case MPOS_CANCELLEVEL:
cancel = true; cancel = true;
break; break;
@ -857,9 +857,9 @@ HRESULT STDMETHODCALLTYPE CMenuDeskBar::OnSelect(
case MPOS_SELECTRIGHT: case MPOS_SELECTRIGHT:
// if unhandled, spread upwards? // if unhandled, spread upwards?
bubbleUp = true; bubbleUp = true;
return S_OK; break;
case MPOS_CHILDTRACKING: case MPOS_CHILDTRACKING:
return S_OK; break;
} }
if (cancel) if (cancel)

View file

@ -24,6 +24,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(menusite); WINE_DEFAULT_DEBUG_CHANNEL(menusite);
#if 0
bool _assert(bool cond, LPCSTR expr, LPCSTR file, DWORD line, LPCSTR func) bool _assert(bool cond, LPCSTR expr, LPCSTR file, DWORD line, LPCSTR func)
{ {
#if DBG #if DBG
@ -36,6 +37,9 @@ bool _assert(bool cond, LPCSTR expr, LPCSTR file, DWORD line, LPCSTR func)
return cond; return cond;
} }
#define DBGASSERT(x) _assert(!!(x), #x, __FILE__, __LINE__, __FUNCSIG__) #define DBGASSERT(x) _assert(!!(x), #x, __FILE__, __LINE__, __FUNCSIG__)
#else
#define DBGASSERT(x) (!!(x))
#endif
class CMenuSite : class CMenuSite :
public CComObjectRootEx<CComMultiThreadModelNoCS>, public CComObjectRootEx<CComMultiThreadModelNoCS>,

View file

@ -18,7 +18,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#define TEST_TRACKPOPUPMENU_SUBMENUS //#define TEST_TRACKPOPUPMENU_SUBMENUS
#include "precomp.h" #include "precomp.h"