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"), 0, 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_ACTIVATE
, OnActivate
)
138 MESSAGE_HANDLER(WM_PAINT
, OnPaint
)
142 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
143 LRESULT
OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
144 LRESULT
OnCancelMode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
145 LRESULT
OnWindowPosChanged(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
146 LRESULT
OnActivate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
147 LRESULT
OnPaint(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
151 BEGIN_COM_MAP(CMenuDeskBar
)
152 COM_INTERFACE_ENTRY_IID(IID_IMenuPopup
, IMenuPopup
)
153 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
154 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
155 COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite
, IInputObjectSite
)
156 COM_INTERFACE_ENTRY_IID(IID_IInputObject
, IInputObject
)
157 COM_INTERFACE_ENTRY_IID(IID_IDeskBar
, IMenuPopup
)
158 COM_INTERFACE_ENTRY_IID(IID_IOleWindow
, IMenuPopup
)
159 COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite
, IObjectWithSite
)
160 COM_INTERFACE_ENTRY_IID(IID_IBanneredBar
, IBanneredBar
)
161 COM_INTERFACE_ENTRY_IID(IID_IInitializeObject
, IInitializeObject
)
166 HRESULT
CMenuDeskBar_Constructor(REFIID riid
, LPVOID
*ppv
)
170 CMenuDeskBar
* deskbar
= new CComObject
<CMenuDeskBar
>();
173 return E_OUTOFMEMORY
;
175 HRESULT hr
= deskbar
->QueryInterface(riid
, ppv
);
184 CMenuDeskBar::CMenuDeskBar()
189 hr
= CoCreateInstance(CLSID_MenuDeskBar
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IMenuPopup
, &m_IMenuPopup
));
190 hr
= m_IMenuPopup
->QueryInterface(IID_PPV_ARG(IUnknown
, &m_IUnknown
));
192 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &m_IOleCommandTarget
));
193 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &m_IServiceProvider
));
194 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IDeskBar
, &m_IDeskBar
));
195 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IOleWindow
, &m_IOleWindow
));
196 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IInputObjectSite
, &m_IInputObjectSite
));
197 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IInputObject
, &m_IInputObject
));
198 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &m_IObjectWithSite
));
199 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IBanneredBar
, &m_IBanneredBar
));
200 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IInitializeObject
, &m_IInitializeObject
));
203 CMenuDeskBar::~CMenuDeskBar()
205 m_IUnknown
->Release();
206 m_IMenuPopup
->Release();
207 m_IOleCommandTarget
->Release();
208 m_IServiceProvider
->Release();
209 m_IDeskBar
->Release();
210 m_IOleWindow
->Release();
211 m_IInputObjectSite
->Release();
212 m_IInputObject
->Release();
213 m_IObjectWithSite
->Release();
214 m_IBanneredBar
->Release();
215 m_IInitializeObject
->Release();
220 // *** IMenuPopup methods ***
221 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::Popup(POINTL
*ppt
, RECTL
*prcExclude
, MP_POPUPFLAGS dwFlags
)
223 WrapLogEnter("CMenuDeskBar<%p>::Popup(POINTL *ppt=%p, RECTL *prcExclude=%p, MP_POPUPFLAGS dwFlags=%08x)\n", this, ppt
, prcExclude
, dwFlags
);
224 HRESULT hr
= m_IMenuPopup
->Popup(ppt
, prcExclude
, dwFlags
);
225 WrapLogExit("CMenuDeskBar::Popup() = %08x\n", hr
);
229 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::OnSelect(DWORD dwSelectType
)
231 WrapLogEnter("CMenuDeskBar<%p>::OnSelect(DWORD dwSelectType=%08x)\n", this, dwSelectType
);
232 HRESULT hr
= m_IMenuPopup
->OnSelect(dwSelectType
);
233 WrapLogExit("CMenuDeskBar::OnSelect() = %08x\n", hr
);
237 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetSubMenu(IMenuPopup
*pmp
, BOOL fSet
)
239 WrapLogEnter("CMenuDeskBar<%p>::SetSubMenu(IMenuPopup *pmp=%p, BOOL fSet=%d)\n", this, pmp
, fSet
);
240 HRESULT hr
= m_IMenuPopup
->SetSubMenu(pmp
, fSet
);
241 WrapLogExit("CMenuDeskBar::SetSubMenu() = %08x\n", hr
);
245 // *** IOleWindow methods ***
246 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetWindow(HWND
*phwnd
)
248 WrapLogEnter("CMenuDeskBar<%p>::GetWindow(HWND *phwnd=%p)\n", this, phwnd
);
249 HRESULT hr
= m_IOleWindow
->GetWindow(phwnd
);
250 if (phwnd
) WrapLogMsg("*phwnd=%p\n", *phwnd
);
251 WrapLogExit("CMenuDeskBar::GetWindow() = %08x\n", hr
);
255 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::ContextSensitiveHelp(BOOL fEnterMode
)
257 WrapLogEnter("CMenuDeskBar<%p>::ContextSensitiveHelp(BOOL fEnterMode=%d)\n", this, fEnterMode
);
258 HRESULT hr
= m_IOleWindow
->ContextSensitiveHelp(fEnterMode
);
259 WrapLogExit("CMenuDeskBar::ContextSensitiveHelp() = %08x\n", hr
);
263 // *** IObjectWithSite methods ***
264 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetSite(IUnknown
*pUnkSite
)
266 WrapLogEnter("CMenuDeskBar<%p>::SetSite(IUnknown *pUnkSite=%p)\n", this, pUnkSite
);
267 HRESULT hr
= m_IObjectWithSite
->SetSite(pUnkSite
);
268 WrapLogExit("CMenuDeskBar::SetSite() = %08x\n", hr
);
272 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetSite(REFIID riid
, PVOID
*ppvSite
)
274 WrapLogEnter("CMenuDeskBar<%p>::GetSite(REFIID riid=%s, PVOID *ppvSite=%p)\n", this, Wrap(riid
), ppvSite
);
275 HRESULT hr
= m_IObjectWithSite
->GetSite(riid
, ppvSite
);
276 if (ppvSite
) WrapLogMsg("*ppvSite=%p\n", *ppvSite
);
277 WrapLogExit("CMenuDeskBar::GetSite() = %08x\n", hr
);
281 // *** IBanneredBar methods ***
282 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetIconSize(DWORD iIcon
)
284 WrapLogEnter("CMenuDeskBar<%p>::SetIconSize(DWORD iIcon=%d)\n", this, iIcon
);
285 HRESULT hr
= m_IBanneredBar
->SetIconSize(iIcon
);
286 WrapLogExit("CMenuDeskBar::SetIconSize() = %08x\n", hr
);
290 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetIconSize(DWORD
* piIcon
)
292 WrapLogEnter("CMenuDeskBar<%p>::GetIconSize(DWORD* piIcon=%p)\n", this, piIcon
);
293 HRESULT hr
= m_IBanneredBar
->GetIconSize(piIcon
);
294 if (piIcon
) WrapLogMsg("*piIcon=%d\n", *piIcon
);
295 WrapLogExit("CMenuDeskBar::GetIconSize() = %08x\n", hr
);
299 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetBitmap(HBITMAP hBitmap
)
301 WrapLogEnter("CMenuDeskBar<%p>::SetBitmap(HBITMAP hBitmap=%p)\n", this, hBitmap
);
302 HRESULT hr
= m_IBanneredBar
->SetBitmap(hBitmap
);
303 WrapLogExit("CMenuDeskBar::SetBitmap() = %08x\n", hr
);
307 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetBitmap(HBITMAP
* phBitmap
)
309 WrapLogEnter("CMenuDeskBar<%p>::GetBitmap(HBITMAP* phBitmap=%p)\n", this, phBitmap
);
310 HRESULT hr
= m_IBanneredBar
->GetBitmap(phBitmap
);
311 if (phBitmap
) WrapLogMsg("*phBitmap=%p\n", *phBitmap
);
312 WrapLogExit("CMenuDeskBar::GetBitmap() = %08x\n", hr
);
317 // *** IInitializeObject methods ***
318 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::Initialize(THIS
)
320 WrapLogEnter("CMenuDeskBar<%p>::Initialize()\n", this);
321 HRESULT hr
= m_IInitializeObject
->Initialize();
322 WrapLogExit("CMenuDeskBar::Initialize() = %08x\n", hr
);
326 // *** IOleCommandTarget methods ***
327 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
329 WrapLogEnter("CMenuDeskBar<%p>::QueryStatus(const GUID *pguidCmdGroup=%p, ULONG cCmds=%u, prgCmds=%p, pCmdText=%p)\n", this, pguidCmdGroup
, cCmds
, prgCmds
, pCmdText
);
330 HRESULT hr
= m_IOleCommandTarget
->QueryStatus(pguidCmdGroup
, cCmds
, prgCmds
, pCmdText
);
331 if (pguidCmdGroup
) WrapLogMsg("*pguidCmdGroup=%s\n", Wrap(*pguidCmdGroup
));
332 WrapLogExit("CMenuDeskBar::QueryStatus() = %08x\n", hr
);
336 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
340 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
);
342 //if (pguidCmdGroup && IsEqualGUID(*pguidCmdGroup, CLSID_MenuBand))
344 // if (nCmdID == 19) // popup
351 if (pguidCmdGroup
) WrapLogMsg("*pguidCmdGroup=%s\n", Wrap(*pguidCmdGroup
));
352 HRESULT hr
= m_IOleCommandTarget
->Exec(pguidCmdGroup
, nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
353 WrapLogExit("CMenuDeskBar::Exec() = %08x\n", hr
);
357 // *** IServiceProvider methods ***
358 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
360 WrapLogEnter("CMenuDeskBar<%p>::QueryService(REFGUID guidService=%s, REFIID riid=%s, void **ppvObject=%p)\n", this, Wrap(guidService
), Wrap(riid
), ppvObject
);
362 //if (IsEqualIID(guidService, SID_SMenuBandChild))
364 // WrapLogMsg("SID is SID_SMenuBandChild. Using QueryInterface of self instead of wrapped object.\n");
365 // HRESULT hr = this->QueryInterface(riid, ppvObject);
366 // if (ppvObject) WrapLogMsg("*ppvObject=%p\n", *ppvObject);
367 // WrapLogExit("CMenuDeskBar::QueryService() = %08x\n", hr);
372 WrapLogMsg("SID not identified.\n");
374 HRESULT hr
= m_IServiceProvider
->QueryService(guidService
, riid
, ppvObject
);
375 if (ppvObject
) WrapLogMsg("*ppvObject=%p\n", *ppvObject
);
376 WrapLogExit("CMenuDeskBar::QueryService() = %08x\n", hr
);
380 // *** IInputObjectSite methods ***
381 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::OnFocusChangeIS(LPUNKNOWN lpUnknown
, BOOL bFocus
)
383 WrapLogEnter("CMenuDeskBar<%p>::OnFocusChangeIS(LPUNKNOWN lpUnknown=%p, BOOL bFocus=%d)\n", this, lpUnknown
, bFocus
);
384 HRESULT hr
= m_IInputObjectSite
->OnFocusChangeIS(lpUnknown
, bFocus
);
385 WrapLogExit("CMenuDeskBar::OnFocusChangeIS() = %08x\n", hr
);
389 // *** IInputObject methods ***
390 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::UIActivateIO(BOOL bActivating
, LPMSG lpMsg
)
392 WrapLogEnter("CMenuDeskBar<%p>::UIActivateIO(BOOL bActivating=%d, LPMSG lpMsg=%p)\n", this, bActivating
, lpMsg
);
393 HRESULT hr
= m_IInputObject
->UIActivateIO(bActivating
, lpMsg
);
394 WrapLogExit("CMenuDeskBar::UIActivateIO() = %08x\n", hr
);
398 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::HasFocusIO(THIS
)
400 WrapLogEnter("CMenuDeskBar<%p>::HasFocusIO()\n", this);
401 HRESULT hr
= m_IInputObject
->HasFocusIO();
402 WrapLogExit("CMenuDeskBar::HasFocusIO() = %08x\n", hr
);
406 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::TranslateAcceleratorIO(LPMSG lpMsg
)
408 WrapLogEnter("CMenuDeskBar<%p>::TranslateAcceleratorIO(LPMSG lpMsg=%p)\n", this, lpMsg
);
409 if (lpMsg
) WrapLogMsg("*lpMsg=%s\n", Wrap(*lpMsg
));
410 HRESULT hr
= m_IInputObject
->TranslateAcceleratorIO(lpMsg
);
411 WrapLogExit("CMenuDeskBar::TranslateAcceleratorIO() = %08x\n", hr
);
415 // *** IDeskBar methods ***
416 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetClient(IUnknown
*punkClient
)
418 WrapLogEnter("CMenuDeskBar<%p>::SetClient(IUnknown *punkClient=%p)\n", this, punkClient
);
419 HRESULT hr
= m_IDeskBar
->SetClient(punkClient
);
420 WrapLogExit("CMenuDeskBar::SetClient() = %08x\n", hr
);
424 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetClient(IUnknown
**ppunkClient
)
426 WrapLogEnter("CMenuDeskBar<%p>::GetClient(IUnknown **ppunkClient=%p)\n", this, ppunkClient
);
427 HRESULT hr
= m_IDeskBar
->GetClient(ppunkClient
);
428 if (ppunkClient
) WrapLogMsg("*ppunkClient=%p\n", *ppunkClient
);
429 WrapLogExit("CMenuDeskBar::GetClient() = %08x\n", hr
);
433 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::OnPosRectChangeDB(LPRECT prc
)
435 WrapLogEnter("CMenuDeskBar<%p>::OnPosRectChangeDB(RECT *prc=%p)\n", this, prc
);
436 HRESULT hr
= m_IDeskBar
->OnPosRectChangeDB(prc
);
437 if (prc
) WrapLogMsg("*prc=%s\n", Wrap(*prc
));
438 WrapLogExit("CMenuDeskBar::OnPosRectChangeDB() = %08x\n", hr
);
443 CMenuDeskBar::CMenuDeskBar() :
445 m_ClientWindow(NULL
),
453 CMenuDeskBar::~CMenuDeskBar()
457 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetWindow(HWND
*lphwnd
)
465 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::ContextSensitiveHelp(BOOL fEnterMode
)
470 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::OnFocusChangeIS(IUnknown
*punkObj
, BOOL fSetFocus
)
472 CComPtr
<IInputObjectSite
> ios
;
474 HRESULT hr
= m_Client
->QueryInterface(IID_PPV_ARG(IInputObjectSite
, &ios
));
478 return ios
->OnFocusChangeIS(punkObj
, fSetFocus
);
481 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
482 OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
487 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
488 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
490 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
493 else if (IsEqualIID(*pguidCmdGroup
, IID_IDeskBarClient
))
509 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
514 if (IsEqualGUID(guidService
,SID_SMenuPopup
))
516 return this->QueryInterface(riid
, ppvObject
);
519 return IUnknown_QueryService(m_Site
, guidService
, riid
, ppvObject
);
522 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
524 return IUnknown_UIActivateIO(m_Client
, fActivate
, lpMsg
);
527 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::HasFocusIO()
529 CComPtr
<IInputObject
> io
;
531 HRESULT hr
= m_Client
->QueryInterface(IID_PPV_ARG(IInputObject
, &io
));
535 return io
->HasFocusIO();
538 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::TranslateAcceleratorIO(LPMSG lpMsg
)
540 CComPtr
<IInputObject
> io
;
542 HRESULT hr
= m_Client
->QueryInterface(IID_PPV_ARG(IInputObject
, &io
));
546 return io
->TranslateAcceleratorIO(lpMsg
);
549 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetClient(IUnknown
*punkClient
)
551 CComPtr
<IDeskBarClient
> pDeskBandClient
;
556 if (punkClient
== NULL
)
564 hResult
= punkClient
->QueryInterface(IID_IUnknown
, reinterpret_cast<void **>(&m_Client
));
568 hResult
= m_Client
->QueryInterface(IID_IDeskBarClient
, (VOID
**) &pDeskBandClient
);
572 return pDeskBandClient
->SetDeskBarSite(static_cast<IDeskBar
*>(this));
575 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetClient(IUnknown
**ppunkClient
)
577 if (ppunkClient
== NULL
)
583 return m_Client
->QueryInterface(IID_PPV_ARG(IUnknown
, ppunkClient
));
586 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::OnPosRectChangeDB(LPRECT prc
)
593 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetSite(IUnknown
*pUnkSite
)
600 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetSite(REFIID riid
, void **ppvSite
)
605 return m_Site
->QueryInterface(riid
, ppvSite
);
608 LRESULT
CMenuDeskBar::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
614 CComPtr
<IOleWindow
> pOw
;
615 hr
= m_Client
->QueryInterface(IID_PPV_ARG(IOleWindow
, &pOw
));
618 ERR("IUnknown_QueryInterface pBs failed: %x\n", hr
);
623 pOw
->GetWindow(&clientWnd
);
629 if (m_Banner
!= NULL
)
632 ::GetObject(m_Banner
, sizeof(bm
), &bm
);
633 rc
.left
+= bm
.bmWidth
;
636 ::SetWindowPos(clientWnd
, NULL
, rc
.left
, rc
.top
, rc
.right
- rc
.left
, rc
.bottom
- rc
.top
, 0);
642 LRESULT
CMenuDeskBar::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
644 CComPtr
<IWinEventHandler
> winEventHandler
;
649 if (m_Client
.p
!= NULL
)
651 hResult
= m_Client
->QueryInterface(IID_IWinEventHandler
, reinterpret_cast<void **>(&winEventHandler
));
652 if (SUCCEEDED(hResult
) && winEventHandler
.p
!= NULL
)
653 hResult
= winEventHandler
->OnWinEvent(NULL
, uMsg
, wParam
, lParam
, &result
);
658 LRESULT
CMenuDeskBar::OnCancelMode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
664 LRESULT
CMenuDeskBar::OnWindowPosChanged(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
669 LRESULT
CMenuDeskBar::OnActivate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
671 if (LOWORD(wParam
) == WA_INACTIVE
)
674 //ShowWindow(SW_HIDE);
679 LRESULT
CMenuDeskBar::OnPaint(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
683 if (m_Banner
&& !m_IconSize
)
687 HDC hdc
= BeginPaint(&ps
);
689 HDC hdcMem
= ::CreateCompatibleDC(hdc
);
690 HGDIOBJ hbmOld
= ::SelectObject(hdcMem
, m_Banner
);
692 ::GetObject(m_Banner
, sizeof(bm
), &bm
);
695 if (!GetClientRect(&rc
))
696 WARN("GetClientRect failed\n");
698 const int bx
= bm
.bmWidth
;
699 const int by
= bm
.bmHeight
;
700 const int cx
= rc
.right
;
701 const int cy
= rc
.bottom
;
703 TRACE("Painting banner: %d by %d\n", bm
.bmWidth
, bm
.bmHeight
);
705 if (!::StretchBlt(hdc
, 0, 0, bx
, cy
-by
, hdcMem
, 0, 0, bx
, 1, SRCCOPY
))
706 WARN("StretchBlt failed\n");
708 if (!::BitBlt(hdc
, 0, cy
-by
, bx
, by
, hdcMem
, 0, 0, SRCCOPY
))
709 WARN("BitBlt failed\n");
711 ::SelectObject(hdcMem
, hbmOld
);
720 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::Popup(POINTL
*ppt
, RECTL
*prcExclude
, MP_POPUPFLAGS dwFlags
)
723 CComPtr
<IOleCommandTarget
> oct
;
724 CComPtr
<IInputObject
> io
;
725 CComPtr
<IDeskBand
> band
;
726 CComPtr
<IDeskBarClient
> dbc
;
731 hr
= IUnknown_QueryService(m_Client
, SID_SMenuBandChild
, IID_PPV_ARG(IOleCommandTarget
, &oct
));
735 hr
= m_Client
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &dbc
));
739 // No clue about the arg, using anything != 0
740 hr
= dbc
->UIActivateDBC(TRUE
);
745 hr
= dbc
->GetSize(0, &rc
);
751 const int CMD_EXEC_OPT
= 0;
753 hr
= IUnknown_QueryServiceExec(m_Client
, SID_SMenuBandChild
, &CLSID_MenuBand
, CMD
, CMD_EXEC_OPT
, NULL
, NULL
);
757 ::AdjustWindowRect(&rc
, WS_DLGFRAME
, FALSE
);
761 if (m_Banner
!= NULL
)
764 ::GetObject(m_Banner
, sizeof(bm
), &bm
);
765 rc
.right
+= bm
.bmWidth
;
769 int y
= ppt
->y
- rc
.bottom
;
773 this->SetWindowPos(HWND_TOPMOST
, x
, y
, cx
, cy
, SWP_SHOWWINDOW
);
775 // HACK: The bar needs to be notified of the size AFTER it is shown.
776 // Quick & dirty way of getting it done.
778 OnSize(WM_SIZE
, 0, 0, bHandled
);
780 hr
= m_Client
->QueryInterface(IID_PPV_ARG(IInputObject
, &io
));
784 io
->UIActivateIO(TRUE
, NULL
);
789 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetIconSize(THIS_ DWORD iIcon
)
794 // Unknown meaning (set flags? set icon size?)
796 const int CMD_EXEC_OPT
= iIcon
? 0 : 2; // seems to work
798 hr
= IUnknown_QueryServiceExec(m_Client
, SID_SMenuBandChild
, &CLSID_MenuBand
, CMD
, CMD_EXEC_OPT
, NULL
, NULL
);
803 OnSize(WM_SIZE
, 0, 0, bHandled
);
808 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetIconSize(THIS_ DWORD
* piIcon
)
811 *piIcon
= m_IconSize
;
815 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetBitmap(THIS_ HBITMAP hBitmap
)
820 OnSize(WM_SIZE
, 0, 0, bHandled
);
825 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetBitmap(THIS_ HBITMAP
* phBitmap
)
828 *phBitmap
= m_Banner
;
832 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::OnSelect(
838 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetSubMenu(
845 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::Initialize(THIS
)