4 * Copyright 2014 David Quintana
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 WINE_DEFAULT_DEBUG_CHANNEL(CMenuBand
);
27 extern "C" BOOL WINAPI
Shell_GetImageLists(HIMAGELIST
* lpBigList
, HIMAGELIST
* lpSmallList
);
31 class CMenuToolbarBase
34 CMenuToolbarBase(CMenuBand
*menuBand
);
35 virtual ~CMenuToolbarBase() {}
37 HRESULT
CreateToolbar(HWND hwndParent
, DWORD dwFlags
);
38 HRESULT
GetWindow(HWND
*phwnd
);
39 HRESULT
ShowWindow(BOOL fShow
);
42 virtual HRESULT
FillToolbar() = 0;
43 virtual HRESULT
OnCommand(WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
) = 0;
47 static const UINT WM_USER_SHOWPOPUPMENU
= WM_USER
+ 1;
49 CMenuBand
*m_menuBand
;
54 class CMenuStaticToolbar
: public CMenuToolbarBase
57 CMenuStaticToolbar(CMenuBand
*menuBand
);
58 virtual ~CMenuStaticToolbar() {}
60 HRESULT
SetMenu(HMENU hmenu
, HWND hwnd
, DWORD dwFlags
);
61 HRESULT
GetMenu(HMENU
*phmenu
, HWND
*phwnd
, DWORD
*pdwFlags
);
63 virtual HRESULT
FillToolbar();
64 virtual HRESULT
OnCommand(WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
);
69 class CMenuSFToolbar
: public CMenuToolbarBase
72 CMenuSFToolbar(CMenuBand
*menuBand
);
73 virtual ~CMenuSFToolbar();
75 HRESULT
SetShellFolder(IShellFolder
*psf
, LPCITEMIDLIST pidlFolder
, HKEY hKey
, DWORD dwFlags
);
76 HRESULT
GetShellFolder(DWORD
*pdwFlags
, LPITEMIDLIST
*ppidl
, REFIID riid
, void **ppv
);
78 virtual HRESULT
FillToolbar();
79 virtual HRESULT
OnCommand(WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
);
84 IShellFolder
* m_shellFolder
;
85 LPCITEMIDLIST m_idList
;
90 public CComCoClass
<CMenuBand
>,
91 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
93 public IObjectWithSite
,
95 public IPersistStream
,
96 public IOleCommandTarget
,
97 public IServiceProvider
,
101 public IWinEventHandler
,
110 IUnknown
* m_IUnknown
;
111 IDeskBand
* m_IDeskBand
;
112 IDockingWindow
* m_IDockingWindow
;
113 IOleWindow
* m_IOleWindow
;
114 IObjectWithSite
* m_IObjectWithSite
;
115 IInputObject
* m_IInputObject
;
116 IPersistStream
* m_IPersistStream
;
117 IPersist
* m_IPersist
;
118 IOleCommandTarget
* m_IOleCommandTarget
;
119 IServiceProvider
* m_IServiceProvider
;
120 IMenuPopup
* m_IMenuPopup
;
121 IDeskBar
* m_IDeskBar
;
122 IMenuBand
* m_IMenuBand
;
123 IShellMenu2
* m_IShellMenu2
;
124 IShellMenu
* m_IShellMenu
;
125 IWinEventHandler
* m_IWinEventHandler
;
126 IShellMenuAcc
* m_IShellMenuAcc
;
129 IShellMenuCallback
*m_psmc
;
131 CMenuStaticToolbar
*m_staticToolbar
;
132 CMenuSFToolbar
*m_SFToolbar
;
145 // *** IDeskBand methods ***
146 virtual HRESULT STDMETHODCALLTYPE
GetBandInfo(DWORD dwBandID
, DWORD dwViewMode
, DESKBANDINFO
*pdbi
);
148 // *** IDockingWindow methods ***
149 virtual HRESULT STDMETHODCALLTYPE
ShowDW(BOOL fShow
);
150 virtual HRESULT STDMETHODCALLTYPE
CloseDW(DWORD dwReserved
);
151 virtual HRESULT STDMETHODCALLTYPE
ResizeBorderDW(LPCRECT prcBorder
, IUnknown
*punkToolbarSite
, BOOL fReserved
);
153 // *** IOleWindow methods ***
154 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*phwnd
);
155 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
157 // *** IObjectWithSite methods ***
158 virtual HRESULT STDMETHODCALLTYPE
SetSite(IUnknown
*pUnkSite
);
159 virtual HRESULT STDMETHODCALLTYPE
GetSite(REFIID riid
, PVOID
*ppvSite
);
161 // *** IInputObject methods ***
162 virtual HRESULT STDMETHODCALLTYPE
UIActivateIO(BOOL fActivate
, LPMSG lpMsg
);
163 virtual HRESULT STDMETHODCALLTYPE
HasFocusIO();
164 virtual HRESULT STDMETHODCALLTYPE
TranslateAcceleratorIO(LPMSG lpMsg
);
166 // *** IPersistStream methods ***
167 virtual HRESULT STDMETHODCALLTYPE
IsDirty();
168 virtual HRESULT STDMETHODCALLTYPE
Load(IStream
*pStm
);
169 virtual HRESULT STDMETHODCALLTYPE
Save(IStream
*pStm
, BOOL fClearDirty
);
170 virtual HRESULT STDMETHODCALLTYPE
GetSizeMax(ULARGE_INTEGER
*pcbSize
);
172 // *** IPersist methods ***
173 virtual HRESULT STDMETHODCALLTYPE
GetClassID(CLSID
*pClassID
);
175 // *** IOleCommandTarget methods ***
176 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
);
177 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
179 // *** IServiceProvider methods ***
180 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
182 // *** IMenuPopup methods ***
183 virtual HRESULT STDMETHODCALLTYPE
Popup(POINTL
*ppt
, RECTL
*prcExclude
, MP_POPUPFLAGS dwFlags
);
184 virtual HRESULT STDMETHODCALLTYPE
OnSelect(DWORD dwSelectType
);
185 virtual HRESULT STDMETHODCALLTYPE
SetSubMenu(IMenuPopup
*pmp
, BOOL fSet
);
187 // *** IDeskBar methods ***
188 virtual HRESULT STDMETHODCALLTYPE
SetClient(IUnknown
*punkClient
);
189 virtual HRESULT STDMETHODCALLTYPE
GetClient(IUnknown
**ppunkClient
);
190 virtual HRESULT STDMETHODCALLTYPE
OnPosRectChangeDB(RECT
*prc
);
192 // *** IMenuBand methods ***
193 virtual HRESULT STDMETHODCALLTYPE
IsMenuMessage(MSG
*pmsg
);
194 virtual HRESULT STDMETHODCALLTYPE
TranslateMenuMessage(MSG
*pmsg
, LRESULT
*plRet
);
196 // *** IShellMenu methods ***
197 virtual HRESULT STDMETHODCALLTYPE
Initialize(IShellMenuCallback
*psmc
, UINT uId
, UINT uIdAncestor
, DWORD dwFlags
);
198 virtual HRESULT STDMETHODCALLTYPE
GetMenuInfo(IShellMenuCallback
**ppsmc
, UINT
*puId
, UINT
*puIdAncestor
, DWORD
*pdwFlags
);
199 virtual HRESULT STDMETHODCALLTYPE
SetShellFolder(IShellFolder
*psf
, LPCITEMIDLIST pidlFolder
, HKEY hKey
, DWORD dwFlags
);
200 virtual HRESULT STDMETHODCALLTYPE
GetShellFolder(DWORD
*pdwFlags
, LPITEMIDLIST
*ppidl
, REFIID riid
, void **ppv
);
201 virtual HRESULT STDMETHODCALLTYPE
SetMenu(HMENU hmenu
, HWND hwnd
, DWORD dwFlags
);
202 virtual HRESULT STDMETHODCALLTYPE
GetMenu(HMENU
*phmenu
, HWND
*phwnd
, DWORD
*pdwFlags
);
203 virtual HRESULT STDMETHODCALLTYPE
InvalidateItem(LPSMDATA psmd
, DWORD dwFlags
);
204 virtual HRESULT STDMETHODCALLTYPE
GetState(LPSMDATA psmd
);
205 virtual HRESULT STDMETHODCALLTYPE
SetMenuToolbar(IUnknown
*punk
, DWORD dwFlags
);
207 // *** IWinEventHandler methods ***
208 virtual HRESULT STDMETHODCALLTYPE
OnWinEvent(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
);
209 virtual HRESULT STDMETHODCALLTYPE
IsWindowOwner(HWND hWnd
);
211 // *** IShellMenu2 methods ***
212 virtual HRESULT STDMETHODCALLTYPE
GetSubMenu(THIS
);
213 virtual HRESULT STDMETHODCALLTYPE
SetToolbar(THIS
);
214 virtual HRESULT STDMETHODCALLTYPE
SetMinWidth(THIS
);
215 virtual HRESULT STDMETHODCALLTYPE
SetNoBorder(THIS
);
216 virtual HRESULT STDMETHODCALLTYPE
SetTheme(THIS
);
218 // *** IShellMenuAcc methods ***
219 virtual HRESULT STDMETHODCALLTYPE
GetTop(THIS
);
220 virtual HRESULT STDMETHODCALLTYPE
GetBottom(THIS
);
221 virtual HRESULT STDMETHODCALLTYPE
GetTracked(THIS
);
222 virtual HRESULT STDMETHODCALLTYPE
GetParentSite(THIS
);
223 virtual HRESULT STDMETHODCALLTYPE
GetState(THIS
);
224 virtual HRESULT STDMETHODCALLTYPE
DoDefaultAction(THIS
);
225 virtual HRESULT STDMETHODCALLTYPE
IsEmpty(THIS
);
227 HRESULT
CallCBWithId(UINT Id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
230 return m_useBigIcons
;
233 DECLARE_NOT_AGGREGATABLE(CMenuBand
)
234 DECLARE_PROTECT_FINAL_CONSTRUCT()
236 BEGIN_COM_MAP(CMenuBand
)
237 COM_INTERFACE_ENTRY_IID(IID_IDeskBar
, IMenuPopup
)
238 COM_INTERFACE_ENTRY_IID(IID_IShellMenu
, IShellMenu
)
239 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
240 COM_INTERFACE_ENTRY_IID(IID_IOleWindow
, IDeskBand
)
241 COM_INTERFACE_ENTRY_IID(IID_IDockingWindow
, IDockingWindow
)
242 COM_INTERFACE_ENTRY_IID(IID_IDeskBand
, IDeskBand
)
243 COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite
, IObjectWithSite
)
244 COM_INTERFACE_ENTRY_IID(IID_IInputObject
, IInputObject
)
245 COM_INTERFACE_ENTRY_IID(IID_IPersistStream
, IPersistStream
)
246 COM_INTERFACE_ENTRY_IID(IID_IPersist
, IPersistStream
)
247 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
248 COM_INTERFACE_ENTRY_IID(IID_IMenuPopup
, IMenuPopup
)
249 COM_INTERFACE_ENTRY_IID(IID_IMenuBand
, IMenuBand
)
250 COM_INTERFACE_ENTRY_IID(IID_IShellMenu2
, IShellMenu2
)
251 COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler
, IWinEventHandler
)
252 COM_INTERFACE_ENTRY_IID(IID_IShellMenuAcc
, IShellMenuAcc
)
256 HRESULT
_CallCB(UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
260 HRESULT
CMenuBand_Constructor(REFIID riid
, LPVOID
*ppv
)
264 CMenuBand
* site
= new CComObject
<CMenuBand
>();
267 return E_OUTOFMEMORY
;
269 HRESULT hr
= site
->QueryInterface(riid
, ppv
);
279 CMenuBand::CMenuBand()
284 hr
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IShellMenu
, &m_IShellMenu
));
285 hr
= m_IShellMenu
->QueryInterface(IID_PPV_ARG(IUnknown
, &m_IUnknown
));
286 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IDeskBand
, &m_IDeskBand
));
287 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &m_IDockingWindow
));
288 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IOleWindow
, &m_IOleWindow
));
289 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &m_IObjectWithSite
));
290 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IInputObject
, &m_IInputObject
));
291 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IPersistStream
, &m_IPersistStream
));
292 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IPersist
, &m_IPersist
));
293 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &m_IOleCommandTarget
));
294 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &m_IServiceProvider
));
295 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IMenuPopup
, &m_IMenuPopup
));
296 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IDeskBar
, &m_IDeskBar
));
297 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IMenuBand
, &m_IMenuBand
));
298 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IShellMenu2
, &m_IShellMenu2
));
299 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &m_IWinEventHandler
));
300 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IShellMenuAcc
, &m_IShellMenuAcc
));
303 CMenuBand::~CMenuBand()
305 m_IUnknown
->Release();
306 m_IDeskBand
->Release();
307 m_IDockingWindow
->Release();
308 m_IOleWindow
->Release();
309 m_IObjectWithSite
->Release();
310 m_IInputObject
->Release();
311 m_IPersistStream
->Release();
312 m_IPersist
->Release();
313 m_IOleCommandTarget
->Release();
314 m_IServiceProvider
->Release();
315 m_IMenuPopup
->Release();
316 m_IDeskBar
->Release();
317 m_IMenuBand
->Release();
318 m_IShellMenu2
->Release();
319 m_IShellMenu
->Release();
320 m_IWinEventHandler
->Release();
321 m_IShellMenuAcc
->Release();
326 // *** IShellMenu2 methods ***
327 HRESULT STDMETHODCALLTYPE
CMenuBand::GetSubMenu(THIS
)
329 WrapLogEnter("CMenuBand<%p>::GetSubMenu()\n", this);
330 HRESULT hr
= m_IShellMenu2
->GetSubMenu();
331 WrapLogExit("CMenuBand::GetSubMenu() = %08x\n", hr
);
335 HRESULT STDMETHODCALLTYPE
CMenuBand::SetToolbar(THIS
)
337 WrapLogEnter("CMenuBand<%p>::SetToolbar()\n", this);
338 HRESULT hr
= m_IShellMenu2
->SetToolbar();
339 WrapLogExit("CMenuBand::SetToolbar() = %08x\n", hr
);
343 HRESULT STDMETHODCALLTYPE
CMenuBand::SetMinWidth(THIS
)
345 WrapLogEnter("CMenuBand<%p>::SetMinWidth()\n", this);
346 HRESULT hr
= m_IShellMenu2
->SetMinWidth();
347 WrapLogExit("CMenuBand::SetMinWidth() = %08x\n", hr
);
351 HRESULT STDMETHODCALLTYPE
CMenuBand::SetNoBorder(THIS
)
353 WrapLogEnter("CMenuBand<%p>::SetNoBorder()\n", this);
354 HRESULT hr
= m_IShellMenu2
->SetNoBorder();
355 WrapLogExit("CMenuBand::SetNoBorder() = %08x\n", hr
);
359 HRESULT STDMETHODCALLTYPE
CMenuBand::SetTheme(THIS
)
361 WrapLogEnter("CMenuBand<%p>::SetTheme()\n", this);
362 HRESULT hr
= m_IShellMenu2
->SetTheme();
363 WrapLogExit("CMenuBand::SetTheme() = %08x\n", hr
);
368 // *** IShellMenuAcc methods ***
369 HRESULT STDMETHODCALLTYPE
CMenuBand::GetTop(THIS
)
371 WrapLogEnter("CMenuBand<%p>::GetTop()\n", this);
372 HRESULT hr
= m_IShellMenuAcc
->GetTop();
373 WrapLogExit("CMenuBand::GetTop() = %08x\n", hr
);
377 HRESULT STDMETHODCALLTYPE
CMenuBand::GetBottom(THIS
)
379 WrapLogEnter("CMenuBand<%p>::GetBottom()\n", this);
380 HRESULT hr
= m_IShellMenuAcc
->GetBottom();
381 WrapLogExit("CMenuBand::GetBottom() = %08x\n", hr
);
385 HRESULT STDMETHODCALLTYPE
CMenuBand::GetTracked(THIS
)
387 WrapLogEnter("CMenuBand<%p>::GetBottom()\n", this);
388 HRESULT hr
= m_IShellMenuAcc
->GetBottom();
389 WrapLogExit("CMenuBand::GetBottom() = %08x\n", hr
);
393 HRESULT STDMETHODCALLTYPE
CMenuBand::GetParentSite(THIS
)
395 WrapLogEnter("CMenuBand<%p>::GetBottom()\n", this);
396 HRESULT hr
= m_IShellMenuAcc
->GetBottom();
397 WrapLogExit("CMenuBand::GetBottom() = %08x\n", hr
);
401 HRESULT STDMETHODCALLTYPE
CMenuBand::GetState(THIS
)
403 WrapLogEnter("CMenuBand<%p>::GetBottom()\n", this);
404 HRESULT hr
= m_IShellMenuAcc
->GetBottom();
405 WrapLogExit("CMenuBand::GetBottom() = %08x\n", hr
);
409 HRESULT STDMETHODCALLTYPE
CMenuBand::DoDefaultAction(THIS
)
411 WrapLogEnter("CMenuBand<%p>::GetBottom()\n", this);
412 HRESULT hr
= m_IShellMenuAcc
->GetBottom();
413 WrapLogExit("CMenuBand::GetBottom() = %08x\n", hr
);
417 HRESULT STDMETHODCALLTYPE
CMenuBand::IsEmpty(THIS
)
419 WrapLogEnter("CMenuBand<%p>::GetBottom()\n", this);
420 HRESULT hr
= m_IShellMenuAcc
->GetBottom();
421 WrapLogExit("CMenuBand::GetBottom() = %08x\n", hr
);
425 // *** IDeskBand methods ***
426 HRESULT STDMETHODCALLTYPE
CMenuBand::GetBandInfo(DWORD dwBandID
, DWORD dwViewMode
, DESKBANDINFO
*pdbi
)
428 WrapLogEnter("CMenuBand<%p>::GetBandInfo(DWORD dwBandID=%d, DWORD dwViewMode=%d, DESKBANDINFO *pdbi=%p)\n", this, dwBandID
, dwViewMode
, pdbi
);
429 HRESULT hr
= m_IDeskBand
->GetBandInfo(dwBandID
, dwViewMode
, pdbi
);
430 WrapLogExit("CMenuBand::GetBandInfo() = %08x\n", hr
);
434 // *** IDockingWindow methods ***
435 HRESULT STDMETHODCALLTYPE
CMenuBand::ShowDW(BOOL fShow
)
437 WrapLogEnter("CMenuBand<%p>::ShowDW(BOOL fShow=%d)\n", this, fShow
);
438 HRESULT hr
= m_IDockingWindow
->ShowDW(fShow
);
439 WrapLogExit("CMenuBand::ShowDW() = %08x\n", hr
);
443 HRESULT STDMETHODCALLTYPE
CMenuBand::CloseDW(DWORD dwReserved
)
445 WrapLogEnter("CMenuBand<%p>::CloseDW(DWORD dwReserved=%d)\n", this, dwReserved
);
446 HRESULT hr
= m_IDockingWindow
->CloseDW(dwReserved
);
447 WrapLogExit("CMenuBand::CloseDW() = %08x\n", hr
);
451 HRESULT STDMETHODCALLTYPE
CMenuBand::ResizeBorderDW(LPCRECT prcBorder
, IUnknown
*punkToolbarSite
, BOOL fReserved
)
453 WrapLogEnter("CMenuBand<%p>::ResizeBorderDW(LPCRECT prcBorder=%p, IUnknown *punkToolbarSite=%p, BOOL fReserved=%d)\n", this, prcBorder
, punkToolbarSite
, fReserved
);
454 if (prcBorder
) WrapLogMsg("*prcBorder=%s\n", Wrap(*prcBorder
));
455 HRESULT hr
= m_IDockingWindow
->ResizeBorderDW(prcBorder
, punkToolbarSite
, fReserved
);
456 if (prcBorder
) WrapLogMsg("*prcBorder=%s\n", Wrap(*prcBorder
));
457 WrapLogExit("CMenuBand::ResizeBorderDW() = %08x\n", hr
);
461 // *** IOleWindow methods ***
462 HRESULT STDMETHODCALLTYPE
CMenuBand::GetWindow(HWND
*phwnd
)
464 WrapLogEnter("CMenuBand<%p>::GetWindow(HWND *phwnd=%p)\n", this, phwnd
);
465 HRESULT hr
= m_IOleWindow
->GetWindow(phwnd
);
466 if (phwnd
) WrapLogMsg("*phwnd=%p\n", *phwnd
);
467 WrapLogExit("CMenuBand::GetWindow() = %08x\n", hr
);
470 HRESULT STDMETHODCALLTYPE
CMenuBand::ContextSensitiveHelp(BOOL fEnterMode
)
472 WrapLogEnter("CMenuBand<%p>::ContextSensitiveHelp(BOOL fEnterMode=%d)\n", this, fEnterMode
);
473 HRESULT hr
= m_IOleWindow
->ContextSensitiveHelp(fEnterMode
);
474 WrapLogExit("CMenuBand::ContextSensitiveHelp() = %08x\n", hr
);
478 // *** IWinEventHandler methods ***
479 HRESULT STDMETHODCALLTYPE
CMenuBand::OnWinEvent(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
481 //WrapLogEnter("CMenuBand<%p>::OnWinEvent(HWND hWnd=%p, UINT uMsg=%u, WPARAM wParam=%08x, LPARAM lParam=%08x, LRESULT *theResult=%p)\n", this, hWnd, uMsg, wParam, lParam, theResult);
482 HRESULT hr
= m_IWinEventHandler
->OnWinEvent(hWnd
, uMsg
, wParam
, lParam
, theResult
);
483 //WrapLogExit("CMenuBand::OnWinEvent() = %08x\n", hr);
487 HRESULT STDMETHODCALLTYPE
CMenuBand::IsWindowOwner(HWND hWnd
)
489 //WrapLogEnter("CMenuBand<%p>::IsWindowOwner(HWND hWnd=%08x)\n", this, hWnd);
490 HRESULT hr
= m_IWinEventHandler
->IsWindowOwner(hWnd
);
491 //WrapLogExit("CMenuBand::IsWindowOwner() = %08x\n", hr);
495 // *** IObjectWithSite methods ***
496 HRESULT STDMETHODCALLTYPE
CMenuBand::SetSite(IUnknown
*pUnkSite
)
498 WrapLogEnter("CMenuBand<%p>::SetSite(IUnknown *pUnkSite=%p)\n", this, pUnkSite
);
499 HRESULT hr
= m_IObjectWithSite
->SetSite(pUnkSite
);
500 WrapLogExit("CMenuBand::SetSite() = %08x\n", hr
);
504 HRESULT STDMETHODCALLTYPE
CMenuBand::GetSite(REFIID riid
, PVOID
*ppvSite
)
506 WrapLogEnter("CMenuBand<%p>::GetSite(REFIID riid=%s, PVOID *ppvSite=%p)\n", this, Wrap(riid
), ppvSite
);
507 HRESULT hr
= m_IObjectWithSite
->GetSite(riid
, ppvSite
);
508 if (ppvSite
) WrapLogMsg("*ppvSite=%p\n", *ppvSite
);
509 WrapLogExit("CMenuBand::GetSite() = %08x\n", hr
);
513 // *** IInputObject methods ***
514 HRESULT STDMETHODCALLTYPE
CMenuBand::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
516 WrapLogEnter("CMenuBand<%p>::UIActivateIO(BOOL fActivate=%d, LPMSG lpMsg=%p)\n", this, fActivate
, lpMsg
);
517 HRESULT hr
= m_IInputObject
->UIActivateIO(fActivate
, lpMsg
);
518 WrapLogExit("CMenuBand::UIActivateIO() = %08x\n", hr
);
522 HRESULT STDMETHODCALLTYPE
CMenuBand::HasFocusIO()
524 WrapLogEnter("CMenuBand<%p>::HasFocusIO()\n", this);
525 HRESULT hr
= m_IInputObject
->HasFocusIO();
526 WrapLogExit("CMenuBand::HasFocusIO() = %08x\n", hr
);
530 HRESULT STDMETHODCALLTYPE
CMenuBand::TranslateAcceleratorIO(LPMSG lpMsg
)
532 WrapLogEnter("CMenuBand<%p>::TranslateAcceleratorIO(LPMSG lpMsg=%p)\n", this, lpMsg
);
533 if (lpMsg
) WrapLogMsg("*lpMsg=%s\n", Wrap(*lpMsg
));
534 HRESULT hr
= m_IInputObject
->TranslateAcceleratorIO(lpMsg
);
535 WrapLogExit("CMenuBand::TranslateAcceleratorIO() = %08x\n", hr
);
539 // *** IPersistStream methods ***
540 HRESULT STDMETHODCALLTYPE
CMenuBand::IsDirty()
542 WrapLogEnter("CMenuBand<%p>::IsDirty()\n", this);
543 HRESULT hr
= m_IPersistStream
->IsDirty();
544 WrapLogExit("CMenuBand::IsDirty() = %08x\n", hr
);
547 HRESULT STDMETHODCALLTYPE
CMenuBand::Load(IStream
*pStm
)
549 WrapLogEnter("CMenuBand<%p>::Load(IStream *pStm=%p)\n", this, pStm
);
550 HRESULT hr
= m_IPersistStream
->Load(pStm
);
551 WrapLogExit("CMenuBand::Load() = %08x\n", hr
);
554 HRESULT STDMETHODCALLTYPE
CMenuBand::Save(IStream
*pStm
, BOOL fClearDirty
)
556 WrapLogEnter("CMenuBand<%p>::Save(IStream *pStm=%p, BOOL fClearDirty=%d)\n", this, pStm
, fClearDirty
);
557 HRESULT hr
= m_IPersistStream
->Save(pStm
, fClearDirty
);
558 WrapLogExit("CMenuBand::Save() = %08x\n", hr
);
561 HRESULT STDMETHODCALLTYPE
CMenuBand::GetSizeMax(ULARGE_INTEGER
*pcbSize
)
563 WrapLogEnter("CMenuBand<%p>::GetSizeMax(ULARGE_INTEGER *pcbSize=%p)\n", this, pcbSize
);
564 HRESULT hr
= m_IPersistStream
->GetSizeMax(pcbSize
);
565 WrapLogExit("CMenuBand::GetSizeMax() = %08x\n", hr
);
569 // *** IPersist methods ***
570 HRESULT STDMETHODCALLTYPE
CMenuBand::GetClassID(CLSID
*pClassID
)
572 WrapLogEnter("CMenuBand<%p>::GetClassID(CLSID *pClassID=%p)\n", this, pClassID
);
573 HRESULT hr
= m_IPersist
->GetClassID(pClassID
);
574 if (pClassID
) WrapLogMsg("*pClassID=%s\n", Wrap(*pClassID
));
575 WrapLogExit("CMenuBand::GetClassID() = %08x\n", hr
);
579 // *** IOleCommandTarget methods ***
580 HRESULT STDMETHODCALLTYPE
CMenuBand::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
582 WrapLogEnter("CMenuBand<%p>::QueryStatus(const GUID *pguidCmdGroup=%p, ULONG cCmds=%u, prgCmds=%p, pCmdText=%p)\n", this, pguidCmdGroup
, cCmds
, prgCmds
, pCmdText
);
583 HRESULT hr
= m_IOleCommandTarget
->QueryStatus(pguidCmdGroup
, cCmds
, prgCmds
, pCmdText
);
584 if (pguidCmdGroup
) WrapLogMsg("*pguidCmdGroup=%s\n", Wrap(*pguidCmdGroup
));
585 WrapLogExit("CMenuBand::QueryStatus() = %08x\n", hr
);
589 HRESULT STDMETHODCALLTYPE
CMenuBand::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
593 WrapLogEnter("CMenuBand<%p>::Exec(const GUID *pguidCmdGroup=%p, DWORD nCmdID=%d, DWORD nCmdexecopt=%d, VARIANT *pvaIn=%p, VARIANT *pvaOut=%p)\n", this, pguidCmdGroup
, nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
595 if (pguidCmdGroup
&& IsEqualGUID(*pguidCmdGroup
, CLSID_MenuBand
))
597 if (nCmdID
== 19) // popup
604 if (pguidCmdGroup
) WrapLogMsg("*pguidCmdGroup=%s\n", Wrap(*pguidCmdGroup
));
605 HRESULT hr
= m_IOleCommandTarget
->Exec(pguidCmdGroup
, nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
606 WrapLogExit("CMenuBand::Exec() = %08x\n", hr
);
610 // *** IServiceProvider methods ***
611 HRESULT STDMETHODCALLTYPE
CMenuBand::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
613 WrapLogEnter("CMenuBand<%p>::QueryService(REFGUID guidService=%s, REFIID riid=%s, void **ppvObject=%p)\n", this, Wrap(guidService
), Wrap(riid
), ppvObject
);
615 if (IsEqualIID(guidService
, SID_SMenuBandChild
))
617 WrapLogMsg("SID is SID_SMenuBandChild. Using QueryInterface of self instead of wrapped object.\n");
618 HRESULT hr
= this->QueryInterface(riid
, ppvObject
);
619 if (ppvObject
) WrapLogMsg("*ppvObject=%p\n", *ppvObject
);
620 WrapLogExit("CMenuBand::QueryService() = %08x\n", hr
);
625 WrapLogMsg("SID not identified.\n");
627 HRESULT hr
= m_IServiceProvider
->QueryService(guidService
, riid
, ppvObject
);
628 if (ppvObject
) WrapLogMsg("*ppvObject=%p\n", *ppvObject
);
629 WrapLogExit("CMenuBand::QueryService() = %08x\n", hr
);
634 // *** IMenuPopup methods ***
635 HRESULT STDMETHODCALLTYPE
CMenuBand::Popup(POINTL
*ppt
, RECTL
*prcExclude
, MP_POPUPFLAGS dwFlags
)
637 WrapLogEnter("CMenuBand<%p>::Popup(POINTL *ppt=%p, RECTL *prcExclude=%p, MP_POPUPFLAGS dwFlags=%08x)\n", this, ppt
, prcExclude
, dwFlags
);
638 HRESULT hr
= m_IMenuPopup
->Popup(ppt
, prcExclude
, dwFlags
);
639 WrapLogExit("CMenuBand::Popup() = %08x\n", hr
);
643 HRESULT STDMETHODCALLTYPE
CMenuBand::OnSelect(DWORD dwSelectType
)
645 WrapLogEnter("CMenuBand<%p>::OnSelect(DWORD dwSelectType=%08x)\n", this, dwSelectType
);
646 HRESULT hr
= m_IMenuPopup
->OnSelect(dwSelectType
);
647 WrapLogExit("CMenuBand::OnSelect() = %08x\n", hr
);
651 HRESULT STDMETHODCALLTYPE
CMenuBand::SetSubMenu(IMenuPopup
*pmp
, BOOL fSet
)
653 WrapLogEnter("CMenuBand<%p>::SetSubMenu(IMenuPopup *pmp=%p, BOOL fSet=%d)\n", this, pmp
, fSet
);
654 HRESULT hr
= m_IMenuPopup
->SetSubMenu(pmp
, fSet
);
655 WrapLogExit("CMenuBand::SetSubMenu() = %08x\n", hr
);
660 // *** IDeskBar methods ***
661 HRESULT STDMETHODCALLTYPE
CMenuBand::SetClient(IUnknown
*punkClient
)
663 WrapLogEnter("CMenuBand<%p>::SetClient(IUnknown *punkClient=%p)\n", this, punkClient
);
664 HRESULT hr
= m_IDeskBar
->SetClient(punkClient
);
665 WrapLogExit("CMenuBand::SetClient() = %08x\n", hr
);
669 HRESULT STDMETHODCALLTYPE
CMenuBand::GetClient(IUnknown
**ppunkClient
)
671 WrapLogEnter("CMenuBand<%p>::GetClient(IUnknown **ppunkClient=%p)\n", this, ppunkClient
);
672 HRESULT hr
= m_IDeskBar
->GetClient(ppunkClient
);
673 if (ppunkClient
) WrapLogMsg("*ppunkClient=%p\n", *ppunkClient
);
674 WrapLogExit("CMenuBand::GetClient() = %08x\n", hr
);
678 HRESULT STDMETHODCALLTYPE
CMenuBand::OnPosRectChangeDB(RECT
*prc
)
680 WrapLogEnter("CMenuBand<%p>::OnPosRectChangeDB(RECT *prc=%p)\n", this, prc
);
681 HRESULT hr
= m_IDeskBar
->OnPosRectChangeDB(prc
);
682 if (prc
) WrapLogMsg("*prc=%s\n", Wrap(*prc
));
683 WrapLogExit("CMenuBand::OnPosRectChangeDB() = %08x\n", hr
);
688 // *** IMenuBand methods ***
689 HRESULT STDMETHODCALLTYPE
CMenuBand::IsMenuMessage(MSG
*pmsg
)
691 //WrapLogEnter("CMenuBand<%p>::IsMenuMessage(MSG *pmsg=%p)\n", this, pmsg);
692 HRESULT hr
= m_IMenuBand
->IsMenuMessage(pmsg
);
693 //WrapLogExit("CMenuBand::IsMenuMessage() = %08x\n", hr);
697 HRESULT STDMETHODCALLTYPE
CMenuBand::TranslateMenuMessage(MSG
*pmsg
, LRESULT
*plRet
)
699 //WrapLogEnter("CMenuBand<%p>::TranslateMenuMessage(MSG *pmsg=%p, LRESULT *plRet=%p)\n", this, pmsg, plRet);
700 HRESULT hr
= m_IMenuBand
->TranslateMenuMessage(pmsg
, plRet
);
701 //WrapLogExit("CMenuBand::TranslateMenuMessage(*plRet=%d) = %08x\n", *plRet, hr);
705 // *** IShellMenu methods ***
706 HRESULT STDMETHODCALLTYPE
CMenuBand::Initialize(IShellMenuCallback
*psmc
, UINT uId
, UINT uIdAncestor
, DWORD dwFlags
)
708 WrapLogEnter("CMenuBand<%p>::Initialize(IShellMenuCallback *psmc=%p, UINT uId=%u, UINT uIdAncestor=%u, DWORD dwFlags=%08x)\n", this, psmc
, uId
, uIdAncestor
, dwFlags
);
709 HRESULT hr
= m_IShellMenu
->Initialize(psmc
, uId
, uIdAncestor
, dwFlags
);
710 WrapLogExit("CMenuBand::Initialize() = %08x\n", hr
);
714 HRESULT STDMETHODCALLTYPE
CMenuBand::GetMenuInfo(IShellMenuCallback
**ppsmc
, UINT
*puId
, UINT
*puIdAncestor
, DWORD
*pdwFlags
)
716 WrapLogEnter("CMenuBand<%p>::GetMenuInfo(IShellMenuCallback **ppsmc=%p, UINT *puId=%p, UINT *puIdAncestor=%p, DWORD *pdwFlags=%p)\n", this, ppsmc
, puId
, puIdAncestor
, pdwFlags
);
717 HRESULT hr
= m_IShellMenu
->GetMenuInfo(ppsmc
, puId
, puIdAncestor
, pdwFlags
);
718 if (ppsmc
) WrapLogMsg("*ppsmc=%p\n", *ppsmc
);
719 if (puId
) WrapLogMsg("*puId=%u\n", *puId
);
720 if (puIdAncestor
) WrapLogMsg("*puIdAncestor=%u\n", *puIdAncestor
);
721 if (pdwFlags
) WrapLogMsg("*pdwFlags=%08x\n", *pdwFlags
);
722 WrapLogExit("CMenuBand::GetMenuInfo() = %08x\n", hr
);
726 HRESULT STDMETHODCALLTYPE
CMenuBand::SetShellFolder(IShellFolder
*psf
, LPCITEMIDLIST pidlFolder
, HKEY hKey
, DWORD dwFlags
)
728 WrapLogEnter("CMenuBand<%p>::SetShellFolder(IShellFolder *psf=%p, LPCITEMIDLIST pidlFolder=%p, HKEY hKey=%p, DWORD dwFlags=%08x)\n", this, psf
, pidlFolder
, hKey
, dwFlags
);
729 HRESULT hr
= m_IShellMenu
->SetShellFolder(psf
, pidlFolder
, hKey
, dwFlags
);
730 WrapLogExit("CMenuBand::SetShellFolder() = %08x\n", hr
);
734 HRESULT STDMETHODCALLTYPE
CMenuBand::GetShellFolder(DWORD
*pdwFlags
, LPITEMIDLIST
*ppidl
, REFIID riid
, void **ppv
)
736 WrapLogEnter("CMenuBand<%p>::GetShellFolder(DWORD *pdwFlags=%p, LPITEMIDLIST *ppidl=%p, REFIID riid=%s, void **ppv=%p)\n", this, pdwFlags
, ppidl
, Wrap(riid
), ppv
);
737 HRESULT hr
= m_IShellMenu
->GetShellFolder(pdwFlags
, ppidl
, riid
, ppv
);
738 if (pdwFlags
) WrapLogMsg("*pdwFlags=%08x\n", *pdwFlags
);
739 if (ppidl
) WrapLogMsg("*ppidl=%p\n", *ppidl
);
740 if (ppv
) WrapLogMsg("*ppv=%p\n", *ppv
);
741 WrapLogExit("CMenuBand::GetShellFolder() = %08x\n", hr
);
745 HRESULT STDMETHODCALLTYPE
CMenuBand::SetMenu(HMENU hmenu
, HWND hwnd
, DWORD dwFlags
)
747 WrapLogEnter("CMenuBand<%p>::SetMenu(HMENU hmenu=%p, HWND hwnd=%p, DWORD dwFlags=%08x)\n", this, hmenu
, hwnd
, dwFlags
);
748 HRESULT hr
= m_IShellMenu
->SetMenu(hmenu
, hwnd
, dwFlags
);
749 WrapLogExit("CMenuBand::SetMenu() = %08x\n", hr
);
753 HRESULT STDMETHODCALLTYPE
CMenuBand::GetMenu(HMENU
*phmenu
, HWND
*phwnd
, DWORD
*pdwFlags
)
755 WrapLogEnter("CMenuBand<%p>::GetMenu(HMENU *phmenu=%p, HWND *phwnd=%p, DWORD *pdwFlags=%p)\n", this, phmenu
, phwnd
, pdwFlags
);
756 HRESULT hr
= m_IShellMenu
->GetMenu(phmenu
, phwnd
, pdwFlags
);
757 if (phmenu
) WrapLogMsg("*phmenu=%p\n", *phmenu
);
758 if (phwnd
) WrapLogMsg("*phwnd=%p\n", *phwnd
);
759 if (pdwFlags
) WrapLogMsg("*pdwFlags=%08x\n", *pdwFlags
);
760 WrapLogExit("CMenuBand::GetMenu() = %08x\n", hr
);
764 HRESULT STDMETHODCALLTYPE
CMenuBand::InvalidateItem(LPSMDATA psmd
, DWORD dwFlags
)
766 WrapLogEnter("CMenuBand<%p>::InvalidateItem(LPSMDATA psmd=%p, DWORD dwFlags=%08x)\n", this, psmd
, dwFlags
);
767 HRESULT hr
= m_IShellMenu
->InvalidateItem(psmd
, dwFlags
);
768 WrapLogExit("CMenuBand::InvalidateItem() = %08x\n", hr
);
772 HRESULT STDMETHODCALLTYPE
CMenuBand::GetState(LPSMDATA psmd
)
774 WrapLogEnter("CMenuBand<%p>::GetState(LPSMDATA psmd=%p)\n", this, psmd
);
775 HRESULT hr
= m_IShellMenu
->GetState(psmd
);
776 WrapLogExit("CMenuBand::GetState() = %08x\n", hr
);
780 HRESULT STDMETHODCALLTYPE
CMenuBand::SetMenuToolbar(IUnknown
*punk
, DWORD dwFlags
)
782 WrapLogEnter("CMenuBand<%p>::SetMenuToolbar(IUnknown *punk=%p, DWORD dwFlags=%08x)\n", this, punk
, dwFlags
);
783 HRESULT hr
= m_IShellMenu
->SetMenuToolbar(punk
, dwFlags
);
784 WrapLogExit("CMenuBand::SetMenuToolbar() = %08x\n", hr
);
789 #include <windowsx.h>
791 #define TBSTYLE_EX_VERTICAL 4
793 CMenuToolbarBase::CMenuToolbarBase(CMenuBand
*menuBand
) :
794 m_menuBand(menuBand
),
800 HRESULT
CMenuToolbarBase::ShowWindow(BOOL fShow
)
802 ::ShowWindow(m_hwnd
, fShow
? SW_SHOW
: SW_HIDE
);
804 HIMAGELIST ilBig
, ilSmall
;
805 Shell_GetImageLists(&ilBig
, &ilSmall
);
807 if (m_menuBand
->UseBigIcons())
809 SendMessageW(m_hwnd
, TB_SETIMAGELIST
, 0, (LPARAM
) ilBig
);
813 SendMessageW(m_hwnd
, TB_SETIMAGELIST
, 0, (LPARAM
) ilSmall
);
819 HRESULT
CMenuToolbarBase::Close()
821 DestroyWindow(m_hwnd
);
826 HRESULT
CMenuToolbarBase::CreateToolbar(HWND hwndParent
, DWORD dwFlags
)
828 LONG tbStyles
= WS_CHILD
| WS_VISIBLE
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
|
829 TBSTYLE_TOOLTIPS
| TBSTYLE_TRANSPARENT
| TBSTYLE_REGISTERDROP
| TBSTYLE_LIST
| TBSTYLE_FLAT
|
830 CCS_NODIVIDER
| CCS_NOPARENTALIGN
| CCS_NORESIZE
| CCS_TOP
;
831 LONG tbExStyles
= TBSTYLE_EX_DOUBLEBUFFER
;
833 if (dwFlags
& SMINIT_VERTICAL
)
835 tbStyles
|= CCS_VERT
;
836 tbExStyles
|= TBSTYLE_EX_VERTICAL
;
841 if (!::GetClientRect(hwndParent
, &rc
) || (rc
.left
== rc
.right
) || (rc
.top
== rc
.bottom
))
849 HWND hwndToolbar
= CreateWindowEx(
850 tbExStyles
, TOOLBARCLASSNAMEW
, NULL
,
851 tbStyles
, rc
.left
, rc
.top
, rc
.right
- rc
.left
, rc
.bottom
- rc
.top
,
852 hwndParent
, NULL
, _AtlBaseModule
.GetModuleInstance(), 0);
854 if (hwndToolbar
== NULL
)
857 ::SetParent(hwndToolbar
, hwndParent
);
859 m_hwnd
= hwndToolbar
;
861 /* Identify the version of the used Common Controls DLL by sending the size of the TBBUTTON structure */
862 SendMessageW(m_hwnd
, TB_BUTTONSTRUCTSIZE
, sizeof(TBBUTTON
), 0);
864 HIMAGELIST ilBig
, ilSmall
;
865 Shell_GetImageLists(&ilBig
, &ilSmall
);
867 //if (dwFlags & SMINIT_TOPLEVEL)
869 // /* Hide the placeholders for the button images */
870 // SendMessageW(m_hwnd, TB_SETIMAGELIST, 0, 0);
873 if (m_menuBand
->UseBigIcons())
875 SendMessageW(m_hwnd
, TB_SETIMAGELIST
, 0, (LPARAM
) ilBig
);
879 SendMessageW(m_hwnd
, TB_SETIMAGELIST
, 0, (LPARAM
) ilSmall
);
885 HRESULT
CMenuToolbarBase::GetWindow(HWND
*phwnd
)
896 AllocAndGetMenuString(HMENU hMenu
, UINT ItemIDByPosition
, WCHAR
** String
)
900 Length
= GetMenuStringW(hMenu
, ItemIDByPosition
, NULL
, 0, MF_BYPOSITION
);
905 /* Also allocate space for the terminating NULL character */
907 *String
= (PWSTR
) HeapAlloc(GetProcessHeap(), 0, Length
* sizeof(WCHAR
));
909 GetMenuStringW(hMenu
, ItemIDByPosition
, *String
, Length
, MF_BYPOSITION
);
914 CMenuStaticToolbar::CMenuStaticToolbar(CMenuBand
*menuBand
) :
915 CMenuToolbarBase(menuBand
),
920 HRESULT
CMenuStaticToolbar::GetMenu(
927 *pdwFlags
= m_dwMenuFlags
;
932 HRESULT
CMenuStaticToolbar::SetMenu(
938 m_dwMenuFlags
= dwFlags
;
943 HRESULT
CMenuStaticToolbar::FillToolbar()
946 int ic
= GetMenuItemCount(m_hmenu
);
948 for (i
= 0; i
< ic
; i
++)
951 TBBUTTON tbb
= { 0 };
952 PWSTR MenuString
= NULL
;
954 tbb
.fsState
= TBSTATE_ENABLED
;
957 info
.cbSize
= sizeof(info
);
958 info
.fMask
= MIIM_FTYPE
| MIIM_ID
;
960 GetMenuItemInfoW(m_hmenu
, i
, TRUE
, &info
);
962 if (info
.fType
== MFT_STRING
)
964 if (!AllocAndGetMenuString(m_hmenu
, i
, &MenuString
))
965 return E_OUTOFMEMORY
;
966 if (::GetSubMenu(m_hmenu
, i
) != NULL
)
967 tbb
.fsStyle
|= BTNS_DROPDOWN
;
968 tbb
.iString
= (INT_PTR
) MenuString
;
969 tbb
.idCommand
= info
.wID
;
972 if (info
.wID
>= 0 && SUCCEEDED(m_menuBand
->CallCBWithId(info
.wID
, SMC_GETINFO
, 0, (LPARAM
) &sminfo
)))
974 tbb
.iBitmap
= sminfo
.iIcon
;
979 tbb
.fsStyle
|= BTNS_SEP
;
982 SendMessageW(m_hwnd
, TB_ADDBUTTONS
, 1, (LPARAM
) (LPTBBUTTON
) &tbb
);
985 HeapFree(GetProcessHeap(), 0, MenuString
);
991 CMenuSFToolbar::CMenuSFToolbar(CMenuBand
* menuBand
) :
992 CMenuToolbarBase(menuBand
),
997 CMenuSFToolbar::~CMenuSFToolbar()
1001 HRESULT
CMenuSFToolbar::FillToolbar()
1004 TBBUTTON tbb
= { 0 };
1008 tbb
.fsState
= TBSTATE_ENABLED
;
1012 m_shellFolder
->EnumObjects(m_hwnd
, SHCONTF_FOLDERS
| SHCONTF_NONFOLDERS
, &eidl
);
1014 LPITEMIDLIST item
= (LPITEMIDLIST
) CoTaskMemAlloc(sizeof(ITEMIDLIST
));
1016 while ((hr
= eidl
->Next(1, &item
, &fetched
)) == S_OK
)
1022 SHCreateShellItem(NULL
, m_shellFolder
, item
, &psi
);
1024 hr
= psi
->GetDisplayName(SIGDN_NORMALDISPLAY
, &MenuString
);
1028 index
= SHMapPIDLToSystemImageListIndex(m_shellFolder
, item
, &indexOpen
);
1030 tbb
.idCommand
= i
++;
1031 tbb
.iString
= (INT_PTR
) MenuString
;
1032 tbb
.iBitmap
= index
;
1034 SendMessageW(m_hwnd
, TB_ADDBUTTONS
, 1, (LPARAM
) (LPTBBUTTON
) &tbb
);
1035 HeapFree(GetProcessHeap(), 0, MenuString
);
1038 CoTaskMemFree(item
);
1043 HRESULT
CMenuSFToolbar::SetShellFolder(IShellFolder
*psf
, LPCITEMIDLIST pidlFolder
, HKEY hKey
, DWORD dwFlags
)
1045 m_shellFolder
= psf
;
1046 m_idList
= pidlFolder
;
1048 m_dwMenuFlags
= dwFlags
;
1052 HRESULT
CMenuSFToolbar::GetShellFolder(DWORD
*pdwFlags
, LPITEMIDLIST
*ppidl
, REFIID riid
, void **ppv
)
1056 hr
= m_shellFolder
->QueryInterface(riid
, ppv
);
1061 *pdwFlags
= m_dwMenuFlags
;
1065 LPITEMIDLIST pidl
= NULL
;
1069 pidl
= ILClone(m_idList
);
1072 (*(IUnknown
**) ppv
)->Release();
1083 HRESULT
CMenuStaticToolbar::OnCommand(WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
1085 return m_menuBand
->CallCBWithId(wParam
, SMC_EXEC
, 0, 0);
1087 HRESULT
CMenuSFToolbar::OnCommand(WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
1089 // return m_menuBand->CallCBWithPidl(GetPidlFromId(wParam), SMC_SFEXEC, 0, 0);
1093 CMenuBand::CMenuBand() :
1096 m_staticToolbar(NULL
),
1098 m_useBigIcons(FALSE
)
1102 CMenuBand::~CMenuBand()
1110 if (m_staticToolbar
)
1111 delete m_staticToolbar
;
1117 HRESULT STDMETHODCALLTYPE
CMenuBand::Initialize(
1118 IShellMenuCallback
*psmc
,
1128 m_uIdAncestor
= uIdAncestor
;
1129 m_dwFlags
= dwFlags
;
1135 _CallCB(SMC_CREATE
, 0, (LPARAM
) &m_UserData
);
1141 HRESULT STDMETHODCALLTYPE
CMenuBand::GetMenuInfo(
1142 IShellMenuCallback
**ppsmc
,
1147 if (!pdwFlags
) // maybe?
1148 return E_INVALIDARG
;
1157 *puIdAncestor
= m_uIdAncestor
;
1159 *pdwFlags
= m_dwFlags
;
1164 HRESULT STDMETHODCALLTYPE
CMenuBand::SetMenu(
1169 if (m_staticToolbar
== NULL
)
1171 m_staticToolbar
= new CMenuStaticToolbar(this);
1175 HRESULT hResult
= m_staticToolbar
->SetMenu(hmenu
, hwnd
, dwFlags
);
1176 if (FAILED(hResult
))
1183 hResult
= m_site
->GetWindow(&hwndParent
);
1184 if (FAILED(hResult
))
1187 hResult
= m_staticToolbar
->CreateToolbar(hwndParent
, m_dwFlags
);
1188 if (FAILED(hResult
))
1191 hResult
= m_staticToolbar
->FillToolbar();
1197 HRESULT STDMETHODCALLTYPE
CMenuBand::GetMenu(
1202 if (m_staticToolbar
== NULL
)
1205 return m_staticToolbar
->GetMenu(phmenu
, phwnd
, pdwFlags
);
1208 HRESULT STDMETHODCALLTYPE
CMenuBand::SetSite(IUnknown
*pUnkSite
)
1216 if (pUnkSite
== NULL
)
1220 hResult
= pUnkSite
->QueryInterface(IID_PPV_ARG(IOleWindow
, &m_site
));
1221 if (SUCCEEDED(hResult
))
1223 m_site
->GetWindow(&hwndParent
);
1226 if (!::IsWindow(hwndParent
))
1229 if (m_staticToolbar
!= NULL
)
1231 hResult
= m_staticToolbar
->CreateToolbar(hwndParent
, m_dwFlags
);
1232 if (FAILED(hResult
))
1235 hResult
= m_staticToolbar
->FillToolbar();
1238 if (m_SFToolbar
!= NULL
)
1240 hResult
= m_SFToolbar
->CreateToolbar(hwndParent
, m_dwFlags
);
1241 if (FAILED(hResult
))
1244 hResult
= m_SFToolbar
->FillToolbar();
1250 HRESULT STDMETHODCALLTYPE
CMenuBand::GetSite(REFIID riid
, PVOID
*ppvSite
)
1255 return m_site
->QueryInterface(riid
, ppvSite
);
1258 HRESULT STDMETHODCALLTYPE
CMenuBand::GetWindow(
1261 if (m_SFToolbar
!= NULL
)
1262 return m_SFToolbar
->GetWindow(phwnd
);
1264 if (m_staticToolbar
!= NULL
)
1265 return m_staticToolbar
->GetWindow(phwnd
);
1270 HRESULT STDMETHODCALLTYPE
CMenuBand::OnPosRectChangeDB(RECT
*prc
)
1272 SIZE sizeStaticX
= { 0 };
1273 SIZE sizeShlFldX
= { 0 };
1274 SIZE sizeStaticY
= { 0 };
1275 SIZE sizeShlFldY
= { 0 };
1276 HWND hwndStatic
= NULL
;
1277 HWND hwndShlFld
= NULL
;
1278 HRESULT hResult
= S_OK
;
1280 if (m_staticToolbar
!= NULL
)
1281 hResult
= m_staticToolbar
->GetWindow(&hwndStatic
);
1282 if (FAILED(hResult
))
1285 if (m_SFToolbar
!= NULL
)
1286 hResult
= m_SFToolbar
->GetWindow(&hwndShlFld
);
1287 if (FAILED(hResult
))
1290 if (hwndStatic
== NULL
&& hwndShlFld
== NULL
)
1293 if (hwndStatic
) SendMessageW(hwndStatic
, TB_GETIDEALSIZE
, TRUE
, (LPARAM
) &sizeStaticY
);
1294 if (hwndShlFld
) SendMessageW(hwndShlFld
, TB_GETIDEALSIZE
, TRUE
, (LPARAM
) &sizeShlFldY
);
1295 if (hwndStatic
) SendMessageW(hwndStatic
, TB_GETIDEALSIZE
, FALSE
, (LPARAM
) &sizeStaticX
);
1296 if (hwndShlFld
) SendMessageW(hwndShlFld
, TB_GETIDEALSIZE
, FALSE
, (LPARAM
) &sizeShlFldX
);
1298 int sy
= max(prc
->bottom
- prc
->top
, sizeStaticY
.cy
+ sizeShlFldY
.cy
);
1302 SetWindowPos(hwndShlFld
, NULL
,
1305 prc
->right
- prc
->left
,
1308 DWORD btnSize
= SendMessage(hwndShlFld
, TB_GETBUTTONSIZE
, 0, 0);
1309 SendMessage(hwndShlFld
, TB_SETBUTTONSIZE
, 0, MAKELPARAM(prc
->right
- prc
->left
, HIWORD(btnSize
)));
1313 SetWindowPos(hwndStatic
, hwndShlFld
,
1315 prc
->top
+ sizeShlFldY
.cy
,
1316 prc
->right
- prc
->left
,
1317 sy
- sizeShlFldY
.cy
,
1319 DWORD btnSize
= SendMessage(hwndStatic
, TB_GETBUTTONSIZE
, 0, 0);
1320 SendMessage(hwndStatic
, TB_SETBUTTONSIZE
, 0, MAKELPARAM(prc
->right
- prc
->left
, HIWORD(btnSize
)));
1326 HRESULT STDMETHODCALLTYPE
CMenuBand::GetBandInfo(
1331 HWND hwndStatic
= NULL
;
1332 HWND hwndShlFld
= NULL
;
1333 HRESULT hResult
= S_OK
;
1335 if (m_staticToolbar
!= NULL
)
1336 hResult
= m_staticToolbar
->GetWindow(&hwndStatic
);
1337 if (FAILED(hResult
))
1340 if (m_SFToolbar
!= NULL
)
1341 hResult
= m_SFToolbar
->GetWindow(&hwndShlFld
);
1342 if (FAILED(hResult
))
1345 if (hwndStatic
== NULL
&& hwndShlFld
== NULL
)
1349 if (pdbi
->dwMask
== 0)
1351 pdbi
->dwMask
= DBIM_MINSIZE
| DBIM_MAXSIZE
| DBIM_INTEGRAL
| DBIM_ACTUAL
| DBIM_TITLE
| DBIM_MODEFLAGS
| DBIM_BKCOLOR
;
1354 if (pdbi
->dwMask
& DBIM_MINSIZE
)
1356 SIZE sizeStatic
= { 0 };
1357 SIZE sizeShlFld
= { 0 };
1359 if (hwndStatic
) SendMessageW(hwndStatic
, TB_GETIDEALSIZE
, TRUE
, (LPARAM
) &sizeStatic
);
1360 if (hwndShlFld
) SendMessageW(hwndShlFld
, TB_GETIDEALSIZE
, TRUE
, (LPARAM
) &sizeShlFld
);
1362 pdbi
->ptMinSize
.x
= 0;
1363 pdbi
->ptMinSize
.y
= sizeStatic
.cy
+ sizeShlFld
.cy
;
1365 if (pdbi
->dwMask
& DBIM_MAXSIZE
)
1367 SIZE sizeStatic
= { 0 };
1368 SIZE sizeShlFld
= { 0 };
1370 if (hwndStatic
) SendMessageW(hwndStatic
, TB_GETMAXSIZE
, 0, (LPARAM
) &sizeStatic
);
1371 if (hwndShlFld
) SendMessageW(hwndShlFld
, TB_GETMAXSIZE
, 0, (LPARAM
) &sizeShlFld
);
1373 pdbi
->ptMaxSize
.x
= sizeStatic
.cx
+ sizeShlFld
.cx
; // ignored
1374 pdbi
->ptMaxSize
.y
= sizeStatic
.cy
+ sizeShlFld
.cy
;
1376 if (pdbi
->dwMask
& DBIM_INTEGRAL
)
1378 pdbi
->ptIntegral
.x
= 0;
1379 pdbi
->ptIntegral
.y
= 0;
1381 if (pdbi
->dwMask
& DBIM_ACTUAL
)
1383 SIZE sizeStatic
= { 0 };
1384 SIZE sizeShlFld
= { 0 };
1386 if (hwndStatic
) SendMessageW(hwndStatic
, TB_GETIDEALSIZE
, FALSE
, (LPARAM
) &sizeStatic
);
1387 if (hwndShlFld
) SendMessageW(hwndShlFld
, TB_GETIDEALSIZE
, FALSE
, (LPARAM
) &sizeShlFld
);
1388 pdbi
->ptActual
.x
= sizeStatic
.cx
+ sizeShlFld
.cx
;
1390 if (hwndStatic
) SendMessageW(hwndStatic
, TB_GETIDEALSIZE
, TRUE
, (LPARAM
) &sizeStatic
);
1391 if (hwndShlFld
) SendMessageW(hwndShlFld
, TB_GETIDEALSIZE
, TRUE
, (LPARAM
) &sizeShlFld
);
1392 pdbi
->ptActual
.y
= sizeStatic
.cy
+ sizeShlFld
.cy
;
1394 if (pdbi
->dwMask
& DBIM_TITLE
)
1395 wcscpy(pdbi
->wszTitle
, L
"");
1396 if (pdbi
->dwMask
& DBIM_MODEFLAGS
)
1397 pdbi
->dwModeFlags
= DBIMF_UNDELETEABLE
;
1398 if (pdbi
->dwMask
& DBIM_BKCOLOR
)
1403 /* IDockingWindow */
1404 HRESULT STDMETHODCALLTYPE
CMenuBand::ShowDW(BOOL fShow
)
1408 if (m_staticToolbar
!= NULL
)
1409 hr
= m_staticToolbar
->ShowWindow(fShow
);
1412 if (m_SFToolbar
!= NULL
)
1413 hr
= m_SFToolbar
->ShowWindow(fShow
);
1418 return _CallCB(SMC_INITMENU
, 0, 0);
1423 HRESULT STDMETHODCALLTYPE
CMenuBand::CloseDW(DWORD dwReserved
)
1427 if (m_staticToolbar
!= NULL
)
1428 return m_staticToolbar
->Close();
1430 if (m_SFToolbar
!= NULL
)
1431 return m_SFToolbar
->Close();
1435 HRESULT STDMETHODCALLTYPE
CMenuBand::ResizeBorderDW(LPCRECT prcBorder
, IUnknown
*punkToolbarSite
, BOOL fReserved
)
1441 HRESULT STDMETHODCALLTYPE
CMenuBand::ContextSensitiveHelp(BOOL fEnterMode
)
1447 HRESULT STDMETHODCALLTYPE
CMenuBand::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
1453 HRESULT STDMETHODCALLTYPE
CMenuBand::HasFocusIO()
1459 HRESULT STDMETHODCALLTYPE
CMenuBand::TranslateAcceleratorIO(LPMSG lpMsg
)
1465 HRESULT STDMETHODCALLTYPE
CMenuBand::IsDirty()
1471 HRESULT STDMETHODCALLTYPE
CMenuBand::Load(IStream
*pStm
)
1477 HRESULT STDMETHODCALLTYPE
CMenuBand::Save(IStream
*pStm
, BOOL fClearDirty
)
1483 HRESULT STDMETHODCALLTYPE
CMenuBand::GetSizeMax(ULARGE_INTEGER
*pcbSize
)
1489 HRESULT STDMETHODCALLTYPE
CMenuBand::GetClassID(CLSID
*pClassID
)
1495 HRESULT STDMETHODCALLTYPE
CMenuBand::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
1501 HRESULT STDMETHODCALLTYPE
CMenuBand::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1506 if (IsEqualGUID(*pguidCmdGroup
, CLSID_MenuBand
))
1508 if (nCmdID
== 16) // set (big) icon size
1510 this->m_useBigIcons
= TRUE
;
1513 else if (nCmdID
== 19) // popup-related
1523 HRESULT STDMETHODCALLTYPE
CMenuBand::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
1525 if (IsEqualIID(guidService
, SID_SMenuBandChild
))
1526 return this->QueryInterface(riid
, ppvObject
);
1527 WARN("Unknown service requested %s\n", wine_dbgstr_guid(&guidService
));
1528 return E_NOINTERFACE
;
1531 HRESULT STDMETHODCALLTYPE
CMenuBand::Popup(POINTL
*ppt
, RECTL
*prcExclude
, MP_POPUPFLAGS dwFlags
)
1537 HRESULT STDMETHODCALLTYPE
CMenuBand::OnSelect(DWORD dwSelectType
)
1543 HRESULT STDMETHODCALLTYPE
CMenuBand::SetSubMenu(IMenuPopup
*pmp
, BOOL fSet
)
1549 HRESULT STDMETHODCALLTYPE
CMenuBand::SetClient(IUnknown
*punkClient
)
1555 HRESULT STDMETHODCALLTYPE
CMenuBand::GetClient(IUnknown
**ppunkClient
)
1561 HRESULT STDMETHODCALLTYPE
CMenuBand::IsMenuMessage(MSG
*pmsg
)
1569 HRESULT STDMETHODCALLTYPE
CMenuBand::TranslateMenuMessage(MSG
*pmsg
, LRESULT
*plRet
)
1575 HRESULT STDMETHODCALLTYPE
CMenuBand::SetShellFolder(IShellFolder
*psf
, LPCITEMIDLIST pidlFolder
, HKEY hKey
, DWORD dwFlags
)
1577 if (m_SFToolbar
== NULL
)
1579 m_SFToolbar
= new CMenuSFToolbar(this);
1582 HRESULT hResult
= m_SFToolbar
->SetShellFolder(psf
, pidlFolder
, hKey
, dwFlags
);
1583 if (FAILED(hResult
))
1590 hResult
= m_site
->GetWindow(&hwndParent
);
1591 if (FAILED(hResult
))
1594 hResult
= m_SFToolbar
->CreateToolbar(hwndParent
, m_dwFlags
);
1595 if (FAILED(hResult
))
1598 hResult
= m_SFToolbar
->FillToolbar();
1604 HRESULT STDMETHODCALLTYPE
CMenuBand::GetShellFolder(DWORD
*pdwFlags
, LPITEMIDLIST
*ppidl
, REFIID riid
, void **ppv
)
1607 return m_SFToolbar
->GetShellFolder(pdwFlags
, ppidl
, riid
, ppv
);
1611 HRESULT STDMETHODCALLTYPE
CMenuBand::InvalidateItem(LPSMDATA psmd
, DWORD dwFlags
)
1617 HRESULT STDMETHODCALLTYPE
CMenuBand::GetState(LPSMDATA psmd
)
1623 HRESULT STDMETHODCALLTYPE
CMenuBand::SetMenuToolbar(IUnknown
*punk
, DWORD dwFlags
)
1629 HRESULT STDMETHODCALLTYPE
CMenuBand::OnWinEvent(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
1631 HWND hwndStatic
= NULL
;
1632 HWND hwndShlFld
= NULL
;
1640 if (m_staticToolbar
!= NULL
)
1641 hr
= m_staticToolbar
->GetWindow(&hwndStatic
);
1645 if (hWnd
== hwndStatic
)
1647 return m_staticToolbar
->OnCommand(wParam
, lParam
, theResult
);
1650 if (m_SFToolbar
!= NULL
)
1651 hr
= m_SFToolbar
->GetWindow(&hwndShlFld
);
1655 if (hWnd
== hwndShlFld
)
1657 return m_SFToolbar
->OnCommand(wParam
, lParam
, theResult
);
1662 NMHDR
* hdr
= (LPNMHDR
) lParam
;
1663 NMTBCUSTOMDRAW
* cdraw
;
1667 cdraw
= (LPNMTBCUSTOMDRAW
) hdr
;
1668 switch (cdraw
->nmcd
.dwDrawStage
)
1671 *theResult
= CDRF_NOTIFYITEMDRAW
;
1674 case CDDS_ITEMPREPAINT
:
1676 cdraw
->clrBtnFace
= GetSysColor(COLOR_MENU
);
1677 cdraw
->clrBtnHighlight
= GetSysColor(COLOR_MENUHILIGHT
);
1679 cdraw
->clrText
= GetSysColor(COLOR_MENUTEXT
);
1680 cdraw
->clrTextHighlight
= GetSysColor(COLOR_HIGHLIGHTTEXT
);
1681 cdraw
->clrHighlightHotTrack
= GetSysColor(COLOR_HIGHLIGHTTEXT
);
1683 RECT rc
= cdraw
->nmcd
.rc
;
1684 HDC hdc
= cdraw
->nmcd
.hdc
;
1686 HBRUSH bgBrush
= GetSysColorBrush(COLOR_MENU
);
1687 HBRUSH hotBrush
= GetSysColorBrush(COLOR_MENUHILIGHT
);
1689 switch (cdraw
->nmcd
.uItemState
)
1693 FillRect(hdc
, &rc
, hotBrush
);
1696 FillRect(hdc
, &rc
, bgBrush
);
1700 *theResult
= TBCDRF_NOBACKGROUND
| TBCDRF_NOEDGES
| TBCDRF_NOETCHEDEFFECT
| TBCDRF_HILITEHOTTRACK
;
1711 HRESULT STDMETHODCALLTYPE
CMenuBand::IsWindowOwner(HWND hWnd
)
1713 HWND hwndStatic
= NULL
;
1714 HWND hwndShlFld
= NULL
;
1717 if (m_staticToolbar
!= NULL
)
1718 hr
= m_staticToolbar
->GetWindow(&hwndStatic
);
1722 if (hWnd
== hwndStatic
)
1725 if (m_SFToolbar
!= NULL
)
1726 hr
= m_SFToolbar
->GetWindow(&hwndShlFld
);
1730 if (hWnd
== hwndShlFld
)
1736 HRESULT STDMETHODCALLTYPE
CMenuBand::GetSubMenu(THIS
)
1742 HRESULT STDMETHODCALLTYPE
CMenuBand::SetToolbar(THIS
)
1748 HRESULT STDMETHODCALLTYPE
CMenuBand::SetMinWidth(THIS
)
1754 HRESULT STDMETHODCALLTYPE
CMenuBand::SetNoBorder(THIS
)
1760 HRESULT STDMETHODCALLTYPE
CMenuBand::SetTheme(THIS
)
1766 HRESULT STDMETHODCALLTYPE
CMenuBand::GetTop(THIS
)
1772 HRESULT STDMETHODCALLTYPE
CMenuBand::GetBottom(THIS
)
1778 HRESULT STDMETHODCALLTYPE
CMenuBand::GetTracked(THIS
)
1784 HRESULT STDMETHODCALLTYPE
CMenuBand::GetParentSite(THIS
)
1790 HRESULT STDMETHODCALLTYPE
CMenuBand::GetState(THIS
)
1796 HRESULT STDMETHODCALLTYPE
CMenuBand::DoDefaultAction(THIS
)
1802 HRESULT STDMETHODCALLTYPE
CMenuBand::IsEmpty(THIS
)
1808 HRESULT
CMenuBand::CallCBWithId(UINT Id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1816 SMDATA smData
= { 0 };
1817 smData
.punk
= (IShellMenu2
*)this;
1819 smData
.uIdParent
= m_uId
;
1820 smData
.uIdAncestor
= m_uIdAncestor
;
1822 if (m_staticToolbar
)
1824 smData
.hmenu
= m_hmenu
;
1826 smData
.pvUserData
= NULL
;
1828 m_SFToolbar
->GetShellFolder(NULL
, &smData
.pidlFolder
, IID_PPV_ARG(IShellFolder
, &smData
.psf
));
1829 HRESULT hr
= m_psmc
->CallbackSM(&smData
, uMsg
, wParam
, lParam
);
1830 ILFree(smData
.pidlFolder
);
1832 smData
.psf
->Release();
1836 HRESULT
CMenuBand::_CallCB(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1844 SMDATA smData
= { 0 };
1845 smData
.punk
= (IShellMenu2
*)this;
1846 smData
.uIdParent
= m_uId
;
1847 smData
.uIdAncestor
= m_uIdAncestor
;
1849 if (m_staticToolbar
)
1851 smData
.hmenu
= m_hmenu
;
1853 smData
.pvUserData
= NULL
;
1855 m_SFToolbar
->GetShellFolder(NULL
, &smData
.pidlFolder
, IID_PPV_ARG(IShellFolder
, &smData
.psf
));
1856 HRESULT hr
= m_psmc
->CallbackSM(&smData
, uMsg
, wParam
, lParam
);
1857 ILFree(smData
.pidlFolder
);
1859 smData
.psf
->Release();