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 #include <shlwapi_undoc.h>
25 WINE_DEFAULT_DEBUG_CHANNEL(CMenuDeskBar
);
30 WS_POPUP
| WS_DLGFRAME
| WS_CLIPCHILDREN
| WS_CLIPSIBLINGS
,
31 WS_EX_LEFT
| WS_EX_LTRREADING
| WS_EX_RIGHTSCROLLBAR
| WS_EX_PALETTEWINDOW
36 public CWindowImpl
<CMenuDeskBar
, CWindow
, CMenuWinTraits
>,
38 public CComCoClass
<CMenuDeskBar
>,
39 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
40 public IOleCommandTarget
,
41 public IServiceProvider
,
42 public IInputObjectSite
,
45 public IObjectWithSite
,
47 public IInitializeObject
55 IUnknown
* m_IUnknown
;
56 IMenuPopup
* m_IMenuPopup
;
57 IOleCommandTarget
* m_IOleCommandTarget
;
58 IServiceProvider
* m_IServiceProvider
;
59 IDeskBar
* m_IDeskBar
;
60 IOleWindow
* m_IOleWindow
;
61 IInputObjectSite
* m_IInputObjectSite
;
62 IInputObject
* m_IInputObject
;
63 IObjectWithSite
* m_IObjectWithSite
;
64 IBanneredBar
* m_IBanneredBar
;
65 IInitializeObject
* m_IInitializeObject
;
68 CComPtr
<IUnknown
> m_Site
;
69 CComPtr
<IUnknown
> m_Client
;
73 int m_NeededSize
; // width or height
78 // used by resize tracking loop
84 // *** IMenuPopup methods ***
85 virtual HRESULT STDMETHODCALLTYPE
Popup(POINTL
*ppt
, RECTL
*prcExclude
, MP_POPUPFLAGS dwFlags
);
86 virtual HRESULT STDMETHODCALLTYPE
OnSelect(DWORD dwSelectType
);
87 virtual HRESULT STDMETHODCALLTYPE
SetSubMenu(IMenuPopup
*pmp
, BOOL fSet
);
89 // *** IOleWindow methods ***
90 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*phwnd
);
91 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
93 // *** IObjectWithSite methods ***
94 virtual HRESULT STDMETHODCALLTYPE
SetSite(IUnknown
*pUnkSite
);
95 virtual HRESULT STDMETHODCALLTYPE
GetSite(REFIID riid
, PVOID
*ppvSite
);
97 // *** IBanneredBar methods ***
98 virtual HRESULT STDMETHODCALLTYPE
SetIconSize(DWORD iIcon
);
99 virtual HRESULT STDMETHODCALLTYPE
GetIconSize(DWORD
* piIcon
);
100 virtual HRESULT STDMETHODCALLTYPE
SetBitmap(HBITMAP hBitmap
);
101 virtual HRESULT STDMETHODCALLTYPE
GetBitmap(HBITMAP
* phBitmap
);
103 // *** IInitializeObject methods ***
104 virtual HRESULT STDMETHODCALLTYPE
Initialize(THIS
);
106 // *** IOleCommandTarget methods ***
107 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
);
108 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
110 // *** IServiceProvider methods ***
111 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
113 // *** IInputObjectSite methods ***
114 virtual HRESULT STDMETHODCALLTYPE
OnFocusChangeIS(LPUNKNOWN lpUnknown
, BOOL bFocus
);
116 // *** IInputObject methods ***
117 virtual HRESULT STDMETHODCALLTYPE
UIActivateIO(BOOL bActivating
, LPMSG lpMsg
);
118 virtual HRESULT STDMETHODCALLTYPE
HasFocusIO(THIS
);
119 virtual HRESULT STDMETHODCALLTYPE
TranslateAcceleratorIO(LPMSG lpMsg
);
121 // *** IDeskBar methods ***
122 virtual HRESULT STDMETHODCALLTYPE
SetClient(IUnknown
*punkClient
);
123 virtual HRESULT STDMETHODCALLTYPE
GetClient(IUnknown
**ppunkClient
);
124 virtual HRESULT STDMETHODCALLTYPE
OnPosRectChangeDB(LPRECT prc
);
126 DECLARE_NOT_AGGREGATABLE(CMenuDeskBar
)
127 DECLARE_PROTECT_FINAL_CONSTRUCT()
130 DECLARE_WND_CLASS_EX(_T("BaseBar"), CS_SAVEBITS
| CS_DROPSHADOW
, COLOR_3DFACE
)
132 BEGIN_MSG_MAP(CMenuDeskBar
)
133 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
134 MESSAGE_HANDLER(WM_NOTIFY
, OnNotify
)
135 MESSAGE_HANDLER(WM_CANCELMODE
, OnCancelMode
)
136 MESSAGE_HANDLER(WM_WINDOWPOSCHANGED
, OnWindowPosChanged
)
137 MESSAGE_HANDLER(WM_PAINT
, OnPaint
)
141 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
142 LRESULT
OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
143 LRESULT
OnCancelMode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
144 LRESULT
OnWindowPosChanged(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
145 LRESULT
OnPaint(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
149 BEGIN_COM_MAP(CMenuDeskBar
)
150 COM_INTERFACE_ENTRY_IID(IID_IMenuPopup
, IMenuPopup
)
151 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
152 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
153 COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite
, IInputObjectSite
)
154 COM_INTERFACE_ENTRY_IID(IID_IInputObject
, IInputObject
)
155 COM_INTERFACE_ENTRY_IID(IID_IDeskBar
, IMenuPopup
)
156 COM_INTERFACE_ENTRY_IID(IID_IOleWindow
, IMenuPopup
)
157 COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite
, IObjectWithSite
)
158 COM_INTERFACE_ENTRY_IID(IID_IBanneredBar
, IBanneredBar
)
159 COM_INTERFACE_ENTRY_IID(IID_IInitializeObject
, IInitializeObject
)
164 HRESULT
CMenuDeskBar_Constructor(REFIID riid
, LPVOID
*ppv
)
168 CMenuDeskBar
* deskbar
= new CComObject
<CMenuDeskBar
>();
171 return E_OUTOFMEMORY
;
173 HRESULT hr
= deskbar
->QueryInterface(riid
, ppv
);
182 CMenuDeskBar::CMenuDeskBar()
187 hr
= CoCreateInstance(CLSID_MenuDeskBar
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IMenuPopup
, &m_IMenuPopup
));
188 hr
= m_IMenuPopup
->QueryInterface(IID_PPV_ARG(IUnknown
, &m_IUnknown
));
190 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &m_IOleCommandTarget
));
191 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &m_IServiceProvider
));
192 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IDeskBar
, &m_IDeskBar
));
193 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IOleWindow
, &m_IOleWindow
));
194 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IInputObjectSite
, &m_IInputObjectSite
));
195 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IInputObject
, &m_IInputObject
));
196 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &m_IObjectWithSite
));
197 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IBanneredBar
, &m_IBanneredBar
));
198 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IInitializeObject
, &m_IInitializeObject
));
201 CMenuDeskBar::~CMenuDeskBar()
203 m_IUnknown
->Release();
204 m_IMenuPopup
->Release();
205 m_IOleCommandTarget
->Release();
206 m_IServiceProvider
->Release();
207 m_IDeskBar
->Release();
208 m_IOleWindow
->Release();
209 m_IInputObjectSite
->Release();
210 m_IInputObject
->Release();
211 m_IObjectWithSite
->Release();
212 m_IBanneredBar
->Release();
213 m_IInitializeObject
->Release();
218 // *** IMenuPopup methods ***
219 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::Popup(POINTL
*ppt
, RECTL
*prcExclude
, MP_POPUPFLAGS dwFlags
)
221 WrapLogEnter("CMenuDeskBar<%p>::Popup(POINTL *ppt=%p, RECTL *prcExclude=%p, MP_POPUPFLAGS dwFlags=%08x)\n", this, ppt
, prcExclude
, dwFlags
);
222 HRESULT hr
= m_IMenuPopup
->Popup(ppt
, prcExclude
, dwFlags
);
223 WrapLogExit("CMenuDeskBar::Popup() = %08x\n", hr
);
227 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::OnSelect(DWORD dwSelectType
)
229 WrapLogEnter("CMenuDeskBar<%p>::OnSelect(DWORD dwSelectType=%08x)\n", this, dwSelectType
);
230 HRESULT hr
= m_IMenuPopup
->OnSelect(dwSelectType
);
231 WrapLogExit("CMenuDeskBar::OnSelect() = %08x\n", hr
);
235 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetSubMenu(IMenuPopup
*pmp
, BOOL fSet
)
237 WrapLogEnter("CMenuDeskBar<%p>::SetSubMenu(IMenuPopup *pmp=%p, BOOL fSet=%d)\n", this, pmp
, fSet
);
238 HRESULT hr
= m_IMenuPopup
->SetSubMenu(pmp
, fSet
);
239 WrapLogExit("CMenuDeskBar::SetSubMenu() = %08x\n", hr
);
243 // *** IOleWindow methods ***
244 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetWindow(HWND
*phwnd
)
246 WrapLogEnter("CMenuDeskBar<%p>::GetWindow(HWND *phwnd=%p)\n", this, phwnd
);
247 HRESULT hr
= m_IOleWindow
->GetWindow(phwnd
);
248 if (phwnd
) WrapLogMsg("*phwnd=%p\n", *phwnd
);
249 WrapLogExit("CMenuDeskBar::GetWindow() = %08x\n", hr
);
253 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::ContextSensitiveHelp(BOOL fEnterMode
)
255 WrapLogEnter("CMenuDeskBar<%p>::ContextSensitiveHelp(BOOL fEnterMode=%d)\n", this, fEnterMode
);
256 HRESULT hr
= m_IOleWindow
->ContextSensitiveHelp(fEnterMode
);
257 WrapLogExit("CMenuDeskBar::ContextSensitiveHelp() = %08x\n", hr
);
261 // *** IObjectWithSite methods ***
262 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetSite(IUnknown
*pUnkSite
)
264 WrapLogEnter("CMenuDeskBar<%p>::SetSite(IUnknown *pUnkSite=%p)\n", this, pUnkSite
);
265 HRESULT hr
= m_IObjectWithSite
->SetSite(pUnkSite
);
266 WrapLogExit("CMenuDeskBar::SetSite() = %08x\n", hr
);
270 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetSite(REFIID riid
, PVOID
*ppvSite
)
272 WrapLogEnter("CMenuDeskBar<%p>::GetSite(REFIID riid=%s, PVOID *ppvSite=%p)\n", this, Wrap(riid
), ppvSite
);
273 HRESULT hr
= m_IObjectWithSite
->GetSite(riid
, ppvSite
);
274 if (ppvSite
) WrapLogMsg("*ppvSite=%p\n", *ppvSite
);
275 WrapLogExit("CMenuDeskBar::GetSite() = %08x\n", hr
);
279 // *** IBanneredBar methods ***
280 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetIconSize(DWORD iIcon
)
282 WrapLogEnter("CMenuDeskBar<%p>::SetIconSize(DWORD iIcon=%d)\n", this, iIcon
);
283 HRESULT hr
= m_IBanneredBar
->SetIconSize(iIcon
);
284 WrapLogExit("CMenuDeskBar::SetIconSize() = %08x\n", hr
);
288 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetIconSize(DWORD
* piIcon
)
290 WrapLogEnter("CMenuDeskBar<%p>::GetIconSize(DWORD* piIcon=%p)\n", this, piIcon
);
291 HRESULT hr
= m_IBanneredBar
->GetIconSize(piIcon
);
292 if (piIcon
) WrapLogMsg("*piIcon=%d\n", *piIcon
);
293 WrapLogExit("CMenuDeskBar::GetIconSize() = %08x\n", hr
);
297 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetBitmap(HBITMAP hBitmap
)
299 WrapLogEnter("CMenuDeskBar<%p>::SetBitmap(HBITMAP hBitmap=%p)\n", this, hBitmap
);
300 HRESULT hr
= m_IBanneredBar
->SetBitmap(hBitmap
);
301 WrapLogExit("CMenuDeskBar::SetBitmap() = %08x\n", hr
);
305 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetBitmap(HBITMAP
* phBitmap
)
307 WrapLogEnter("CMenuDeskBar<%p>::GetBitmap(HBITMAP* phBitmap=%p)\n", this, phBitmap
);
308 HRESULT hr
= m_IBanneredBar
->GetBitmap(phBitmap
);
309 if (phBitmap
) WrapLogMsg("*phBitmap=%p\n", *phBitmap
);
310 WrapLogExit("CMenuDeskBar::GetBitmap() = %08x\n", hr
);
315 // *** IInitializeObject methods ***
316 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::Initialize(THIS
)
318 WrapLogEnter("CMenuDeskBar<%p>::Initialize()\n", this);
319 HRESULT hr
= m_IInitializeObject
->Initialize();
320 WrapLogExit("CMenuDeskBar::Initialize() = %08x\n", hr
);
324 // *** IOleCommandTarget methods ***
325 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
327 WrapLogEnter("CMenuDeskBar<%p>::QueryStatus(const GUID *pguidCmdGroup=%p, ULONG cCmds=%u, prgCmds=%p, pCmdText=%p)\n", this, pguidCmdGroup
, cCmds
, prgCmds
, pCmdText
);
328 HRESULT hr
= m_IOleCommandTarget
->QueryStatus(pguidCmdGroup
, cCmds
, prgCmds
, pCmdText
);
329 if (pguidCmdGroup
) WrapLogMsg("*pguidCmdGroup=%s\n", Wrap(*pguidCmdGroup
));
330 WrapLogExit("CMenuDeskBar::QueryStatus() = %08x\n", hr
);
334 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
338 WrapLogEnter("CMenuDeskBar<%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
);
340 //if (pguidCmdGroup && IsEqualGUID(*pguidCmdGroup, CLSID_MenuBand))
342 // if (nCmdID == 19) // popup
349 if (pguidCmdGroup
) WrapLogMsg("*pguidCmdGroup=%s\n", Wrap(*pguidCmdGroup
));
350 HRESULT hr
= m_IOleCommandTarget
->Exec(pguidCmdGroup
, nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
351 WrapLogExit("CMenuDeskBar::Exec() = %08x\n", hr
);
355 // *** IServiceProvider methods ***
356 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
358 WrapLogEnter("CMenuDeskBar<%p>::QueryService(REFGUID guidService=%s, REFIID riid=%s, void **ppvObject=%p)\n", this, Wrap(guidService
), Wrap(riid
), ppvObject
);
360 //if (IsEqualIID(guidService, SID_SMenuBandChild))
362 // WrapLogMsg("SID is SID_SMenuBandChild. Using QueryInterface of self instead of wrapped object.\n");
363 // HRESULT hr = this->QueryInterface(riid, ppvObject);
364 // if (ppvObject) WrapLogMsg("*ppvObject=%p\n", *ppvObject);
365 // WrapLogExit("CMenuDeskBar::QueryService() = %08x\n", hr);
370 WrapLogMsg("SID not identified.\n");
372 HRESULT hr
= m_IServiceProvider
->QueryService(guidService
, riid
, ppvObject
);
373 if (ppvObject
) WrapLogMsg("*ppvObject=%p\n", *ppvObject
);
374 WrapLogExit("CMenuDeskBar::QueryService() = %08x\n", hr
);
378 // *** IInputObjectSite methods ***
379 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::OnFocusChangeIS(LPUNKNOWN lpUnknown
, BOOL bFocus
)
381 WrapLogEnter("CMenuDeskBar<%p>::OnFocusChangeIS(LPUNKNOWN lpUnknown=%p, BOOL bFocus=%d)\n", this, lpUnknown
, bFocus
);
382 HRESULT hr
= m_IInputObjectSite
->OnFocusChangeIS(lpUnknown
, bFocus
);
383 WrapLogExit("CMenuDeskBar::OnFocusChangeIS() = %08x\n", hr
);
387 // *** IInputObject methods ***
388 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::UIActivateIO(BOOL bActivating
, LPMSG lpMsg
)
390 WrapLogEnter("CMenuDeskBar<%p>::UIActivateIO(BOOL bActivating=%d, LPMSG lpMsg=%p)\n", this, bActivating
, lpMsg
);
391 HRESULT hr
= m_IInputObject
->UIActivateIO(bActivating
, lpMsg
);
392 WrapLogExit("CMenuDeskBar::UIActivateIO() = %08x\n", hr
);
396 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::HasFocusIO(THIS
)
398 WrapLogEnter("CMenuDeskBar<%p>::HasFocusIO()\n", this);
399 HRESULT hr
= m_IInputObject
->HasFocusIO();
400 WrapLogExit("CMenuDeskBar::HasFocusIO() = %08x\n", hr
);
404 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::TranslateAcceleratorIO(LPMSG lpMsg
)
406 WrapLogEnter("CMenuDeskBar<%p>::TranslateAcceleratorIO(LPMSG lpMsg=%p)\n", this, lpMsg
);
407 if (lpMsg
) WrapLogMsg("*lpMsg=%s\n", Wrap(*lpMsg
));
408 HRESULT hr
= m_IInputObject
->TranslateAcceleratorIO(lpMsg
);
409 WrapLogExit("CMenuDeskBar::TranslateAcceleratorIO() = %08x\n", hr
);
413 // *** IDeskBar methods ***
414 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetClient(IUnknown
*punkClient
)
416 WrapLogEnter("CMenuDeskBar<%p>::SetClient(IUnknown *punkClient=%p)\n", this, punkClient
);
417 HRESULT hr
= m_IDeskBar
->SetClient(punkClient
);
418 WrapLogExit("CMenuDeskBar::SetClient() = %08x\n", hr
);
422 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetClient(IUnknown
**ppunkClient
)
424 WrapLogEnter("CMenuDeskBar<%p>::GetClient(IUnknown **ppunkClient=%p)\n", this, ppunkClient
);
425 HRESULT hr
= m_IDeskBar
->GetClient(ppunkClient
);
426 if (ppunkClient
) WrapLogMsg("*ppunkClient=%p\n", *ppunkClient
);
427 WrapLogExit("CMenuDeskBar::GetClient() = %08x\n", hr
);
431 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::OnPosRectChangeDB(LPRECT prc
)
433 WrapLogEnter("CMenuDeskBar<%p>::OnPosRectChangeDB(RECT *prc=%p)\n", this, prc
);
434 HRESULT hr
= m_IDeskBar
->OnPosRectChangeDB(prc
);
435 if (prc
) WrapLogMsg("*prc=%s\n", Wrap(*prc
));
436 WrapLogExit("CMenuDeskBar::OnPosRectChangeDB() = %08x\n", hr
);
441 CMenuDeskBar::CMenuDeskBar() :
443 m_ClientWindow(NULL
),
452 CMenuDeskBar::~CMenuDeskBar()
456 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetWindow(HWND
*lphwnd
)
464 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::ContextSensitiveHelp(BOOL fEnterMode
)
469 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::OnFocusChangeIS(IUnknown
*punkObj
, BOOL fSetFocus
)
471 CComPtr
<IInputObjectSite
> ios
;
473 HRESULT hr
= m_Client
->QueryInterface(IID_PPV_ARG(IInputObjectSite
, &ios
));
477 return ios
->OnFocusChangeIS(punkObj
, fSetFocus
);
480 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
481 OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
486 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
487 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
489 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
492 else if (IsEqualIID(*pguidCmdGroup
, IID_IDeskBarClient
))
508 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
513 if (IsEqualGUID(guidService
, SID_SMenuPopup
))
515 return this->QueryInterface(riid
, ppvObject
);
518 return IUnknown_QueryService(m_Site
, guidService
, riid
, ppvObject
);
521 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
523 return IUnknown_UIActivateIO(m_Client
, fActivate
, lpMsg
);
526 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::HasFocusIO()
528 CComPtr
<IInputObject
> io
;
530 HRESULT hr
= m_Client
->QueryInterface(IID_PPV_ARG(IInputObject
, &io
));
534 return io
->HasFocusIO();
537 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::TranslateAcceleratorIO(LPMSG lpMsg
)
539 CComPtr
<IInputObject
> io
;
541 HRESULT hr
= m_Client
->QueryInterface(IID_PPV_ARG(IInputObject
, &io
));
545 return io
->TranslateAcceleratorIO(lpMsg
);
548 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetClient(IUnknown
*punkClient
)
550 CComPtr
<IDeskBarClient
> pDeskBandClient
;
555 if (punkClient
== NULL
)
563 hResult
= punkClient
->QueryInterface(IID_IUnknown
, reinterpret_cast<void **>(&m_Client
));
567 hResult
= m_Client
->QueryInterface(IID_IDeskBarClient
, (VOID
**) &pDeskBandClient
);
571 return pDeskBandClient
->SetDeskBarSite(static_cast<IDeskBar
*>(this));
574 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetClient(IUnknown
**ppunkClient
)
576 if (ppunkClient
== NULL
)
582 return m_Client
->QueryInterface(IID_PPV_ARG(IUnknown
, ppunkClient
));
585 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::OnPosRectChangeDB(LPRECT prc
)
592 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetSite(IUnknown
*pUnkSite
)
599 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetSite(REFIID riid
, void **ppvSite
)
604 return m_Site
->QueryInterface(riid
, ppvSite
);
607 LRESULT
CMenuDeskBar::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
613 CComPtr
<IOleWindow
> pOw
;
614 hr
= m_Client
->QueryInterface(IID_PPV_ARG(IOleWindow
, &pOw
));
617 ERR("IUnknown_QueryInterface pBs failed: %x\n", hr
);
622 pOw
->GetWindow(&clientWnd
);
628 if (m_Banner
!= NULL
)
631 ::GetObject(m_Banner
, sizeof(bm
), &bm
);
632 rc
.left
+= bm
.bmWidth
;
635 ::SetWindowPos(clientWnd
, NULL
, rc
.left
, rc
.top
, rc
.right
- rc
.left
, rc
.bottom
- rc
.top
, 0);
641 LRESULT
CMenuDeskBar::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
643 CComPtr
<IWinEventHandler
> winEventHandler
;
648 if (m_Client
.p
!= NULL
)
650 hResult
= m_Client
->QueryInterface(IID_IWinEventHandler
, reinterpret_cast<void **>(&winEventHandler
));
651 if (SUCCEEDED(hResult
) && winEventHandler
.p
!= NULL
)
652 hResult
= winEventHandler
->OnWinEvent(NULL
, uMsg
, wParam
, lParam
, &result
);
657 LRESULT
CMenuDeskBar::OnCancelMode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
663 LRESULT
CMenuDeskBar::OnWindowPosChanged(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
668 LRESULT
CMenuDeskBar::OnPaint(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
672 if (m_Banner
&& !m_IconSize
)
676 HDC hdc
= BeginPaint(&ps
);
678 HDC hdcMem
= ::CreateCompatibleDC(hdc
);
679 HGDIOBJ hbmOld
= ::SelectObject(hdcMem
, m_Banner
);
681 ::GetObject(m_Banner
, sizeof(bm
), &bm
);
684 if (!GetClientRect(&rc
))
685 WARN("GetClientRect failed\n");
687 const int bx
= bm
.bmWidth
;
688 const int by
= bm
.bmHeight
;
689 const int cx
= rc
.right
;
690 const int cy
= rc
.bottom
;
692 TRACE("Painting banner: %d by %d\n", bm
.bmWidth
, bm
.bmHeight
);
694 if (!::StretchBlt(hdc
, 0, 0, bx
, cy
- by
, hdcMem
, 0, 0, bx
, 1, SRCCOPY
))
695 WARN("StretchBlt failed\n");
697 if (!::BitBlt(hdc
, 0, cy
- by
, bx
, by
, hdcMem
, 0, 0, SRCCOPY
))
698 WARN("BitBlt failed\n");
700 ::SelectObject(hdcMem
, hbmOld
);
709 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::Popup(POINTL
*ppt
, RECTL
*prcExclude
, MP_POPUPFLAGS dwFlags
)
712 CComPtr
<IOleCommandTarget
> oct
;
713 CComPtr
<IInputObject
> io
;
714 CComPtr
<IDeskBand
> band
;
715 CComPtr
<IDeskBarClient
> dbc
;
720 hr
= IUnknown_QueryService(m_Client
, SID_SMenuBandChild
, IID_PPV_ARG(IOleCommandTarget
, &oct
));
724 hr
= m_Client
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &dbc
));
728 // No clue about the arg, using anything != 0
729 hr
= dbc
->UIActivateDBC(TRUE
);
734 hr
= dbc
->GetSize(0, &rc
);
740 const int CMD_EXEC_OPT
= 0;
742 hr
= IUnknown_QueryServiceExec(m_Client
, SID_SMenuBandChild
, &CLSID_MenuBand
, CMD
, CMD_EXEC_OPT
, NULL
, NULL
);
746 ::AdjustWindowRect(&rc
, ::GetWindowLong(m_hWnd
, GWL_STYLE
), FALSE
);
750 if (m_Banner
!= NULL
)
753 ::GetObject(m_Banner
, sizeof(bm
), &bm
);
754 rc
.right
+= bm
.bmWidth
;
758 int y
= ppt
->y
- rc
.bottom
;
767 // if (y+cy > work area height) cy = work area height - y
769 this->SetWindowPos(HWND_TOPMOST
, x
, y
, cx
, cy
, SWP_SHOWWINDOW
);
771 // HACK: The bar needs to be notified of the size AFTER it is shown.
772 // Quick & dirty way of getting it done.
774 OnSize(WM_SIZE
, 0, 0, bHandled
);
776 UIActivateIO(TRUE
, NULL
);
781 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetIconSize(THIS_ DWORD iIcon
)
786 // Unknown meaning (set flags? set icon size?)
788 const int CMD_EXEC_OPT
= iIcon
? 0 : 2; // seems to work
790 hr
= IUnknown_QueryServiceExec(m_Client
, SID_SMenuBandChild
, &CLSID_MenuBand
, CMD
, CMD_EXEC_OPT
, NULL
, NULL
);
795 OnSize(WM_SIZE
, 0, 0, bHandled
);
800 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetIconSize(THIS_ DWORD
* piIcon
)
803 *piIcon
= m_IconSize
;
807 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetBitmap(THIS_ HBITMAP hBitmap
)
812 OnSize(WM_SIZE
, 0, 0, bHandled
);
817 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetBitmap(THIS_ HBITMAP
* phBitmap
)
820 *phBitmap
= m_Banner
;
824 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::OnSelect(
827 if (dwSelectType
== MPOS_FULLCANCEL
)
829 CComPtr
<IDeskBarClient
> dbc
;
831 HRESULT hr
= m_Client
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &dbc
));
835 hr
= dbc
->UIActivateDBC(FALSE
);
839 SetWindowPos(m_hWnd
, 0, 0, 0, 0, SWP_HIDEWINDOW
| SWP_NOACTIVATE
| SWP_NOMOVE
| SWP_NOZORDER
);
841 UIActivateIO(FALSE
, NULL
);
847 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetSubMenu(
854 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::Initialize(THIS
)