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
24 WINE_DEFAULT_DEBUG_CHANNEL(CMenuBand
);
28 #define TBSTYLE_EX_VERTICAL 4
30 #define TIMERID_HOTTRACK 1
31 #define SUBCLASS_ID_MENUBAND 1
33 extern "C" BOOL WINAPI
Shell_GetImageLists(HIMAGELIST
* lpBigList
, HIMAGELIST
* lpSmallList
);
37 class CMenuToolbarBase
40 CMenuToolbarBase(CMenuBand
*menuBand
);
41 virtual ~CMenuToolbarBase() {}
43 HRESULT
CreateToolbar(HWND hwndParent
, DWORD dwFlags
);
44 HRESULT
GetWindow(HWND
*phwnd
);
45 HRESULT
ShowWindow(BOOL fShow
);
48 BOOL
IsWindowOwner(HWND hwnd
) { return m_hwnd
&& m_hwnd
== hwnd
; }
50 virtual HRESULT
FillToolbar() = 0;
51 virtual HRESULT
PopupItem(UINT uItem
) = 0;
52 virtual HRESULT
HasSubMenu(UINT uItem
) = 0;
53 virtual HRESULT
OnCommand(WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
);
54 virtual HRESULT
OnContextMenu(NMMOUSE
* rclick
) = 0;
56 HRESULT
OnHotItemChange(const NMTBHOTITEM
* hot
);
58 HRESULT
PopupSubMenu(UINT index
, IShellMenu
* childShellMenu
);
59 HRESULT
DoContextMenu(IContextMenu
* contextMenu
);
61 static LRESULT CALLBACK
s_SubclassProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
64 static const UINT WM_USER_SHOWPOPUPMENU
= WM_USER
+ 1;
66 LRESULT CALLBACK
SubclassProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
68 CMenuBand
*m_menuBand
;
72 WNDPROC m_SubclassOld
;
75 class CMenuStaticToolbar
: public CMenuToolbarBase
78 CMenuStaticToolbar(CMenuBand
*menuBand
);
79 virtual ~CMenuStaticToolbar() {}
81 HRESULT
SetMenu(HMENU hmenu
, HWND hwnd
, DWORD dwFlags
);
82 HRESULT
GetMenu(HMENU
*phmenu
, HWND
*phwnd
, DWORD
*pdwFlags
);
84 virtual HRESULT
FillToolbar();
85 virtual HRESULT
PopupItem(UINT uItem
);
86 virtual HRESULT
HasSubMenu(UINT uItem
);
87 virtual HRESULT
OnCommand(WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
);
88 virtual HRESULT
OnContextMenu(NMMOUSE
* rclick
);
94 class CMenuSFToolbar
: public CMenuToolbarBase
97 CMenuSFToolbar(CMenuBand
*menuBand
);
98 virtual ~CMenuSFToolbar();
100 HRESULT
SetShellFolder(IShellFolder
*psf
, LPCITEMIDLIST pidlFolder
, HKEY hKey
, DWORD dwFlags
);
101 HRESULT
GetShellFolder(DWORD
*pdwFlags
, LPITEMIDLIST
*ppidl
, REFIID riid
, void **ppv
);
103 virtual HRESULT
FillToolbar();
104 virtual HRESULT
PopupItem(UINT uItem
);
105 virtual HRESULT
HasSubMenu(UINT uItem
);
106 virtual HRESULT
OnCommand(WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
);
107 virtual HRESULT
OnContextMenu(NMMOUSE
* rclick
);
110 LPITEMIDLIST
GetPidlFromId(UINT uItem
, INT
* pIndex
);
112 IShellFolder
* m_shellFolder
;
113 LPCITEMIDLIST m_idList
;
118 public CComCoClass
<CMenuBand
>,
119 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
121 public IObjectWithSite
,
123 public IPersistStream
,
124 public IOleCommandTarget
,
125 public IServiceProvider
,
129 public IWinEventHandler
,
138 IUnknown
* m_IUnknown
;
139 IDeskBand
* m_IDeskBand
;
140 IDockingWindow
* m_IDockingWindow
;
141 IOleWindow
* m_IOleWindow
;
142 IObjectWithSite
* m_IObjectWithSite
;
143 IInputObject
* m_IInputObject
;
144 IPersistStream
* m_IPersistStream
;
145 IPersist
* m_IPersist
;
146 IOleCommandTarget
* m_IOleCommandTarget
;
147 IServiceProvider
* m_IServiceProvider
;
148 IMenuPopup
* m_IMenuPopup
;
149 IDeskBar
* m_IDeskBar
;
150 IMenuBand
* m_IMenuBand
;
151 IShellMenu2
* m_IShellMenu2
;
152 IShellMenu
* m_IShellMenu
;
153 IWinEventHandler
* m_IWinEventHandler
;
154 IShellMenuAcc
* m_IShellMenuAcc
;
157 IShellMenuCallback
*m_psmc
;
159 CMenuStaticToolbar
*m_staticToolbar
;
160 CMenuSFToolbar
*m_SFToolbar
;
173 // *** IDeskBand methods ***
174 virtual HRESULT STDMETHODCALLTYPE
GetBandInfo(DWORD dwBandID
, DWORD dwViewMode
, DESKBANDINFO
*pdbi
);
176 // *** IDockingWindow methods ***
177 virtual HRESULT STDMETHODCALLTYPE
ShowDW(BOOL fShow
);
178 virtual HRESULT STDMETHODCALLTYPE
CloseDW(DWORD dwReserved
);
179 virtual HRESULT STDMETHODCALLTYPE
ResizeBorderDW(LPCRECT prcBorder
, IUnknown
*punkToolbarSite
, BOOL fReserved
);
181 // *** IOleWindow methods ***
182 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*phwnd
);
183 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
185 // *** IObjectWithSite methods ***
186 virtual HRESULT STDMETHODCALLTYPE
SetSite(IUnknown
*pUnkSite
);
187 virtual HRESULT STDMETHODCALLTYPE
GetSite(REFIID riid
, PVOID
*ppvSite
);
189 // *** IInputObject methods ***
190 virtual HRESULT STDMETHODCALLTYPE
UIActivateIO(BOOL fActivate
, LPMSG lpMsg
);
191 virtual HRESULT STDMETHODCALLTYPE
HasFocusIO();
192 virtual HRESULT STDMETHODCALLTYPE
TranslateAcceleratorIO(LPMSG lpMsg
);
194 // *** IPersistStream methods ***
195 virtual HRESULT STDMETHODCALLTYPE
IsDirty();
196 virtual HRESULT STDMETHODCALLTYPE
Load(IStream
*pStm
);
197 virtual HRESULT STDMETHODCALLTYPE
Save(IStream
*pStm
, BOOL fClearDirty
);
198 virtual HRESULT STDMETHODCALLTYPE
GetSizeMax(ULARGE_INTEGER
*pcbSize
);
200 // *** IPersist methods ***
201 virtual HRESULT STDMETHODCALLTYPE
GetClassID(CLSID
*pClassID
);
203 // *** IOleCommandTarget methods ***
204 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
);
205 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
207 // *** IServiceProvider methods ***
208 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
210 // *** IMenuPopup methods ***
211 virtual HRESULT STDMETHODCALLTYPE
Popup(POINTL
*ppt
, RECTL
*prcExclude
, MP_POPUPFLAGS dwFlags
);
212 virtual HRESULT STDMETHODCALLTYPE
OnSelect(DWORD dwSelectType
);
213 virtual HRESULT STDMETHODCALLTYPE
SetSubMenu(IMenuPopup
*pmp
, BOOL fSet
);
215 // *** IDeskBar methods ***
216 virtual HRESULT STDMETHODCALLTYPE
SetClient(IUnknown
*punkClient
);
217 virtual HRESULT STDMETHODCALLTYPE
GetClient(IUnknown
**ppunkClient
);
218 virtual HRESULT STDMETHODCALLTYPE
OnPosRectChangeDB(RECT
*prc
);
220 // *** IMenuBand methods ***
221 virtual HRESULT STDMETHODCALLTYPE
IsMenuMessage(MSG
*pmsg
);
222 virtual HRESULT STDMETHODCALLTYPE
TranslateMenuMessage(MSG
*pmsg
, LRESULT
*plRet
);
224 // *** IShellMenu methods ***
225 virtual HRESULT STDMETHODCALLTYPE
Initialize(IShellMenuCallback
*psmc
, UINT uId
, UINT uIdAncestor
, DWORD dwFlags
);
226 virtual HRESULT STDMETHODCALLTYPE
GetMenuInfo(IShellMenuCallback
**ppsmc
, UINT
*puId
, UINT
*puIdAncestor
, DWORD
*pdwFlags
);
227 virtual HRESULT STDMETHODCALLTYPE
SetShellFolder(IShellFolder
*psf
, LPCITEMIDLIST pidlFolder
, HKEY hKey
, DWORD dwFlags
);
228 virtual HRESULT STDMETHODCALLTYPE
GetShellFolder(DWORD
*pdwFlags
, LPITEMIDLIST
*ppidl
, REFIID riid
, void **ppv
);
229 virtual HRESULT STDMETHODCALLTYPE
SetMenu(HMENU hmenu
, HWND hwnd
, DWORD dwFlags
);
230 virtual HRESULT STDMETHODCALLTYPE
GetMenu(HMENU
*phmenu
, HWND
*phwnd
, DWORD
*pdwFlags
);
231 virtual HRESULT STDMETHODCALLTYPE
InvalidateItem(LPSMDATA psmd
, DWORD dwFlags
);
232 virtual HRESULT STDMETHODCALLTYPE
GetState(LPSMDATA psmd
);
233 virtual HRESULT STDMETHODCALLTYPE
SetMenuToolbar(IUnknown
*punk
, DWORD dwFlags
);
235 // *** IWinEventHandler methods ***
236 virtual HRESULT STDMETHODCALLTYPE
OnWinEvent(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
);
237 virtual HRESULT STDMETHODCALLTYPE
IsWindowOwner(HWND hWnd
);
239 // *** IShellMenu2 methods ***
240 virtual HRESULT STDMETHODCALLTYPE
GetSubMenu(THIS
);
241 virtual HRESULT STDMETHODCALLTYPE
SetToolbar(THIS
);
242 virtual HRESULT STDMETHODCALLTYPE
SetMinWidth(THIS
);
243 virtual HRESULT STDMETHODCALLTYPE
SetNoBorder(THIS
);
244 virtual HRESULT STDMETHODCALLTYPE
SetTheme(THIS
);
246 // *** IShellMenuAcc methods ***
247 virtual HRESULT STDMETHODCALLTYPE
GetTop(THIS
);
248 virtual HRESULT STDMETHODCALLTYPE
GetBottom(THIS
);
249 virtual HRESULT STDMETHODCALLTYPE
GetTracked(THIS
);
250 virtual HRESULT STDMETHODCALLTYPE
GetParentSite(THIS
);
251 virtual HRESULT STDMETHODCALLTYPE
GetState(THIS
);
252 virtual HRESULT STDMETHODCALLTYPE
DoDefaultAction(THIS
);
253 virtual HRESULT STDMETHODCALLTYPE
IsEmpty(THIS
);
255 HRESULT
CallCBWithId(UINT Id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
256 HRESULT
CallCBWithPidl(LPITEMIDLIST pidl
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
259 return m_useBigIcons
;
262 DECLARE_NOT_AGGREGATABLE(CMenuBand
)
263 DECLARE_PROTECT_FINAL_CONSTRUCT()
265 BEGIN_COM_MAP(CMenuBand
)
266 COM_INTERFACE_ENTRY_IID(IID_IDeskBar
, IMenuPopup
)
267 COM_INTERFACE_ENTRY_IID(IID_IShellMenu
, IShellMenu
)
268 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
269 COM_INTERFACE_ENTRY_IID(IID_IOleWindow
, IDeskBand
)
270 COM_INTERFACE_ENTRY_IID(IID_IDockingWindow
, IDockingWindow
)
271 COM_INTERFACE_ENTRY_IID(IID_IDeskBand
, IDeskBand
)
272 COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite
, IObjectWithSite
)
273 COM_INTERFACE_ENTRY_IID(IID_IInputObject
, IInputObject
)
274 COM_INTERFACE_ENTRY_IID(IID_IPersistStream
, IPersistStream
)
275 COM_INTERFACE_ENTRY_IID(IID_IPersist
, IPersistStream
)
276 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
277 COM_INTERFACE_ENTRY_IID(IID_IMenuPopup
, IMenuPopup
)
278 COM_INTERFACE_ENTRY_IID(IID_IMenuBand
, IMenuBand
)
279 COM_INTERFACE_ENTRY_IID(IID_IShellMenu2
, IShellMenu2
)
280 COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler
, IWinEventHandler
)
281 COM_INTERFACE_ENTRY_IID(IID_IShellMenuAcc
, IShellMenuAcc
)
285 HRESULT
_CallCB(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, UINT id
= 0, LPITEMIDLIST pidl
= NULL
);
289 HRESULT
CMenuBand_Constructor(REFIID riid
, LPVOID
*ppv
)
293 CMenuBand
* site
= new CComObject
<CMenuBand
>();
296 return E_OUTOFMEMORY
;
298 HRESULT hr
= site
->QueryInterface(riid
, ppv
);
308 CMenuBand::CMenuBand()
313 hr
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IShellMenu
, &m_IShellMenu
));
314 hr
= m_IShellMenu
->QueryInterface(IID_PPV_ARG(IUnknown
, &m_IUnknown
));
315 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IDeskBand
, &m_IDeskBand
));
316 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &m_IDockingWindow
));
317 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IOleWindow
, &m_IOleWindow
));
318 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &m_IObjectWithSite
));
319 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IInputObject
, &m_IInputObject
));
320 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IPersistStream
, &m_IPersistStream
));
321 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IPersist
, &m_IPersist
));
322 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &m_IOleCommandTarget
));
323 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &m_IServiceProvider
));
324 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IMenuPopup
, &m_IMenuPopup
));
325 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IDeskBar
, &m_IDeskBar
));
326 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IMenuBand
, &m_IMenuBand
));
327 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IShellMenu2
, &m_IShellMenu2
));
328 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &m_IWinEventHandler
));
329 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IShellMenuAcc
, &m_IShellMenuAcc
));
332 CMenuBand::~CMenuBand()
334 m_IUnknown
->Release();
335 m_IDeskBand
->Release();
336 m_IDockingWindow
->Release();
337 m_IOleWindow
->Release();
338 m_IObjectWithSite
->Release();
339 m_IInputObject
->Release();
340 m_IPersistStream
->Release();
341 m_IPersist
->Release();
342 m_IOleCommandTarget
->Release();
343 m_IServiceProvider
->Release();
344 m_IMenuPopup
->Release();
345 m_IDeskBar
->Release();
346 m_IMenuBand
->Release();
347 m_IShellMenu2
->Release();
348 m_IShellMenu
->Release();
349 m_IWinEventHandler
->Release();
350 m_IShellMenuAcc
->Release();
355 // *** IShellMenu2 methods ***
356 HRESULT STDMETHODCALLTYPE
CMenuBand::GetSubMenu(THIS
)
358 WrapLogEnter("CMenuBand<%p>::GetSubMenu()\n", this);
359 HRESULT hr
= m_IShellMenu2
->GetSubMenu();
360 WrapLogExit("CMenuBand::GetSubMenu() = %08x\n", hr
);
364 HRESULT STDMETHODCALLTYPE
CMenuBand::SetToolbar(THIS
)
366 WrapLogEnter("CMenuBand<%p>::SetToolbar()\n", this);
367 HRESULT hr
= m_IShellMenu2
->SetToolbar();
368 WrapLogExit("CMenuBand::SetToolbar() = %08x\n", hr
);
372 HRESULT STDMETHODCALLTYPE
CMenuBand::SetMinWidth(THIS
)
374 WrapLogEnter("CMenuBand<%p>::SetMinWidth()\n", this);
375 HRESULT hr
= m_IShellMenu2
->SetMinWidth();
376 WrapLogExit("CMenuBand::SetMinWidth() = %08x\n", hr
);
380 HRESULT STDMETHODCALLTYPE
CMenuBand::SetNoBorder(THIS
)
382 WrapLogEnter("CMenuBand<%p>::SetNoBorder()\n", this);
383 HRESULT hr
= m_IShellMenu2
->SetNoBorder();
384 WrapLogExit("CMenuBand::SetNoBorder() = %08x\n", hr
);
388 HRESULT STDMETHODCALLTYPE
CMenuBand::SetTheme(THIS
)
390 WrapLogEnter("CMenuBand<%p>::SetTheme()\n", this);
391 HRESULT hr
= m_IShellMenu2
->SetTheme();
392 WrapLogExit("CMenuBand::SetTheme() = %08x\n", hr
);
397 // *** IShellMenuAcc methods ***
398 HRESULT STDMETHODCALLTYPE
CMenuBand::GetTop(THIS
)
400 WrapLogEnter("CMenuBand<%p>::GetTop()\n", this);
401 HRESULT hr
= m_IShellMenuAcc
->GetTop();
402 WrapLogExit("CMenuBand::GetTop() = %08x\n", hr
);
406 HRESULT STDMETHODCALLTYPE
CMenuBand::GetBottom(THIS
)
408 WrapLogEnter("CMenuBand<%p>::GetBottom()\n", this);
409 HRESULT hr
= m_IShellMenuAcc
->GetBottom();
410 WrapLogExit("CMenuBand::GetBottom() = %08x\n", hr
);
414 HRESULT STDMETHODCALLTYPE
CMenuBand::GetTracked(THIS
)
416 WrapLogEnter("CMenuBand<%p>::GetBottom()\n", this);
417 HRESULT hr
= m_IShellMenuAcc
->GetBottom();
418 WrapLogExit("CMenuBand::GetBottom() = %08x\n", hr
);
422 HRESULT STDMETHODCALLTYPE
CMenuBand::GetParentSite(THIS
)
424 WrapLogEnter("CMenuBand<%p>::GetBottom()\n", this);
425 HRESULT hr
= m_IShellMenuAcc
->GetBottom();
426 WrapLogExit("CMenuBand::GetBottom() = %08x\n", hr
);
430 HRESULT STDMETHODCALLTYPE
CMenuBand::GetState(THIS
)
432 WrapLogEnter("CMenuBand<%p>::GetBottom()\n", this);
433 HRESULT hr
= m_IShellMenuAcc
->GetBottom();
434 WrapLogExit("CMenuBand::GetBottom() = %08x\n", hr
);
438 HRESULT STDMETHODCALLTYPE
CMenuBand::DoDefaultAction(THIS
)
440 WrapLogEnter("CMenuBand<%p>::GetBottom()\n", this);
441 HRESULT hr
= m_IShellMenuAcc
->GetBottom();
442 WrapLogExit("CMenuBand::GetBottom() = %08x\n", hr
);
446 HRESULT STDMETHODCALLTYPE
CMenuBand::IsEmpty(THIS
)
448 WrapLogEnter("CMenuBand<%p>::GetBottom()\n", this);
449 HRESULT hr
= m_IShellMenuAcc
->GetBottom();
450 WrapLogExit("CMenuBand::GetBottom() = %08x\n", hr
);
454 // *** IDeskBand methods ***
455 HRESULT STDMETHODCALLTYPE
CMenuBand::GetBandInfo(DWORD dwBandID
, DWORD dwViewMode
, DESKBANDINFO
*pdbi
)
457 WrapLogEnter("CMenuBand<%p>::GetBandInfo(DWORD dwBandID=%d, DWORD dwViewMode=%d, DESKBANDINFO *pdbi=%p)\n", this, dwBandID
, dwViewMode
, pdbi
);
458 HRESULT hr
= m_IDeskBand
->GetBandInfo(dwBandID
, dwViewMode
, pdbi
);
459 WrapLogExit("CMenuBand::GetBandInfo() = %08x\n", hr
);
463 // *** IDockingWindow methods ***
464 HRESULT STDMETHODCALLTYPE
CMenuBand::ShowDW(BOOL fShow
)
466 WrapLogEnter("CMenuBand<%p>::ShowDW(BOOL fShow=%d)\n", this, fShow
);
467 HRESULT hr
= m_IDockingWindow
->ShowDW(fShow
);
468 WrapLogExit("CMenuBand::ShowDW() = %08x\n", hr
);
472 HRESULT STDMETHODCALLTYPE
CMenuBand::CloseDW(DWORD dwReserved
)
474 WrapLogEnter("CMenuBand<%p>::CloseDW(DWORD dwReserved=%d)\n", this, dwReserved
);
475 HRESULT hr
= m_IDockingWindow
->CloseDW(dwReserved
);
476 WrapLogExit("CMenuBand::CloseDW() = %08x\n", hr
);
480 HRESULT STDMETHODCALLTYPE
CMenuBand::ResizeBorderDW(LPCRECT prcBorder
, IUnknown
*punkToolbarSite
, BOOL fReserved
)
482 WrapLogEnter("CMenuBand<%p>::ResizeBorderDW(LPCRECT prcBorder=%p, IUnknown *punkToolbarSite=%p, BOOL fReserved=%d)\n", this, prcBorder
, punkToolbarSite
, fReserved
);
483 if (prcBorder
) WrapLogMsg("*prcBorder=%s\n", Wrap(*prcBorder
));
484 HRESULT hr
= m_IDockingWindow
->ResizeBorderDW(prcBorder
, punkToolbarSite
, fReserved
);
485 if (prcBorder
) WrapLogMsg("*prcBorder=%s\n", Wrap(*prcBorder
));
486 WrapLogExit("CMenuBand::ResizeBorderDW() = %08x\n", hr
);
490 // *** IOleWindow methods ***
491 HRESULT STDMETHODCALLTYPE
CMenuBand::GetWindow(HWND
*phwnd
)
493 WrapLogEnter("CMenuBand<%p>::GetWindow(HWND *phwnd=%p)\n", this, phwnd
);
494 HRESULT hr
= m_IOleWindow
->GetWindow(phwnd
);
495 if (phwnd
) WrapLogMsg("*phwnd=%p\n", *phwnd
);
496 WrapLogExit("CMenuBand::GetWindow() = %08x\n", hr
);
499 HRESULT STDMETHODCALLTYPE
CMenuBand::ContextSensitiveHelp(BOOL fEnterMode
)
501 WrapLogEnter("CMenuBand<%p>::ContextSensitiveHelp(BOOL fEnterMode=%d)\n", this, fEnterMode
);
502 HRESULT hr
= m_IOleWindow
->ContextSensitiveHelp(fEnterMode
);
503 WrapLogExit("CMenuBand::ContextSensitiveHelp() = %08x\n", hr
);
507 // *** IWinEventHandler methods ***
508 HRESULT STDMETHODCALLTYPE
CMenuBand::OnWinEvent(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
510 //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);
511 HRESULT hr
= m_IWinEventHandler
->OnWinEvent(hWnd
, uMsg
, wParam
, lParam
, theResult
);
512 //WrapLogExit("CMenuBand::OnWinEvent() = %08x\n", hr);
516 HRESULT STDMETHODCALLTYPE
CMenuBand::IsWindowOwner(HWND hWnd
)
518 //WrapLogEnter("CMenuBand<%p>::IsWindowOwner(HWND hWnd=%08x)\n", this, hWnd);
519 HRESULT hr
= m_IWinEventHandler
->IsWindowOwner(hWnd
);
520 //WrapLogExit("CMenuBand::IsWindowOwner() = %08x\n", hr);
524 // *** IObjectWithSite methods ***
525 HRESULT STDMETHODCALLTYPE
CMenuBand::SetSite(IUnknown
*pUnkSite
)
527 WrapLogEnter("CMenuBand<%p>::SetSite(IUnknown *pUnkSite=%p)\n", this, pUnkSite
);
528 HRESULT hr
= m_IObjectWithSite
->SetSite(pUnkSite
);
529 WrapLogExit("CMenuBand::SetSite() = %08x\n", hr
);
533 HRESULT STDMETHODCALLTYPE
CMenuBand::GetSite(REFIID riid
, PVOID
*ppvSite
)
535 WrapLogEnter("CMenuBand<%p>::GetSite(REFIID riid=%s, PVOID *ppvSite=%p)\n", this, Wrap(riid
), ppvSite
);
536 HRESULT hr
= m_IObjectWithSite
->GetSite(riid
, ppvSite
);
537 if (ppvSite
) WrapLogMsg("*ppvSite=%p\n", *ppvSite
);
538 WrapLogExit("CMenuBand::GetSite() = %08x\n", hr
);
542 // *** IInputObject methods ***
543 HRESULT STDMETHODCALLTYPE
CMenuBand::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
545 WrapLogEnter("CMenuBand<%p>::UIActivateIO(BOOL fActivate=%d, LPMSG lpMsg=%p)\n", this, fActivate
, lpMsg
);
546 HRESULT hr
= m_IInputObject
->UIActivateIO(fActivate
, lpMsg
);
547 WrapLogExit("CMenuBand::UIActivateIO() = %08x\n", hr
);
551 HRESULT STDMETHODCALLTYPE
CMenuBand::HasFocusIO()
553 WrapLogEnter("CMenuBand<%p>::HasFocusIO()\n", this);
554 HRESULT hr
= m_IInputObject
->HasFocusIO();
555 WrapLogExit("CMenuBand::HasFocusIO() = %08x\n", hr
);
559 HRESULT STDMETHODCALLTYPE
CMenuBand::TranslateAcceleratorIO(LPMSG lpMsg
)
561 WrapLogEnter("CMenuBand<%p>::TranslateAcceleratorIO(LPMSG lpMsg=%p)\n", this, lpMsg
);
562 if (lpMsg
) WrapLogMsg("*lpMsg=%s\n", Wrap(*lpMsg
));
563 HRESULT hr
= m_IInputObject
->TranslateAcceleratorIO(lpMsg
);
564 WrapLogExit("CMenuBand::TranslateAcceleratorIO() = %08x\n", hr
);
568 // *** IPersistStream methods ***
569 HRESULT STDMETHODCALLTYPE
CMenuBand::IsDirty()
571 WrapLogEnter("CMenuBand<%p>::IsDirty()\n", this);
572 HRESULT hr
= m_IPersistStream
->IsDirty();
573 WrapLogExit("CMenuBand::IsDirty() = %08x\n", hr
);
576 HRESULT STDMETHODCALLTYPE
CMenuBand::Load(IStream
*pStm
)
578 WrapLogEnter("CMenuBand<%p>::Load(IStream *pStm=%p)\n", this, pStm
);
579 HRESULT hr
= m_IPersistStream
->Load(pStm
);
580 WrapLogExit("CMenuBand::Load() = %08x\n", hr
);
583 HRESULT STDMETHODCALLTYPE
CMenuBand::Save(IStream
*pStm
, BOOL fClearDirty
)
585 WrapLogEnter("CMenuBand<%p>::Save(IStream *pStm=%p, BOOL fClearDirty=%d)\n", this, pStm
, fClearDirty
);
586 HRESULT hr
= m_IPersistStream
->Save(pStm
, fClearDirty
);
587 WrapLogExit("CMenuBand::Save() = %08x\n", hr
);
590 HRESULT STDMETHODCALLTYPE
CMenuBand::GetSizeMax(ULARGE_INTEGER
*pcbSize
)
592 WrapLogEnter("CMenuBand<%p>::GetSizeMax(ULARGE_INTEGER *pcbSize=%p)\n", this, pcbSize
);
593 HRESULT hr
= m_IPersistStream
->GetSizeMax(pcbSize
);
594 WrapLogExit("CMenuBand::GetSizeMax() = %08x\n", hr
);
598 // *** IPersist methods ***
599 HRESULT STDMETHODCALLTYPE
CMenuBand::GetClassID(CLSID
*pClassID
)
601 WrapLogEnter("CMenuBand<%p>::GetClassID(CLSID *pClassID=%p)\n", this, pClassID
);
602 HRESULT hr
= m_IPersist
->GetClassID(pClassID
);
603 if (pClassID
) WrapLogMsg("*pClassID=%s\n", Wrap(*pClassID
));
604 WrapLogExit("CMenuBand::GetClassID() = %08x\n", hr
);
608 // *** IOleCommandTarget methods ***
609 HRESULT STDMETHODCALLTYPE
CMenuBand::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
611 WrapLogEnter("CMenuBand<%p>::QueryStatus(const GUID *pguidCmdGroup=%p, ULONG cCmds=%u, prgCmds=%p, pCmdText=%p)\n", this, pguidCmdGroup
, cCmds
, prgCmds
, pCmdText
);
612 HRESULT hr
= m_IOleCommandTarget
->QueryStatus(pguidCmdGroup
, cCmds
, prgCmds
, pCmdText
);
613 if (pguidCmdGroup
) WrapLogMsg("*pguidCmdGroup=%s\n", Wrap(*pguidCmdGroup
));
614 WrapLogExit("CMenuBand::QueryStatus() = %08x\n", hr
);
618 HRESULT STDMETHODCALLTYPE
CMenuBand::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
622 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
);
624 if (pguidCmdGroup
&& IsEqualGUID(*pguidCmdGroup
, CLSID_MenuBand
))
626 if (nCmdID
== 19) // popup
633 if (pguidCmdGroup
) WrapLogMsg("*pguidCmdGroup=%s\n", Wrap(*pguidCmdGroup
));
634 HRESULT hr
= m_IOleCommandTarget
->Exec(pguidCmdGroup
, nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
635 WrapLogExit("CMenuBand::Exec() = %08x\n", hr
);
639 // *** IServiceProvider methods ***
640 HRESULT STDMETHODCALLTYPE
CMenuBand::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
642 WrapLogEnter("CMenuBand<%p>::QueryService(REFGUID guidService=%s, REFIID riid=%s, void **ppvObject=%p)\n", this, Wrap(guidService
), Wrap(riid
), ppvObject
);
644 if (IsEqualIID(guidService
, SID_SMenuBandChild
))
646 WrapLogMsg("SID is SID_SMenuBandChild. Using QueryInterface of self instead of wrapped object.\n");
647 HRESULT hr
= this->QueryInterface(riid
, ppvObject
);
648 if (ppvObject
) WrapLogMsg("*ppvObject=%p\n", *ppvObject
);
651 WrapLogExit("CMenuBand::QueryService() = %08x\n", hr
);
656 WrapLogMsg("QueryInterface on wrapper failed. Handing over to innter object.\n");
659 else if (IsEqualIID(guidService
, SID_SMenuBandBottom
))
661 WrapLogMsg("SID is SID_SMenuBandBottom. Using QueryInterface of self instead of wrapped object.\n");
662 HRESULT hr
= this->QueryInterface(riid
, ppvObject
);
663 if (ppvObject
) WrapLogMsg("*ppvObject=%p\n", *ppvObject
);
666 WrapLogExit("CMenuBand::QueryService() = %08x\n", hr
);
671 WrapLogMsg("QueryInterface on wrapper failed. Handing over to innter object.\n");
674 else if (IsEqualIID(guidService
, SID_SMenuBandBottomSelected
))
676 WrapLogMsg("SID is SID_SMenuBandBottomSelected. Using QueryInterface of self instead of wrapped object.\n");
677 HRESULT hr
= this->QueryInterface(riid
, ppvObject
);
678 if (ppvObject
) WrapLogMsg("*ppvObject=%p\n", *ppvObject
);
681 WrapLogExit("CMenuBand::QueryService() = %08x\n", hr
);
686 WrapLogMsg("QueryInterface on wrapper failed. Handing over to innter object.\n");
691 WrapLogMsg("SID not identified.\n");
693 HRESULT hr
= m_IServiceProvider
->QueryService(guidService
, riid
, ppvObject
);
694 if (ppvObject
) WrapLogMsg("*ppvObject=%p\n", *ppvObject
);
695 WrapLogExit("CMenuBand::QueryService() = %08x\n", hr
);
700 // *** IMenuPopup methods ***
701 HRESULT STDMETHODCALLTYPE
CMenuBand::Popup(POINTL
*ppt
, RECTL
*prcExclude
, MP_POPUPFLAGS dwFlags
)
703 WrapLogEnter("CMenuBand<%p>::Popup(POINTL *ppt=%p, RECTL *prcExclude=%p, MP_POPUPFLAGS dwFlags=%08x)\n", this, ppt
, prcExclude
, dwFlags
);
704 HRESULT hr
= m_IMenuPopup
->Popup(ppt
, prcExclude
, dwFlags
);
705 WrapLogExit("CMenuBand::Popup() = %08x\n", hr
);
709 HRESULT STDMETHODCALLTYPE
CMenuBand::OnSelect(DWORD dwSelectType
)
711 WrapLogEnter("CMenuBand<%p>::OnSelect(DWORD dwSelectType=%08x)\n", this, dwSelectType
);
712 HRESULT hr
= m_IMenuPopup
->OnSelect(dwSelectType
);
713 WrapLogExit("CMenuBand::OnSelect() = %08x\n", hr
);
717 HRESULT STDMETHODCALLTYPE
CMenuBand::SetSubMenu(IMenuPopup
*pmp
, BOOL fSet
)
719 WrapLogEnter("CMenuBand<%p>::SetSubMenu(IMenuPopup *pmp=%p, BOOL fSet=%d)\n", this, pmp
, fSet
);
720 HRESULT hr
= m_IMenuPopup
->SetSubMenu(pmp
, fSet
);
721 WrapLogExit("CMenuBand::SetSubMenu() = %08x\n", hr
);
726 // *** IDeskBar methods ***
727 HRESULT STDMETHODCALLTYPE
CMenuBand::SetClient(IUnknown
*punkClient
)
729 WrapLogEnter("CMenuBand<%p>::SetClient(IUnknown *punkClient=%p)\n", this, punkClient
);
730 HRESULT hr
= m_IDeskBar
->SetClient(punkClient
);
731 WrapLogExit("CMenuBand::SetClient() = %08x\n", hr
);
735 HRESULT STDMETHODCALLTYPE
CMenuBand::GetClient(IUnknown
**ppunkClient
)
737 WrapLogEnter("CMenuBand<%p>::GetClient(IUnknown **ppunkClient=%p)\n", this, ppunkClient
);
738 HRESULT hr
= m_IDeskBar
->GetClient(ppunkClient
);
739 if (ppunkClient
) WrapLogMsg("*ppunkClient=%p\n", *ppunkClient
);
740 WrapLogExit("CMenuBand::GetClient() = %08x\n", hr
);
744 HRESULT STDMETHODCALLTYPE
CMenuBand::OnPosRectChangeDB(RECT
*prc
)
746 WrapLogEnter("CMenuBand<%p>::OnPosRectChangeDB(RECT *prc=%p)\n", this, prc
);
747 HRESULT hr
= m_IDeskBar
->OnPosRectChangeDB(prc
);
748 if (prc
) WrapLogMsg("*prc=%s\n", Wrap(*prc
));
749 WrapLogExit("CMenuBand::OnPosRectChangeDB() = %08x\n", hr
);
754 // *** IMenuBand methods ***
755 HRESULT STDMETHODCALLTYPE
CMenuBand::IsMenuMessage(MSG
*pmsg
)
757 //WrapLogEnter("CMenuBand<%p>::IsMenuMessage(MSG *pmsg=%p)\n", this, pmsg);
758 HRESULT hr
= m_IMenuBand
->IsMenuMessage(pmsg
);
759 //WrapLogExit("CMenuBand::IsMenuMessage() = %08x\n", hr);
763 HRESULT STDMETHODCALLTYPE
CMenuBand::TranslateMenuMessage(MSG
*pmsg
, LRESULT
*plRet
)
765 //WrapLogEnter("CMenuBand<%p>::TranslateMenuMessage(MSG *pmsg=%p, LRESULT *plRet=%p)\n", this, pmsg, plRet);
766 HRESULT hr
= m_IMenuBand
->TranslateMenuMessage(pmsg
, plRet
);
767 //WrapLogExit("CMenuBand::TranslateMenuMessage(*plRet=%d) = %08x\n", *plRet, hr);
771 // *** IShellMenu methods ***
772 HRESULT STDMETHODCALLTYPE
CMenuBand::Initialize(IShellMenuCallback
*psmc
, UINT uId
, UINT uIdAncestor
, DWORD dwFlags
)
774 WrapLogEnter("CMenuBand<%p>::Initialize(IShellMenuCallback *psmc=%p, UINT uId=%u, UINT uIdAncestor=%u, DWORD dwFlags=%08x)\n", this, psmc
, uId
, uIdAncestor
, dwFlags
);
775 HRESULT hr
= m_IShellMenu
->Initialize(psmc
, uId
, uIdAncestor
, dwFlags
);
776 WrapLogExit("CMenuBand::Initialize() = %08x\n", hr
);
780 HRESULT STDMETHODCALLTYPE
CMenuBand::GetMenuInfo(IShellMenuCallback
**ppsmc
, UINT
*puId
, UINT
*puIdAncestor
, DWORD
*pdwFlags
)
782 WrapLogEnter("CMenuBand<%p>::GetMenuInfo(IShellMenuCallback **ppsmc=%p, UINT *puId=%p, UINT *puIdAncestor=%p, DWORD *pdwFlags=%p)\n", this, ppsmc
, puId
, puIdAncestor
, pdwFlags
);
783 HRESULT hr
= m_IShellMenu
->GetMenuInfo(ppsmc
, puId
, puIdAncestor
, pdwFlags
);
784 if (ppsmc
) WrapLogMsg("*ppsmc=%p\n", *ppsmc
);
785 if (puId
) WrapLogMsg("*puId=%u\n", *puId
);
786 if (puIdAncestor
) WrapLogMsg("*puIdAncestor=%u\n", *puIdAncestor
);
787 if (pdwFlags
) WrapLogMsg("*pdwFlags=%08x\n", *pdwFlags
);
788 WrapLogExit("CMenuBand::GetMenuInfo() = %08x\n", hr
);
792 HRESULT STDMETHODCALLTYPE
CMenuBand::SetShellFolder(IShellFolder
*psf
, LPCITEMIDLIST pidlFolder
, HKEY hKey
, DWORD dwFlags
)
794 WrapLogEnter("CMenuBand<%p>::SetShellFolder(IShellFolder *psf=%p, LPCITEMIDLIST pidlFolder=%p, HKEY hKey=%p, DWORD dwFlags=%08x)\n", this, psf
, pidlFolder
, hKey
, dwFlags
);
795 HRESULT hr
= m_IShellMenu
->SetShellFolder(psf
, pidlFolder
, hKey
, dwFlags
);
796 WrapLogExit("CMenuBand::SetShellFolder() = %08x\n", hr
);
800 HRESULT STDMETHODCALLTYPE
CMenuBand::GetShellFolder(DWORD
*pdwFlags
, LPITEMIDLIST
*ppidl
, REFIID riid
, void **ppv
)
802 WrapLogEnter("CMenuBand<%p>::GetShellFolder(DWORD *pdwFlags=%p, LPITEMIDLIST *ppidl=%p, REFIID riid=%s, void **ppv=%p)\n", this, pdwFlags
, ppidl
, Wrap(riid
), ppv
);
803 HRESULT hr
= m_IShellMenu
->GetShellFolder(pdwFlags
, ppidl
, riid
, ppv
);
804 if (pdwFlags
) WrapLogMsg("*pdwFlags=%08x\n", *pdwFlags
);
805 if (ppidl
) WrapLogMsg("*ppidl=%p\n", *ppidl
);
806 if (ppv
) WrapLogMsg("*ppv=%p\n", *ppv
);
807 WrapLogExit("CMenuBand::GetShellFolder() = %08x\n", hr
);
811 HRESULT STDMETHODCALLTYPE
CMenuBand::SetMenu(HMENU hmenu
, HWND hwnd
, DWORD dwFlags
)
813 WrapLogEnter("CMenuBand<%p>::SetMenu(HMENU hmenu=%p, HWND hwnd=%p, DWORD dwFlags=%08x)\n", this, hmenu
, hwnd
, dwFlags
);
814 HRESULT hr
= m_IShellMenu
->SetMenu(hmenu
, hwnd
, dwFlags
);
815 WrapLogExit("CMenuBand::SetMenu() = %08x\n", hr
);
819 HRESULT STDMETHODCALLTYPE
CMenuBand::GetMenu(HMENU
*phmenu
, HWND
*phwnd
, DWORD
*pdwFlags
)
821 WrapLogEnter("CMenuBand<%p>::GetMenu(HMENU *phmenu=%p, HWND *phwnd=%p, DWORD *pdwFlags=%p)\n", this, phmenu
, phwnd
, pdwFlags
);
822 HRESULT hr
= m_IShellMenu
->GetMenu(phmenu
, phwnd
, pdwFlags
);
823 if (phmenu
) WrapLogMsg("*phmenu=%p\n", *phmenu
);
824 if (phwnd
) WrapLogMsg("*phwnd=%p\n", *phwnd
);
825 if (pdwFlags
) WrapLogMsg("*pdwFlags=%08x\n", *pdwFlags
);
826 WrapLogExit("CMenuBand::GetMenu() = %08x\n", hr
);
830 HRESULT STDMETHODCALLTYPE
CMenuBand::InvalidateItem(LPSMDATA psmd
, DWORD dwFlags
)
832 WrapLogEnter("CMenuBand<%p>::InvalidateItem(LPSMDATA psmd=%p, DWORD dwFlags=%08x)\n", this, psmd
, dwFlags
);
833 HRESULT hr
= m_IShellMenu
->InvalidateItem(psmd
, dwFlags
);
834 WrapLogExit("CMenuBand::InvalidateItem() = %08x\n", hr
);
838 HRESULT STDMETHODCALLTYPE
CMenuBand::GetState(LPSMDATA psmd
)
840 WrapLogEnter("CMenuBand<%p>::GetState(LPSMDATA psmd=%p)\n", this, psmd
);
841 HRESULT hr
= m_IShellMenu
->GetState(psmd
);
842 WrapLogExit("CMenuBand::GetState() = %08x\n", hr
);
846 HRESULT STDMETHODCALLTYPE
CMenuBand::SetMenuToolbar(IUnknown
*punk
, DWORD dwFlags
)
848 WrapLogEnter("CMenuBand<%p>::SetMenuToolbar(IUnknown *punk=%p, DWORD dwFlags=%08x)\n", this, punk
, dwFlags
);
849 HRESULT hr
= m_IShellMenu
->SetMenuToolbar(punk
, dwFlags
);
850 WrapLogExit("CMenuBand::SetMenuToolbar() = %08x\n", hr
);
855 CMenuToolbarBase::CMenuToolbarBase(CMenuBand
*menuBand
) :
856 m_menuBand(menuBand
),
862 HRESULT
CMenuToolbarBase::ShowWindow(BOOL fShow
)
864 ::ShowWindow(m_hwnd
, fShow
? SW_SHOW
: SW_HIDE
);
866 HIMAGELIST ilBig
, ilSmall
;
867 Shell_GetImageLists(&ilBig
, &ilSmall
);
869 if (m_menuBand
->UseBigIcons())
871 SendMessageW(m_hwnd
, TB_SETIMAGELIST
, 0, (LPARAM
) ilBig
);
875 SendMessageW(m_hwnd
, TB_SETIMAGELIST
, 0, (LPARAM
) ilSmall
);
881 HRESULT
CMenuToolbarBase::Close()
883 DestroyWindow(m_hwnd
);
888 HRESULT
CMenuToolbarBase::CreateToolbar(HWND hwndParent
, DWORD dwFlags
)
890 LONG tbStyles
= WS_CHILD
| WS_VISIBLE
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
|
891 TBSTYLE_TOOLTIPS
| TBSTYLE_TRANSPARENT
| TBSTYLE_REGISTERDROP
| TBSTYLE_LIST
| TBSTYLE_FLAT
| TBSTYLE_CUSTOMERASE
|
892 CCS_NODIVIDER
| CCS_NOPARENTALIGN
| CCS_NORESIZE
| CCS_TOP
;
893 LONG tbExStyles
= TBSTYLE_EX_DOUBLEBUFFER
;
895 if (dwFlags
& SMINIT_VERTICAL
)
897 tbStyles
|= CCS_VERT
;
898 tbExStyles
|= TBSTYLE_EX_VERTICAL
| WS_EX_TOOLWINDOW
;
903 if (!::GetClientRect(hwndParent
, &rc
) || (rc
.left
== rc
.right
) || (rc
.top
== rc
.bottom
))
911 HWND hwndToolbar
= CreateWindowEx(
912 tbExStyles
, TOOLBARCLASSNAMEW
, NULL
,
913 tbStyles
, rc
.left
, rc
.top
, rc
.right
- rc
.left
, rc
.bottom
- rc
.top
,
914 hwndParent
, NULL
, _AtlBaseModule
.GetModuleInstance(), 0);
916 if (hwndToolbar
== NULL
)
919 ::SetParent(hwndToolbar
, hwndParent
);
921 m_hwnd
= hwndToolbar
;
923 /* Identify the version of the used Common Controls DLL by sending the size of the TBBUTTON structure */
924 SendMessageW(m_hwnd
, TB_BUTTONSTRUCTSIZE
, sizeof(TBBUTTON
), 0);
926 HIMAGELIST ilBig
, ilSmall
;
927 Shell_GetImageLists(&ilBig
, &ilSmall
);
929 //if (dwFlags & SMINIT_TOPLEVEL)
931 // /* Hide the placeholders for the button images */
932 // SendMessageW(m_hwnd, TB_SETIMAGELIST, 0, 0);
935 if (m_menuBand
->UseBigIcons())
937 SendMessageW(m_hwnd
, TB_SETIMAGELIST
, 0, (LPARAM
) ilBig
);
941 SendMessageW(m_hwnd
, TB_SETIMAGELIST
, 0, (LPARAM
) ilSmall
);
944 SetWindowLongPtr(m_hwnd
, GWLP_USERDATA
, (LONG_PTR
)this);
945 m_SubclassOld
= (WNDPROC
) SetWindowLongPtr(m_hwnd
, GWLP_WNDPROC
, (LONG_PTR
) CMenuToolbarBase::s_SubclassProc
);
950 HRESULT
CMenuToolbarBase::GetWindow(HWND
*phwnd
)
960 LRESULT CALLBACK
CMenuToolbarBase::s_SubclassProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
962 CMenuToolbarBase
* pthis
= reinterpret_cast<CMenuToolbarBase
*>(GetWindowLongPtr(hWnd
, GWLP_USERDATA
));
963 return pthis
->SubclassProc(hWnd
, uMsg
, wParam
, lParam
);
966 LRESULT
CMenuToolbarBase::SubclassProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
971 if (wParam
== TIMERID_HOTTRACK
)
973 PopupItem(m_hotItem
);
974 KillTimer(hWnd
, TIMERID_HOTTRACK
);
978 return m_SubclassOld(hWnd
, uMsg
, wParam
, lParam
);
981 HRESULT
CMenuToolbarBase::OnHotItemChange(const NMTBHOTITEM
* hot
)
983 if (hot
->dwFlags
& HICF_LEAVING
)
985 KillTimer(m_hwnd
, TIMERID_HOTTRACK
);
987 else if (m_hotItem
!= hot
->idNew
)
989 if (HasSubMenu(hot
->idNew
) == S_OK
)
992 SystemParametersInfo(SPI_GETMENUSHOWDELAY
, 0, &elapsed
, 0);
994 m_hotItem
= hot
->idNew
;
996 SetTimer(m_hwnd
, TIMERID_HOTTRACK
, elapsed
, NULL
);
1000 m_menuBand
->OnSelect(MPOS_CHILDTRACKING
);
1004 HRESULT
CMenuToolbarBase::PopupSubMenu(UINT index
, IShellMenu
* childShellMenu
)
1006 IBandSite
* pBandSite
;
1012 if (!SendMessage(m_hwnd
, TB_GETITEMRECT
, index
, (LPARAM
) &rc
))
1015 POINT a
= { rc
.left
, rc
.top
};
1016 POINT b
= { rc
.right
, rc
.bottom
};
1018 ClientToScreen(m_hwnd
, &a
);
1019 ClientToScreen(m_hwnd
, &b
);
1021 POINTL pt
= { b
.x
, b
.y
};
1022 RECTL rcl
= { a
.x
, a
.y
, b
.x
, b
.y
}; // maybe-TODO: fetch client area of deskbar?
1025 #ifndef USE_BUILTIN_MENUSITE
1026 hr
= CoCreateInstance(CLSID_MenuBandSite
,
1028 CLSCTX_INPROC_SERVER
,
1029 IID_PPV_ARG(IBandSite
, &pBandSite
));
1031 hr
= CMenuSite_Constructor(IID_PPV_ARG(IBandSite
, &pBandSite
));
1036 #ifndef USE_BUILTIN_MENUDESKBAR
1037 hr
= CoCreateInstance(CLSID_MenuDeskBar
,
1039 CLSCTX_INPROC_SERVER
,
1040 IID_PPV_ARG(IDeskBar
, &pDeskBar
));
1042 hr
= CMenuDeskBar_Constructor(IID_PPV_ARG(IDeskBar
, &pDeskBar
));
1047 hr
= pDeskBar
->SetClient(pBandSite
);
1051 hr
= pBandSite
->AddBand(childShellMenu
);
1055 CComPtr
<IMenuPopup
> popup
;
1056 hr
= pDeskBar
->QueryInterface(IID_PPV_ARG(IMenuPopup
, &popup
));
1060 popup
->Popup(&pt
, &rcl
, MPPF_TOP
| MPPF_RIGHT
);
1065 HRESULT
CMenuToolbarBase::DoContextMenu(IContextMenu
* contextMenu
)
1068 HMENU hPopup
= CreatePopupMenu();
1073 hr
= contextMenu
->QueryContextMenu(hPopup
, 0, 0, UINT_MAX
, CMF_NORMAL
);
1076 DestroyMenu(hPopup
);
1080 DWORD dwPos
= GetMessagePos();
1081 UINT uCommand
= ::TrackPopupMenu(hPopup
, TPM_RETURNCMD
, GET_X_LPARAM(dwPos
), GET_Y_LPARAM(dwPos
), 0, m_hwnd
, NULL
);
1085 CMINVOKECOMMANDINFO cmi
= { 0 };
1086 cmi
.cbSize
= sizeof(cmi
);
1087 cmi
.lpVerb
= MAKEINTRESOURCEA(uCommand
);
1089 hr
= contextMenu
->InvokeCommand(&cmi
);
1091 DestroyMenu(hPopup
);
1095 HRESULT
CMenuToolbarBase::OnCommand(WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
1097 m_menuBand
->OnSelect(MPOS_EXECUTE
);
1102 AllocAndGetMenuString(HMENU hMenu
, UINT ItemIDByPosition
, WCHAR
** String
)
1106 Length
= GetMenuStringW(hMenu
, ItemIDByPosition
, NULL
, 0, MF_BYPOSITION
);
1111 /* Also allocate space for the terminating NULL character */
1113 *String
= (PWSTR
) HeapAlloc(GetProcessHeap(), 0, Length
* sizeof(WCHAR
));
1115 GetMenuStringW(hMenu
, ItemIDByPosition
, *String
, Length
, MF_BYPOSITION
);
1120 CMenuStaticToolbar::CMenuStaticToolbar(CMenuBand
*menuBand
) :
1121 CMenuToolbarBase(menuBand
),
1126 HRESULT
CMenuStaticToolbar::GetMenu(
1133 *pdwFlags
= m_dwMenuFlags
;
1138 HRESULT
CMenuStaticToolbar::SetMenu(
1144 m_dwMenuFlags
= dwFlags
;
1149 HRESULT
CMenuStaticToolbar::FillToolbar()
1152 int ic
= GetMenuItemCount(m_hmenu
);
1154 for (i
= 0; i
< ic
; i
++)
1157 TBBUTTON tbb
= { 0 };
1158 PWSTR MenuString
= NULL
;
1160 tbb
.fsState
= TBSTATE_ENABLED
;
1163 info
.cbSize
= sizeof(info
);
1164 info
.fMask
= MIIM_FTYPE
| MIIM_ID
;
1166 GetMenuItemInfoW(m_hmenu
, i
, TRUE
, &info
);
1168 if (info
.fType
== MFT_STRING
)
1170 if (!AllocAndGetMenuString(m_hmenu
, i
, &MenuString
))
1171 return E_OUTOFMEMORY
;
1172 if (::GetSubMenu(m_hmenu
, i
) != NULL
)
1173 tbb
.fsStyle
|= BTNS_DROPDOWN
;
1174 tbb
.iString
= (INT_PTR
) MenuString
;
1175 tbb
.idCommand
= info
.wID
;
1177 SMINFO sminfo
= { 0 };
1178 sminfo
.dwMask
= SMIM_ICON
;
1179 if (info
.wID
>= 0 && SUCCEEDED(m_menuBand
->CallCBWithId(info
.wID
, SMC_GETINFO
, 0, (LPARAM
) &sminfo
)))
1181 tbb
.iBitmap
= sminfo
.iIcon
;
1186 tbb
.fsStyle
|= BTNS_SEP
;
1189 SendMessageW(m_hwnd
, TB_ADDBUTTONS
, 1, (LPARAM
) (LPTBBUTTON
) &tbb
);
1192 HeapFree(GetProcessHeap(), 0, MenuString
);
1198 HRESULT
CMenuStaticToolbar::OnContextMenu(NMMOUSE
* rclick
)
1200 CComPtr
<IContextMenu
> contextMenu
;
1201 HRESULT hr
= m_menuBand
->CallCBWithId(rclick
->dwItemSpec
, SMC_GETOBJECT
, (WPARAM
) &IID_IContextMenu
, (LPARAM
) &contextMenu
);
1205 return DoContextMenu(contextMenu
);
1208 HRESULT
CMenuStaticToolbar::OnCommand(WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
1210 HRESULT hr
= m_menuBand
->CallCBWithId(wParam
, SMC_EXEC
, 0, 0);
1214 return CMenuToolbarBase::OnCommand(wParam
, lParam
, theResult
);
1217 HRESULT
CMenuStaticToolbar::PopupItem(UINT uItem
)
1219 CComPtr
<IShellMenu
> shellMenu
;
1220 HRESULT hr
= m_menuBand
->CallCBWithId(uItem
, SMC_GETOBJECT
, (WPARAM
) &IID_IShellMenu
, (LPARAM
) &shellMenu
);
1224 TBBUTTONINFO info
= { 0 };
1225 info
.cbSize
= sizeof(TBBUTTONINFO
);
1227 int index
= SendMessage(m_hwnd
, TB_GETBUTTONINFO
, uItem
, (LPARAM
) &info
);
1231 return PopupSubMenu(index
, shellMenu
);
1234 HRESULT
CMenuStaticToolbar::HasSubMenu(UINT uItem
)
1236 TBBUTTONINFO info
= { 0 };
1237 info
.cbSize
= sizeof(TBBUTTONINFO
);
1239 int index
= SendMessage(m_hwnd
, TB_GETBUTTONINFO
, uItem
, (LPARAM
) &info
);
1242 return ::GetSubMenu(m_hmenu
, index
) ? S_OK
: S_FALSE
;
1245 CMenuSFToolbar::CMenuSFToolbar(CMenuBand
* menuBand
) :
1246 CMenuToolbarBase(menuBand
),
1251 CMenuSFToolbar::~CMenuSFToolbar()
1255 HRESULT
CMenuSFToolbar::FillToolbar()
1258 TBBUTTON tbb
= { 0 };
1262 tbb
.fsState
= TBSTATE_ENABLED
;
1266 m_shellFolder
->EnumObjects(m_hwnd
, SHCONTF_FOLDERS
| SHCONTF_NONFOLDERS
, &eidl
);
1268 LPITEMIDLIST item
= (LPITEMIDLIST
) CoTaskMemAlloc(sizeof(ITEMIDLIST
));
1270 while ((hr
= eidl
->Next(1, &item
, &fetched
)) == S_OK
)
1275 CComPtr
<IShellItem
> psi
;
1276 SHCreateShellItem(NULL
, m_shellFolder
, item
, &psi
);
1278 hr
= psi
->GetDisplayName(SIGDN_NORMALDISPLAY
, &MenuString
);
1282 index
= SHMapPIDLToSystemImageListIndex(m_shellFolder
, item
, &indexOpen
);
1285 hr
= psi
->GetAttributes(SFGAO_FOLDER
, &attrs
);
1289 tbb
.fsStyle
|= BTNS_DROPDOWN
;
1292 tbb
.idCommand
= i
++;
1293 tbb
.iString
= (INT_PTR
) MenuString
;
1294 tbb
.iBitmap
= index
;
1295 tbb
.dwData
= (DWORD_PTR
) ILClone(item
);
1297 SendMessageW(m_hwnd
, TB_ADDBUTTONS
, 1, (LPARAM
) (LPTBBUTTON
) &tbb
);
1298 HeapFree(GetProcessHeap(), 0, MenuString
);
1301 CoTaskMemFree(item
);
1306 HRESULT
CMenuSFToolbar::SetShellFolder(IShellFolder
*psf
, LPCITEMIDLIST pidlFolder
, HKEY hKey
, DWORD dwFlags
)
1308 m_shellFolder
= psf
;
1309 m_idList
= pidlFolder
;
1311 m_dwMenuFlags
= dwFlags
;
1315 HRESULT
CMenuSFToolbar::GetShellFolder(DWORD
*pdwFlags
, LPITEMIDLIST
*ppidl
, REFIID riid
, void **ppv
)
1319 hr
= m_shellFolder
->QueryInterface(riid
, ppv
);
1324 *pdwFlags
= m_dwMenuFlags
;
1328 LPITEMIDLIST pidl
= NULL
;
1332 pidl
= ILClone(m_idList
);
1335 (*(IUnknown
**) ppv
)->Release();
1346 LPITEMIDLIST
CMenuSFToolbar::GetPidlFromId(UINT uItem
, INT
* pIndex
)
1348 TBBUTTONINFO info
= { 0 };
1349 info
.cbSize
= sizeof(TBBUTTONINFO
);
1351 int index
= SendMessage(m_hwnd
, TB_GETBUTTONINFO
, uItem
, (LPARAM
) &info
);
1358 TBBUTTON btn
= { 0 };
1359 if (!SendMessage(m_hwnd
, TB_GETBUTTON
, index
, (LPARAM
) &btn
))
1362 return (LPITEMIDLIST
) btn
.dwData
;
1365 HRESULT
CMenuSFToolbar::OnContextMenu(NMMOUSE
* rclick
)
1368 CComPtr
<IContextMenu
> contextMenu
;
1369 LPCITEMIDLIST pidl
= reinterpret_cast<LPCITEMIDLIST
>(rclick
->dwItemData
);
1371 hr
= m_shellFolder
->GetUIObjectOf(m_hwnd
, 1, &pidl
, IID_IContextMenu
, NULL
, reinterpret_cast<VOID
**>(&contextMenu
));
1375 return DoContextMenu(contextMenu
);
1378 HRESULT
CMenuSFToolbar::OnCommand(WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
1380 return m_menuBand
->CallCBWithPidl(GetPidlFromId(wParam
, NULL
), SMC_SFEXEC
, 0, 0);
1383 HRESULT
CMenuSFToolbar::PopupItem(UINT uItem
)
1390 CComPtr
<IShellMenuCallback
> psmc
;
1391 CComPtr
<IShellMenu
> shellMenu
;
1393 LPITEMIDLIST pidl
= GetPidlFromId(uItem
, &index
);
1398 #ifndef USE_BUILTIN_MENUBAND
1399 hr
= CoCreateInstance(CLSID_MenuBand
,
1401 CLSCTX_INPROC_SERVER
,
1402 IID_PPV_ARG(IShellMenu
, &pShellMenu
));
1404 hr
= CMenuBand_Constructor(IID_PPV_ARG(IShellMenu
, &shellMenu
));
1409 m_menuBand
->GetMenuInfo(&psmc
, &uId
, &uIdAncestor
, &flags
);
1411 // FIXME: not sure waht to use as uId/uIdAncestor here
1412 hr
= shellMenu
->Initialize(psmc
, 0, uId
, SMINIT_VERTICAL
);
1416 CComPtr
<IShellFolder
> childFolder
;
1417 hr
= m_shellFolder
->BindToObject(pidl
, NULL
, IID_PPV_ARG(IShellFolder
, &childFolder
));
1421 hr
= shellMenu
->SetShellFolder(childFolder
, NULL
, NULL
, 0);
1425 return PopupSubMenu(index
, shellMenu
);
1428 HRESULT
CMenuSFToolbar::HasSubMenu(UINT uItem
)
1431 CComPtr
<IShellItem
> psi
;
1432 SHCreateShellItem(NULL
, m_shellFolder
, GetPidlFromId(uItem
, NULL
), &psi
);
1435 hr
= psi
->GetAttributes(SFGAO_FOLDER
, &attrs
);
1437 return (attrs
!= 0) ? S_OK
: S_FALSE
;
1440 CMenuBand::CMenuBand() :
1443 m_staticToolbar(NULL
),
1445 m_useBigIcons(FALSE
)
1449 CMenuBand::~CMenuBand()
1457 if (m_staticToolbar
)
1458 delete m_staticToolbar
;
1464 HRESULT STDMETHODCALLTYPE
CMenuBand::Initialize(
1465 IShellMenuCallback
*psmc
,
1475 m_uIdAncestor
= uIdAncestor
;
1476 m_dwFlags
= dwFlags
;
1482 _CallCB(SMC_CREATE
, 0, (LPARAM
) &m_UserData
);
1488 HRESULT STDMETHODCALLTYPE
CMenuBand::GetMenuInfo(
1489 IShellMenuCallback
**ppsmc
,
1494 if (!pdwFlags
) // maybe?
1495 return E_INVALIDARG
;
1504 *puIdAncestor
= m_uIdAncestor
;
1506 *pdwFlags
= m_dwFlags
;
1511 HRESULT STDMETHODCALLTYPE
CMenuBand::SetMenu(
1516 if (m_staticToolbar
== NULL
)
1518 m_staticToolbar
= new CMenuStaticToolbar(this);
1522 HRESULT hResult
= m_staticToolbar
->SetMenu(hmenu
, hwnd
, dwFlags
);
1523 if (FAILED(hResult
))
1530 hResult
= m_site
->GetWindow(&hwndParent
);
1531 if (FAILED(hResult
))
1534 hResult
= m_staticToolbar
->CreateToolbar(hwndParent
, m_dwFlags
);
1535 if (FAILED(hResult
))
1538 hResult
= m_staticToolbar
->FillToolbar();
1544 HRESULT STDMETHODCALLTYPE
CMenuBand::GetMenu(
1549 if (m_staticToolbar
== NULL
)
1552 return m_staticToolbar
->GetMenu(phmenu
, phwnd
, pdwFlags
);
1555 HRESULT STDMETHODCALLTYPE
CMenuBand::SetSite(IUnknown
*pUnkSite
)
1563 if (pUnkSite
== NULL
)
1567 hResult
= pUnkSite
->QueryInterface(IID_PPV_ARG(IOleWindow
, &m_site
));
1568 if (SUCCEEDED(hResult
))
1570 m_site
->GetWindow(&hwndParent
);
1573 if (!::IsWindow(hwndParent
))
1576 if (m_staticToolbar
!= NULL
)
1578 hResult
= m_staticToolbar
->CreateToolbar(hwndParent
, m_dwFlags
);
1579 if (FAILED(hResult
))
1582 hResult
= m_staticToolbar
->FillToolbar();
1585 if (m_SFToolbar
!= NULL
)
1587 hResult
= m_SFToolbar
->CreateToolbar(hwndParent
, m_dwFlags
);
1588 if (FAILED(hResult
))
1591 hResult
= m_SFToolbar
->FillToolbar();
1597 HRESULT STDMETHODCALLTYPE
CMenuBand::GetSite(REFIID riid
, PVOID
*ppvSite
)
1602 return m_site
->QueryInterface(riid
, ppvSite
);
1605 HRESULT STDMETHODCALLTYPE
CMenuBand::GetWindow(
1608 if (m_SFToolbar
!= NULL
)
1609 return m_SFToolbar
->GetWindow(phwnd
);
1611 if (m_staticToolbar
!= NULL
)
1612 return m_staticToolbar
->GetWindow(phwnd
);
1617 HRESULT STDMETHODCALLTYPE
CMenuBand::OnPosRectChangeDB(RECT
*prc
)
1619 SIZE sizeStaticY
= { 0 };
1620 SIZE sizeShlFldY
= { 0 };
1621 HWND hwndStatic
= NULL
;
1622 HWND hwndShlFld
= NULL
;
1623 HRESULT hResult
= S_OK
;
1625 if (m_staticToolbar
!= NULL
)
1626 hResult
= m_staticToolbar
->GetWindow(&hwndStatic
);
1627 if (FAILED(hResult
))
1630 if (m_SFToolbar
!= NULL
)
1631 hResult
= m_SFToolbar
->GetWindow(&hwndShlFld
);
1632 if (FAILED(hResult
))
1635 if (hwndStatic
== NULL
&& hwndShlFld
== NULL
)
1638 if (hwndStatic
) SendMessageW(hwndStatic
, TB_GETIDEALSIZE
, TRUE
, (LPARAM
) &sizeStaticY
);
1639 if (hwndShlFld
) SendMessageW(hwndShlFld
, TB_GETIDEALSIZE
, TRUE
, (LPARAM
) &sizeShlFldY
);
1641 int sy
= max(prc
->bottom
- prc
->top
, sizeStaticY
.cy
+ sizeShlFldY
.cy
);
1645 SetWindowPos(hwndShlFld
, NULL
,
1648 prc
->right
- prc
->left
,
1651 DWORD btnSize
= SendMessage(hwndShlFld
, TB_GETBUTTONSIZE
, 0, 0);
1652 SendMessage(hwndShlFld
, TB_SETBUTTONSIZE
, 0, MAKELPARAM(prc
->right
- prc
->left
, HIWORD(btnSize
)));
1656 SetWindowPos(hwndStatic
, hwndShlFld
,
1658 prc
->top
+ sizeShlFldY
.cy
,
1659 prc
->right
- prc
->left
,
1660 sy
- sizeShlFldY
.cy
,
1662 DWORD btnSize
= SendMessage(hwndStatic
, TB_GETBUTTONSIZE
, 0, 0);
1663 SendMessage(hwndStatic
, TB_SETBUTTONSIZE
, 0, MAKELPARAM(prc
->right
- prc
->left
, HIWORD(btnSize
)));
1669 HRESULT STDMETHODCALLTYPE
CMenuBand::GetBandInfo(
1674 HWND hwndStatic
= NULL
;
1675 HWND hwndShlFld
= NULL
;
1676 HRESULT hResult
= S_OK
;
1678 if (m_staticToolbar
!= NULL
)
1679 hResult
= m_staticToolbar
->GetWindow(&hwndStatic
);
1680 if (FAILED(hResult
))
1683 if (m_SFToolbar
!= NULL
)
1684 hResult
= m_SFToolbar
->GetWindow(&hwndShlFld
);
1685 if (FAILED(hResult
))
1688 if (hwndStatic
== NULL
&& hwndShlFld
== NULL
)
1692 if (pdbi
->dwMask
== 0)
1694 pdbi
->dwMask
= DBIM_MINSIZE
| DBIM_MAXSIZE
| DBIM_INTEGRAL
| DBIM_ACTUAL
| DBIM_TITLE
| DBIM_MODEFLAGS
| DBIM_BKCOLOR
;
1697 if (pdbi
->dwMask
& DBIM_MINSIZE
)
1699 SIZE sizeStatic
= { 0 };
1700 SIZE sizeShlFld
= { 0 };
1702 if (hwndStatic
) SendMessageW(hwndStatic
, TB_GETIDEALSIZE
, TRUE
, (LPARAM
) &sizeStatic
);
1703 if (hwndShlFld
) SendMessageW(hwndShlFld
, TB_GETIDEALSIZE
, TRUE
, (LPARAM
) &sizeShlFld
);
1705 pdbi
->ptMinSize
.x
= 0;
1706 pdbi
->ptMinSize
.y
= sizeStatic
.cy
+ sizeShlFld
.cy
;
1708 if (pdbi
->dwMask
& DBIM_MAXSIZE
)
1710 SIZE sizeStatic
= { 0 };
1711 SIZE sizeShlFld
= { 0 };
1713 if (hwndStatic
) SendMessageW(hwndStatic
, TB_GETMAXSIZE
, 0, (LPARAM
) &sizeStatic
);
1714 if (hwndShlFld
) SendMessageW(hwndShlFld
, TB_GETMAXSIZE
, 0, (LPARAM
) &sizeShlFld
);
1716 pdbi
->ptMaxSize
.x
= max(sizeStatic
.cx
, sizeShlFld
.cx
); // ignored
1717 pdbi
->ptMaxSize
.y
= sizeStatic
.cy
+ sizeShlFld
.cy
;
1719 if (pdbi
->dwMask
& DBIM_INTEGRAL
)
1721 pdbi
->ptIntegral
.x
= 0;
1722 pdbi
->ptIntegral
.y
= 0;
1724 if (pdbi
->dwMask
& DBIM_ACTUAL
)
1726 SIZE sizeStatic
= { 0 };
1727 SIZE sizeShlFld
= { 0 };
1729 if (hwndStatic
) SendMessageW(hwndStatic
, TB_GETIDEALSIZE
, FALSE
, (LPARAM
) &sizeStatic
);
1730 if (hwndShlFld
) SendMessageW(hwndShlFld
, TB_GETIDEALSIZE
, FALSE
, (LPARAM
) &sizeShlFld
);
1731 pdbi
->ptActual
.x
= max(sizeStatic
.cx
, sizeShlFld
.cx
);
1733 if (hwndStatic
) SendMessageW(hwndStatic
, TB_GETIDEALSIZE
, TRUE
, (LPARAM
) &sizeStatic
);
1734 if (hwndShlFld
) SendMessageW(hwndShlFld
, TB_GETIDEALSIZE
, TRUE
, (LPARAM
) &sizeShlFld
);
1735 pdbi
->ptActual
.y
= sizeStatic
.cy
+ sizeShlFld
.cy
;
1737 if (pdbi
->dwMask
& DBIM_TITLE
)
1738 wcscpy(pdbi
->wszTitle
, L
"");
1739 if (pdbi
->dwMask
& DBIM_MODEFLAGS
)
1740 pdbi
->dwModeFlags
= DBIMF_UNDELETEABLE
;
1741 if (pdbi
->dwMask
& DBIM_BKCOLOR
)
1746 /* IDockingWindow */
1747 HRESULT STDMETHODCALLTYPE
CMenuBand::ShowDW(BOOL fShow
)
1751 if (m_staticToolbar
!= NULL
)
1752 hr
= m_staticToolbar
->ShowWindow(fShow
);
1755 if (m_SFToolbar
!= NULL
)
1756 hr
= m_SFToolbar
->ShowWindow(fShow
);
1761 return _CallCB(SMC_INITMENU
, 0, 0);
1766 HRESULT STDMETHODCALLTYPE
CMenuBand::CloseDW(DWORD dwReserved
)
1770 if (m_staticToolbar
!= NULL
)
1771 return m_staticToolbar
->Close();
1773 if (m_SFToolbar
!= NULL
)
1774 return m_SFToolbar
->Close();
1778 HRESULT STDMETHODCALLTYPE
CMenuBand::ResizeBorderDW(LPCRECT prcBorder
, IUnknown
*punkToolbarSite
, BOOL fReserved
)
1784 HRESULT STDMETHODCALLTYPE
CMenuBand::ContextSensitiveHelp(BOOL fEnterMode
)
1790 HRESULT STDMETHODCALLTYPE
CMenuBand::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
1796 HRESULT STDMETHODCALLTYPE
CMenuBand::HasFocusIO()
1802 HRESULT STDMETHODCALLTYPE
CMenuBand::TranslateAcceleratorIO(LPMSG lpMsg
)
1808 HRESULT STDMETHODCALLTYPE
CMenuBand::IsDirty()
1814 HRESULT STDMETHODCALLTYPE
CMenuBand::Load(IStream
*pStm
)
1820 HRESULT STDMETHODCALLTYPE
CMenuBand::Save(IStream
*pStm
, BOOL fClearDirty
)
1826 HRESULT STDMETHODCALLTYPE
CMenuBand::GetSizeMax(ULARGE_INTEGER
*pcbSize
)
1832 HRESULT STDMETHODCALLTYPE
CMenuBand::GetClassID(CLSID
*pClassID
)
1838 HRESULT STDMETHODCALLTYPE
CMenuBand::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
1844 HRESULT STDMETHODCALLTYPE
CMenuBand::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1849 if (IsEqualGUID(*pguidCmdGroup
, CLSID_MenuBand
))
1851 if (nCmdID
== 16) // set (big) icon size
1853 this->m_useBigIcons
= TRUE
;
1856 else if (nCmdID
== 19) // popup-related
1866 HRESULT STDMETHODCALLTYPE
CMenuBand::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
1868 if (IsEqualIID(guidService
, SID_SMenuBandChild
) ||
1869 IsEqualIID(guidService
, SID_SMenuBandBottom
) ||
1870 IsEqualIID(guidService
, SID_SMenuBandBottomSelected
))
1871 return this->QueryInterface(riid
, ppvObject
);
1872 WARN("Unknown service requested %s\n", wine_dbgstr_guid(&guidService
));
1873 return E_NOINTERFACE
;
1876 HRESULT STDMETHODCALLTYPE
CMenuBand::Popup(POINTL
*ppt
, RECTL
*prcExclude
, MP_POPUPFLAGS dwFlags
)
1882 HRESULT STDMETHODCALLTYPE
CMenuBand::OnSelect(DWORD dwSelectType
)
1884 CComPtr
<IMenuPopup
> pmp
;
1885 HRESULT hr
= IUnknown_QueryService(m_site
, SID_SMenuPopup
, IID_PPV_ARG(IMenuPopup
, &pmp
));
1888 pmp
->OnSelect(dwSelectType
);
1892 HRESULT STDMETHODCALLTYPE
CMenuBand::SetSubMenu(IMenuPopup
*pmp
, BOOL fSet
)
1898 HRESULT STDMETHODCALLTYPE
CMenuBand::SetClient(IUnknown
*punkClient
)
1904 HRESULT STDMETHODCALLTYPE
CMenuBand::GetClient(IUnknown
**ppunkClient
)
1910 HRESULT STDMETHODCALLTYPE
CMenuBand::IsMenuMessage(MSG
*pmsg
)
1918 HRESULT STDMETHODCALLTYPE
CMenuBand::TranslateMenuMessage(MSG
*pmsg
, LRESULT
*plRet
)
1924 HRESULT STDMETHODCALLTYPE
CMenuBand::SetShellFolder(IShellFolder
*psf
, LPCITEMIDLIST pidlFolder
, HKEY hKey
, DWORD dwFlags
)
1926 if (m_SFToolbar
== NULL
)
1928 m_SFToolbar
= new CMenuSFToolbar(this);
1931 HRESULT hResult
= m_SFToolbar
->SetShellFolder(psf
, pidlFolder
, hKey
, dwFlags
);
1932 if (FAILED(hResult
))
1939 hResult
= m_site
->GetWindow(&hwndParent
);
1940 if (FAILED(hResult
))
1943 hResult
= m_SFToolbar
->CreateToolbar(hwndParent
, m_dwFlags
);
1944 if (FAILED(hResult
))
1947 hResult
= m_SFToolbar
->FillToolbar();
1953 HRESULT STDMETHODCALLTYPE
CMenuBand::GetShellFolder(DWORD
*pdwFlags
, LPITEMIDLIST
*ppidl
, REFIID riid
, void **ppv
)
1956 return m_SFToolbar
->GetShellFolder(pdwFlags
, ppidl
, riid
, ppv
);
1960 HRESULT STDMETHODCALLTYPE
CMenuBand::InvalidateItem(LPSMDATA psmd
, DWORD dwFlags
)
1966 HRESULT STDMETHODCALLTYPE
CMenuBand::GetState(LPSMDATA psmd
)
1972 HRESULT STDMETHODCALLTYPE
CMenuBand::SetMenuToolbar(IUnknown
*punk
, DWORD dwFlags
)
1978 HRESULT STDMETHODCALLTYPE
CMenuBand::OnWinEvent(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
1985 if (m_staticToolbar
&& m_staticToolbar
->IsWindowOwner(hWnd
))
1987 return m_staticToolbar
->OnCommand(wParam
, lParam
, theResult
);
1990 if (m_SFToolbar
&& m_SFToolbar
->IsWindowOwner(hWnd
))
1992 return m_SFToolbar
->OnCommand(wParam
, lParam
, theResult
);
1998 NMHDR
* hdr
= reinterpret_cast<LPNMHDR
>(lParam
);
1999 NMTBCUSTOMDRAW
* cdraw
;
2004 case TBN_HOTITEMCHANGE
:
2005 hot
= reinterpret_cast<LPNMTBHOTITEM
>(hdr
);
2007 if (m_staticToolbar
&& m_staticToolbar
->IsWindowOwner(hWnd
))
2009 return m_staticToolbar
->OnHotItemChange(hot
);
2012 if (m_SFToolbar
&& m_SFToolbar
->IsWindowOwner(hWnd
))
2014 return m_SFToolbar
->OnHotItemChange(hot
);
2020 rclick
= reinterpret_cast<LPNMMOUSE
>(hdr
);
2022 if (m_staticToolbar
&& m_staticToolbar
->IsWindowOwner(hWnd
))
2024 return m_staticToolbar
->OnContextMenu(rclick
);
2027 if (m_SFToolbar
&& m_SFToolbar
->IsWindowOwner(hWnd
))
2029 return m_SFToolbar
->OnContextMenu(rclick
);
2034 cdraw
= reinterpret_cast<LPNMTBCUSTOMDRAW
>(hdr
);
2035 switch (cdraw
->nmcd
.dwDrawStage
)
2038 *theResult
= CDRF_NOTIFYITEMDRAW
;
2041 case CDDS_ITEMPREPAINT
:
2043 cdraw
->clrBtnFace
= GetSysColor(COLOR_MENU
);
2044 cdraw
->clrBtnHighlight
= GetSysColor(COLOR_MENUHILIGHT
);
2046 cdraw
->clrText
= GetSysColor(COLOR_MENUTEXT
);
2047 cdraw
->clrTextHighlight
= GetSysColor(COLOR_HIGHLIGHTTEXT
);
2048 cdraw
->clrHighlightHotTrack
= GetSysColor(COLOR_HIGHLIGHTTEXT
);
2050 RECT rc
= cdraw
->nmcd
.rc
;
2051 HDC hdc
= cdraw
->nmcd
.hdc
;
2053 HBRUSH bgBrush
= GetSysColorBrush(COLOR_MENU
);
2054 HBRUSH hotBrush
= GetSysColorBrush(COLOR_MENUHILIGHT
);
2056 switch (cdraw
->nmcd
.uItemState
)
2060 FillRect(hdc
, &rc
, hotBrush
);
2063 FillRect(hdc
, &rc
, bgBrush
);
2067 *theResult
= TBCDRF_NOBACKGROUND
| TBCDRF_NOEDGES
| TBCDRF_NOETCHEDEFFECT
| TBCDRF_HILITEHOTTRACK
| TBCDRF_NOOFFSET
;
2078 HRESULT STDMETHODCALLTYPE
CMenuBand::IsWindowOwner(HWND hWnd
)
2080 if (m_staticToolbar
&& m_staticToolbar
->IsWindowOwner(hWnd
))
2083 if (m_SFToolbar
&& m_SFToolbar
->IsWindowOwner(hWnd
))
2089 HRESULT STDMETHODCALLTYPE
CMenuBand::GetSubMenu(THIS
)
2095 HRESULT STDMETHODCALLTYPE
CMenuBand::SetToolbar(THIS
)
2101 HRESULT STDMETHODCALLTYPE
CMenuBand::SetMinWidth(THIS
)
2107 HRESULT STDMETHODCALLTYPE
CMenuBand::SetNoBorder(THIS
)
2113 HRESULT STDMETHODCALLTYPE
CMenuBand::SetTheme(THIS
)
2119 HRESULT STDMETHODCALLTYPE
CMenuBand::GetTop(THIS
)
2125 HRESULT STDMETHODCALLTYPE
CMenuBand::GetBottom(THIS
)
2131 HRESULT STDMETHODCALLTYPE
CMenuBand::GetTracked(THIS
)
2137 HRESULT STDMETHODCALLTYPE
CMenuBand::GetParentSite(THIS
)
2143 HRESULT STDMETHODCALLTYPE
CMenuBand::GetState(THIS
)
2149 HRESULT STDMETHODCALLTYPE
CMenuBand::DoDefaultAction(THIS
)
2155 HRESULT STDMETHODCALLTYPE
CMenuBand::IsEmpty(THIS
)
2161 HRESULT
CMenuBand::CallCBWithId(UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2163 return _CallCB(uMsg
, wParam
, lParam
, id
);
2166 HRESULT
CMenuBand::CallCBWithPidl(LPITEMIDLIST pidl
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2168 return _CallCB(uMsg
, wParam
, lParam
, 0, pidl
);
2171 HRESULT
CMenuBand::_CallCB(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, UINT id
, LPITEMIDLIST pidl
)
2179 SMDATA smData
= { 0 };
2180 smData
.punk
= static_cast<IShellMenu2
*>(this);
2182 smData
.uIdParent
= m_uId
;
2183 smData
.uIdAncestor
= m_uIdAncestor
;
2185 smData
.pidlItem
= pidl
;
2186 if (m_staticToolbar
)
2188 smData
.hmenu
= m_hmenu
;
2190 smData
.pvUserData
= NULL
;
2192 m_SFToolbar
->GetShellFolder(NULL
, &smData
.pidlFolder
, IID_PPV_ARG(IShellFolder
, &smData
.psf
));
2193 HRESULT hr
= m_psmc
->CallbackSM(&smData
, uMsg
, wParam
, lParam
);
2194 ILFree(smData
.pidlFolder
);
2196 smData
.psf
->Release();