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(CMenuDeskBar
);
29 WS_POPUP
| WS_DLGFRAME
| WS_CLIPCHILDREN
| WS_CLIPSIBLINGS
,
30 WS_EX_LEFT
| WS_EX_LTRREADING
| WS_EX_RIGHTSCROLLBAR
| WS_EX_PALETTEWINDOW
35 public CWindowImpl
<CMenuDeskBar
, CWindow
, CMenuWinTraits
>,
37 public CComCoClass
<CMenuDeskBar
>,
38 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
39 public IOleCommandTarget
,
40 public IServiceProvider
,
41 public IInputObjectSite
,
44 public IObjectWithSite
,
46 public IInitializeObject
54 IUnknown
* m_IUnknown
;
55 IMenuPopup
* m_IMenuPopup
;
56 IOleCommandTarget
* m_IOleCommandTarget
;
57 IServiceProvider
* m_IServiceProvider
;
58 IDeskBar
* m_IDeskBar
;
59 IOleWindow
* m_IOleWindow
;
60 IInputObjectSite
* m_IInputObjectSite
;
61 IInputObject
* m_IInputObject
;
62 IObjectWithSite
* m_IObjectWithSite
;
63 IBanneredBar
* m_IBanneredBar
;
64 IInitializeObject
* m_IInitializeObject
;
67 CComPtr
<IUnknown
> m_Site
;
68 CComPtr
<IUnknown
> m_Client
;
72 int m_NeededSize
; // width or height
77 // used by resize tracking loop
83 // *** IMenuPopup methods ***
84 virtual HRESULT STDMETHODCALLTYPE
Popup(POINTL
*ppt
, RECTL
*prcExclude
, MP_POPUPFLAGS dwFlags
);
85 virtual HRESULT STDMETHODCALLTYPE
OnSelect(DWORD dwSelectType
);
86 virtual HRESULT STDMETHODCALLTYPE
SetSubMenu(IMenuPopup
*pmp
, BOOL fSet
);
88 // *** IOleWindow methods ***
89 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*phwnd
);
90 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
92 // *** IObjectWithSite methods ***
93 virtual HRESULT STDMETHODCALLTYPE
SetSite(IUnknown
*pUnkSite
);
94 virtual HRESULT STDMETHODCALLTYPE
GetSite(REFIID riid
, PVOID
*ppvSite
);
96 // *** IBanneredBar methods ***
97 virtual HRESULT STDMETHODCALLTYPE
SetIconSize(DWORD iIcon
);
98 virtual HRESULT STDMETHODCALLTYPE
GetIconSize(DWORD
* piIcon
);
99 virtual HRESULT STDMETHODCALLTYPE
SetBitmap(HBITMAP hBitmap
);
100 virtual HRESULT STDMETHODCALLTYPE
GetBitmap(HBITMAP
* phBitmap
);
102 // *** IInitializeObject methods ***
103 virtual HRESULT STDMETHODCALLTYPE
Initialize(THIS
);
105 // *** IOleCommandTarget methods ***
106 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
);
107 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
109 // *** IServiceProvider methods ***
110 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
112 // *** IInputObjectSite methods ***
113 virtual HRESULT STDMETHODCALLTYPE
OnFocusChangeIS(LPUNKNOWN lpUnknown
, BOOL bFocus
);
115 // *** IInputObject methods ***
116 virtual HRESULT STDMETHODCALLTYPE
UIActivateIO(BOOL bActivating
, LPMSG lpMsg
);
117 virtual HRESULT STDMETHODCALLTYPE
HasFocusIO(THIS
);
118 virtual HRESULT STDMETHODCALLTYPE
TranslateAcceleratorIO(LPMSG lpMsg
);
120 // *** IDeskBar methods ***
121 virtual HRESULT STDMETHODCALLTYPE
SetClient(IUnknown
*punkClient
);
122 virtual HRESULT STDMETHODCALLTYPE
GetClient(IUnknown
**ppunkClient
);
123 virtual HRESULT STDMETHODCALLTYPE
OnPosRectChangeDB(LPRECT prc
);
126 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
127 LRESULT
OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
128 LRESULT
OnLButtonDown(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
129 LRESULT
OnLButtonUp(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
130 LRESULT
OnMouseMove(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
131 LRESULT
OnCancelMode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
132 LRESULT
OnCaptureChanged(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
133 LRESULT
OnWindowPosChanged(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
134 LRESULT
OnActivate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
135 LRESULT
OnPaint(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
137 DECLARE_NOT_AGGREGATABLE(CMenuDeskBar
)
138 DECLARE_PROTECT_FINAL_CONSTRUCT()
141 DECLARE_WND_CLASS_EX(_T("BaseBar"), 0, COLOR_3DFACE
)
144 BEGIN_MSG_MAP(CMenuDeskBar
)
145 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
146 MESSAGE_HANDLER(WM_NOTIFY
, OnNotify
)
147 MESSAGE_HANDLER(WM_LBUTTONDOWN
, OnLButtonDown
)
148 MESSAGE_HANDLER(WM_LBUTTONUP
, OnLButtonUp
)
149 MESSAGE_HANDLER(WM_MOUSEMOVE
, OnMouseMove
)
150 MESSAGE_HANDLER(WM_CANCELMODE
, OnCancelMode
)
151 MESSAGE_HANDLER(WM_CAPTURECHANGED
, OnCaptureChanged
)
152 MESSAGE_HANDLER(WM_WINDOWPOSCHANGED
, OnWindowPosChanged
)
153 MESSAGE_HANDLER(WM_ACTIVATE
, OnActivate
)
154 /* MESSAGE_HANDLER(WM_PAINT, OnPaint) */
157 BEGIN_COM_MAP(CMenuDeskBar
)
158 COM_INTERFACE_ENTRY_IID(IID_IMenuPopup
, IMenuPopup
)
159 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
160 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
161 COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite
, IInputObjectSite
)
162 COM_INTERFACE_ENTRY_IID(IID_IInputObject
, IInputObject
)
163 COM_INTERFACE_ENTRY_IID(IID_IDeskBar
, IMenuPopup
)
164 COM_INTERFACE_ENTRY_IID(IID_IOleWindow
, IMenuPopup
)
165 COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite
, IObjectWithSite
)
166 COM_INTERFACE_ENTRY_IID(IID_IBanneredBar
, IBanneredBar
)
167 COM_INTERFACE_ENTRY_IID(IID_IInitializeObject
, IInitializeObject
)
172 HRESULT
CMenuDeskBar_Constructor(REFIID riid
, LPVOID
*ppv
)
176 CMenuDeskBar
* deskbar
= new CComObject
<CMenuDeskBar
>();
179 return E_OUTOFMEMORY
;
181 HRESULT hr
= deskbar
->QueryInterface(riid
, ppv
);
190 CMenuDeskBar::CMenuDeskBar()
195 hr
= CoCreateInstance(CLSID_MenuDeskBar
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IMenuPopup
, &m_IMenuPopup
));
196 hr
= m_IMenuPopup
->QueryInterface(IID_PPV_ARG(IUnknown
, &m_IUnknown
));
198 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &m_IOleCommandTarget
));
199 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &m_IServiceProvider
));
200 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IDeskBar
, &m_IDeskBar
));
201 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IOleWindow
, &m_IOleWindow
));
202 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IInputObjectSite
, &m_IInputObjectSite
));
203 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IInputObject
, &m_IInputObject
));
204 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &m_IObjectWithSite
));
205 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IBanneredBar
, &m_IBanneredBar
));
206 hr
= m_IUnknown
->QueryInterface(IID_PPV_ARG(IInitializeObject
, &m_IInitializeObject
));
209 CMenuDeskBar::~CMenuDeskBar()
211 m_IUnknown
->Release();
212 m_IMenuPopup
->Release();
213 m_IOleCommandTarget
->Release();
214 m_IServiceProvider
->Release();
215 m_IDeskBar
->Release();
216 m_IOleWindow
->Release();
217 m_IInputObjectSite
->Release();
218 m_IInputObject
->Release();
219 m_IObjectWithSite
->Release();
220 m_IBanneredBar
->Release();
221 m_IInitializeObject
->Release();
226 // *** IMenuPopup methods ***
227 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::Popup(POINTL
*ppt
, RECTL
*prcExclude
, MP_POPUPFLAGS dwFlags
)
229 WrapLogEnter("CMenuDeskBar<%p>::Popup(POINTL *ppt=%p, RECTL *prcExclude=%p, MP_POPUPFLAGS dwFlags=%08x)\n", this, ppt
, prcExclude
, dwFlags
);
230 HRESULT hr
= m_IMenuPopup
->Popup(ppt
, prcExclude
, dwFlags
);
231 WrapLogExit("CMenuDeskBar::Popup() = %08x\n", hr
);
235 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::OnSelect(DWORD dwSelectType
)
237 WrapLogEnter("CMenuDeskBar<%p>::OnSelect(DWORD dwSelectType=%08x)\n", this, dwSelectType
);
238 HRESULT hr
= m_IMenuPopup
->OnSelect(dwSelectType
);
239 WrapLogExit("CMenuDeskBar::OnSelect() = %08x\n", hr
);
243 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetSubMenu(IMenuPopup
*pmp
, BOOL fSet
)
245 WrapLogEnter("CMenuDeskBar<%p>::SetSubMenu(IMenuPopup *pmp=%p, BOOL fSet=%d)\n", this, pmp
, fSet
);
246 HRESULT hr
= m_IMenuPopup
->SetSubMenu(pmp
, fSet
);
247 WrapLogExit("CMenuDeskBar::SetSubMenu() = %08x\n", hr
);
251 // *** IOleWindow methods ***
252 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetWindow(HWND
*phwnd
)
254 WrapLogEnter("CMenuDeskBar<%p>::GetWindow(HWND *phwnd=%p)\n", this, phwnd
);
255 HRESULT hr
= m_IOleWindow
->GetWindow(phwnd
);
256 if (phwnd
) WrapLogMsg("*phwnd=%p\n", *phwnd
);
257 WrapLogExit("CMenuDeskBar::GetWindow() = %08x\n", hr
);
261 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::ContextSensitiveHelp(BOOL fEnterMode
)
263 WrapLogEnter("CMenuDeskBar<%p>::ContextSensitiveHelp(BOOL fEnterMode=%d)\n", this, fEnterMode
);
264 HRESULT hr
= m_IOleWindow
->ContextSensitiveHelp(fEnterMode
);
265 WrapLogExit("CMenuDeskBar::ContextSensitiveHelp() = %08x\n", hr
);
269 // *** IObjectWithSite methods ***
270 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetSite(IUnknown
*pUnkSite
)
272 WrapLogEnter("CMenuDeskBar<%p>::SetSite(IUnknown *pUnkSite=%p)\n", this, pUnkSite
);
273 HRESULT hr
= m_IObjectWithSite
->SetSite(pUnkSite
);
274 WrapLogExit("CMenuDeskBar::SetSite() = %08x\n", hr
);
278 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetSite(REFIID riid
, PVOID
*ppvSite
)
280 WrapLogEnter("CMenuDeskBar<%p>::GetSite(REFIID riid=%s, PVOID *ppvSite=%p)\n", this, Wrap(riid
), ppvSite
);
281 HRESULT hr
= m_IObjectWithSite
->GetSite(riid
, ppvSite
);
282 if (ppvSite
) WrapLogMsg("*ppvSite=%p\n", *ppvSite
);
283 WrapLogExit("CMenuDeskBar::GetSite() = %08x\n", hr
);
287 // *** IBanneredBar methods ***
288 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetIconSize(DWORD iIcon
)
290 WrapLogEnter("CMenuDeskBar<%p>::SetIconSize(DWORD iIcon=%d)\n", this, iIcon
);
291 HRESULT hr
= m_IBanneredBar
->SetIconSize(iIcon
);
292 WrapLogExit("CMenuDeskBar::SetIconSize() = %08x\n", hr
);
296 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetIconSize(DWORD
* piIcon
)
298 WrapLogEnter("CMenuDeskBar<%p>::GetIconSize(DWORD* piIcon=%p)\n", this, piIcon
);
299 HRESULT hr
= m_IBanneredBar
->GetIconSize(piIcon
);
300 if (piIcon
) WrapLogMsg("*piIcon=%d\n", *piIcon
);
301 WrapLogExit("CMenuDeskBar::GetIconSize() = %08x\n", hr
);
305 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetBitmap(HBITMAP hBitmap
)
307 WrapLogEnter("CMenuDeskBar<%p>::SetBitmap(HBITMAP hBitmap=%p)\n", this, hBitmap
);
308 HRESULT hr
= m_IBanneredBar
->SetBitmap(hBitmap
);
309 WrapLogExit("CMenuDeskBar::SetBitmap() = %08x\n", hr
);
313 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetBitmap(HBITMAP
* phBitmap
)
315 WrapLogEnter("CMenuDeskBar<%p>::GetBitmap(HBITMAP* phBitmap=%p)\n", this, phBitmap
);
316 HRESULT hr
= m_IBanneredBar
->GetBitmap(phBitmap
);
317 if (phBitmap
) WrapLogMsg("*phBitmap=%p\n", *phBitmap
);
318 WrapLogExit("CMenuDeskBar::GetBitmap() = %08x\n", hr
);
323 // *** IInitializeObject methods ***
324 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::Initialize(THIS
)
326 WrapLogEnter("CMenuDeskBar<%p>::Initialize()\n", this);
327 HRESULT hr
= m_IInitializeObject
->Initialize();
328 WrapLogExit("CMenuDeskBar::Initialize() = %08x\n", hr
);
332 // *** IOleCommandTarget methods ***
333 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
335 WrapLogEnter("CMenuDeskBar<%p>::QueryStatus(const GUID *pguidCmdGroup=%p, ULONG cCmds=%u, prgCmds=%p, pCmdText=%p)\n", this, pguidCmdGroup
, cCmds
, prgCmds
, pCmdText
);
336 HRESULT hr
= m_IOleCommandTarget
->QueryStatus(pguidCmdGroup
, cCmds
, prgCmds
, pCmdText
);
337 if (pguidCmdGroup
) WrapLogMsg("*pguidCmdGroup=%s\n", Wrap(*pguidCmdGroup
));
338 WrapLogExit("CMenuDeskBar::QueryStatus() = %08x\n", hr
);
342 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
346 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
);
348 //if (pguidCmdGroup && IsEqualGUID(*pguidCmdGroup, CLSID_MenuBand))
350 // if (nCmdID == 19) // popup
357 if (pguidCmdGroup
) WrapLogMsg("*pguidCmdGroup=%s\n", Wrap(*pguidCmdGroup
));
358 HRESULT hr
= m_IOleCommandTarget
->Exec(pguidCmdGroup
, nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
359 WrapLogExit("CMenuDeskBar::Exec() = %08x\n", hr
);
363 // *** IServiceProvider methods ***
364 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
366 WrapLogEnter("CMenuDeskBar<%p>::QueryService(REFGUID guidService=%s, REFIID riid=%s, void **ppvObject=%p)\n", this, Wrap(guidService
), Wrap(riid
), ppvObject
);
368 //if (IsEqualIID(guidService, SID_SMenuBandChild))
370 // WrapLogMsg("SID is SID_SMenuBandChild. Using QueryInterface of self instead of wrapped object.\n");
371 // HRESULT hr = this->QueryInterface(riid, ppvObject);
372 // if (ppvObject) WrapLogMsg("*ppvObject=%p\n", *ppvObject);
373 // WrapLogExit("CMenuDeskBar::QueryService() = %08x\n", hr);
378 WrapLogMsg("SID not identified.\n");
380 HRESULT hr
= m_IServiceProvider
->QueryService(guidService
, riid
, ppvObject
);
381 if (ppvObject
) WrapLogMsg("*ppvObject=%p\n", *ppvObject
);
382 WrapLogExit("CMenuDeskBar::QueryService() = %08x\n", hr
);
386 // *** IInputObjectSite methods ***
387 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::OnFocusChangeIS(LPUNKNOWN lpUnknown
, BOOL bFocus
)
389 WrapLogEnter("CMenuDeskBar<%p>::OnFocusChangeIS(LPUNKNOWN lpUnknown=%p, BOOL bFocus=%d)\n", this, lpUnknown
, bFocus
);
390 HRESULT hr
= m_IInputObjectSite
->OnFocusChangeIS(lpUnknown
, bFocus
);
391 WrapLogExit("CMenuDeskBar::OnFocusChangeIS() = %08x\n", hr
);
395 // *** IInputObject methods ***
396 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::UIActivateIO(BOOL bActivating
, LPMSG lpMsg
)
398 WrapLogEnter("CMenuDeskBar<%p>::UIActivateIO(BOOL bActivating=%d, LPMSG lpMsg=%p)\n", this, bActivating
, lpMsg
);
399 HRESULT hr
= m_IInputObject
->UIActivateIO(bActivating
, lpMsg
);
400 WrapLogExit("CMenuDeskBar::UIActivateIO() = %08x\n", hr
);
404 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::HasFocusIO(THIS
)
406 WrapLogEnter("CMenuDeskBar<%p>::HasFocusIO()\n", this);
407 HRESULT hr
= m_IInputObject
->HasFocusIO();
408 WrapLogExit("CMenuDeskBar::HasFocusIO() = %08x\n", hr
);
412 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::TranslateAcceleratorIO(LPMSG lpMsg
)
414 WrapLogEnter("CMenuDeskBar<%p>::TranslateAcceleratorIO(LPMSG lpMsg=%p)\n", this, lpMsg
);
415 if (lpMsg
) WrapLogMsg("*lpMsg=%s\n", Wrap(*lpMsg
));
416 HRESULT hr
= m_IInputObject
->TranslateAcceleratorIO(lpMsg
);
417 WrapLogExit("CMenuDeskBar::TranslateAcceleratorIO() = %08x\n", hr
);
421 // *** IDeskBar methods ***
422 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetClient(IUnknown
*punkClient
)
424 WrapLogEnter("CMenuDeskBar<%p>::SetClient(IUnknown *punkClient=%p)\n", this, punkClient
);
425 HRESULT hr
= m_IDeskBar
->SetClient(punkClient
);
426 WrapLogExit("CMenuDeskBar::SetClient() = %08x\n", hr
);
430 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetClient(IUnknown
**ppunkClient
)
432 WrapLogEnter("CMenuDeskBar<%p>::GetClient(IUnknown **ppunkClient=%p)\n", this, ppunkClient
);
433 HRESULT hr
= m_IDeskBar
->GetClient(ppunkClient
);
434 if (ppunkClient
) WrapLogMsg("*ppunkClient=%p\n", *ppunkClient
);
435 WrapLogExit("CMenuDeskBar::GetClient() = %08x\n", hr
);
439 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::OnPosRectChangeDB(LPRECT prc
)
441 WrapLogEnter("CMenuDeskBar<%p>::OnPosRectChangeDB(RECT *prc=%p)\n", this, prc
);
442 HRESULT hr
= m_IDeskBar
->OnPosRectChangeDB(prc
);
443 if (prc
) WrapLogMsg("*prc=%s\n", Wrap(*prc
));
444 WrapLogExit("CMenuDeskBar::OnPosRectChangeDB() = %08x\n", hr
);
449 CMenuDeskBar::CMenuDeskBar() :
450 m_ClientWindow(NULL
),
458 CMenuDeskBar::~CMenuDeskBar()
462 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetWindow(HWND
*lphwnd
)
470 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::ContextSensitiveHelp(BOOL fEnterMode
)
475 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::OnFocusChangeIS(IUnknown
*punkObj
, BOOL 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
)
511 CComPtr
<IServiceProvider
> serviceProvider
;
516 hResult
= m_Site
->QueryInterface(IID_IServiceProvider
, reinterpret_cast<void **>(&serviceProvider
));
519 // called for SID_STopLevelBrowser, IID_IBrowserService to find top level browser
520 // called for SID_IWebBrowserApp, IID_IConnectionPointContainer
521 // connection point called for DIID_DWebBrowserEvents2 to establish connection
522 return serviceProvider
->QueryService(guidService
, riid
, ppvObject
);
525 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
527 // forward to contained bar
531 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::HasFocusIO()
533 // forward to contained bar
537 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::TranslateAcceleratorIO(LPMSG lpMsg
)
539 // forward to contained bar
543 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetClient(IUnknown
*punkClient
)
545 CComPtr
<IDeskBarClient
> pDeskBandClient
;
550 HWND ownerWindow
= NULL
;
553 IOleWindow
* oleWindow
;
555 hResult
= m_Site
->QueryInterface(IID_IOleWindow
, reinterpret_cast<void **>(&oleWindow
));
556 if (SUCCEEDED(hResult
))
557 hResult
= oleWindow
->GetWindow(&ownerWindow
);
559 if (!::IsWindow(ownerWindow
))
566 if (punkClient
== NULL
)
570 hResult
= punkClient
->QueryInterface(IID_IUnknown
, reinterpret_cast<void **>(&m_Client
));
574 hResult
= m_Client
->QueryInterface(IID_IDeskBarClient
, (VOID
**) &pDeskBandClient
);
578 hResult
= pDeskBandClient
->SetDeskBarSite(static_cast<IDeskBar
*>(this));
587 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetClient(IUnknown
**ppunkClient
)
589 if (ppunkClient
== NULL
)
591 *ppunkClient
= m_Client
;
592 if (m_Client
.p
!= NULL
)
593 m_Client
.p
->AddRef();
597 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::OnPosRectChangeDB(LPRECT prc
)
604 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetSite(IUnknown
*pUnkSite
)
607 CComPtr
<IServiceProvider
> serviceProvider
;
608 CComPtr
<IProfferService
> profferService
;
610 CComPtr
<IOleWindow
> oleWindow
;
615 if (pUnkSite
== NULL
)
622 // get window handle of parent
623 hResult
= pUnkSite
->QueryInterface(IID_ITrayPriv
, reinterpret_cast<void **>(&m_Site
));
627 hResult
= pUnkSite
->QueryInterface(IID_IOleWindow
, reinterpret_cast<void **>(&oleWindow
));
628 if (SUCCEEDED(hResult
))
629 hResult
= oleWindow
->GetWindow(&ownerWindow
);
631 if (!::IsWindow(ownerWindow
))
644 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetSite(REFIID riid
, void **ppvSite
)
649 if (m_Site
.p
!= NULL
)
654 LRESULT
CMenuDeskBar::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
660 CComPtr
<IOleWindow
> pOw
;
661 hr
= m_Client
->QueryInterface(IID_PPV_ARG(IOleWindow
, &pOw
));
664 ERR("IUnknown_QueryInterface pBs failed: %x\n", hr
);
669 pOw
->GetWindow(&clientWnd
);
675 if (m_Banner
!= NULL
)
678 ::GetBitmapDimensionEx(m_Banner
, &sz
);
682 ::SetWindowPos(clientWnd
, NULL
, rc
.left
, rc
.top
, rc
.right
- rc
.left
, rc
.bottom
- rc
.top
, 0);
688 LRESULT
CMenuDeskBar::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
690 CComPtr
<IWinEventHandler
> winEventHandler
;
695 if (m_Client
.p
!= NULL
)
697 hResult
= m_Client
->QueryInterface(IID_IWinEventHandler
, reinterpret_cast<void **>(&winEventHandler
));
698 if (SUCCEEDED(hResult
) && winEventHandler
.p
!= NULL
)
699 hResult
= winEventHandler
->OnWinEvent(NULL
, uMsg
, wParam
, lParam
, &result
);
704 LRESULT
CMenuDeskBar::OnLButtonDown(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
708 m_LastLocation
.x
= LOWORD(lParam
);
709 m_LastLocation
.y
= HIWORD(lParam
);
713 LRESULT
CMenuDeskBar::OnLButtonUp(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
720 LRESULT
CMenuDeskBar::OnMouseMove(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
727 newLocation
.x
= (short) LOWORD(lParam
);
728 newLocation
.y
= (short) HIWORD(lParam
);
729 m_LastLocation
= newLocation
;
734 LRESULT
CMenuDeskBar::OnCancelMode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
740 LRESULT
CMenuDeskBar::OnCaptureChanged(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
746 LRESULT
CMenuDeskBar::OnWindowPosChanged(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
751 LRESULT
CMenuDeskBar::OnActivate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
753 if (LOWORD(wParam
) == WA_INACTIVE
)
756 //ShowWindow(SW_HIDE);
761 LRESULT
CMenuDeskBar::OnPaint(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
765 if (m_Banner
&& !m_IconSize
)
769 HDC hdc
= BeginPaint(&ps
);
771 HDC hdcMem
= ::CreateCompatibleDC(hdc
);
772 HGDIOBJ hbmOld
= ::SelectObject(hdcMem
, m_Banner
);
774 ::GetObject(m_Banner
, sizeof(bm
), &bm
);
776 TRACE("Painting banner: %d by %d\n", bm
.bmWidth
, bm
.bmHeight
);
778 if (!::BitBlt(hdc
, 0, 0, bm
.bmWidth
, bm
.bmHeight
, hdcMem
, 0, 0, SRCCOPY
))
779 WARN("BitBlt failed\n");
781 ::SelectObject(hdcMem
, hbmOld
);
790 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::Popup(POINTL
*ppt
, RECTL
*prcExclude
, MP_POPUPFLAGS dwFlags
)
792 //ENTER >> CMenuDeskBar<03901CC0>::Popup(POINTL *ppt=00B3F428, RECTL *prcExclude=00B3F418, MP_POPUPFLAGS dwFlags=80000000)
793 // ENTER >> CMenuBand<00D2CCF8>::QueryService
795 // ENTER >> CMenuBand<00D2CCF8>::ShowDW(BOOL fShow=1)
796 // ENTER >> CMenuDeskBar<03901CC0>::GetSite(REFIID riid={4622AD10-FF23-11D0-8D34-00A0C90F2719}, PVOID *ppvSite=03901D4C)
797 // -- *ppvSite=00BDEA90
798 // EXIT <<< CMenuDeskBar::GetSite() = 00000000
799 // ENTER >> CMenuBand<00D2CCF8>::SetMenu(HMENU hmenu=593F0A07, HWND hwnd=00000000, DWORD dwFlags=20000000)
800 // EXIT <<< CMenuBand::SetMenu() = 00000000
801 // EXIT <<< CMenuBand::ShowDW() = 00000000
802 // ENTER >> CMenuBand<00D2CCF8>::GetBandInfo(DWORD dwBandID=0, DWORD dwViewMode=0, DESKBANDINFO *pdbi=00B3F0F0)
803 // EXIT <<< CMenuBand::GetBandInfo() = 00000000
804 // ENTER >> CMenuBand<00D2CCF8>::QueryService(REFGUID guidService={ED9CC020-08B9-11D1-9823-00C04FD91972}, REFIID riid={B722BCCB-4E68-101B-A2BC-00AA00404770}, void **ppvObject=00B3F304)
805 // -- SID is SID_SMenuBandChild. Using QueryInterface of self instead of wrapped object.
806 // -- *ppvObject=00D2CD08
807 // EXIT <<< CMenuBand::QueryService() = 00000000
808 // ENTER >> CMenuBand<00D2CCF8>::Exec(const GUID *pguidCmdGroup=76BAE1FC, DWORD nCmdID=19, DWORD nCmdexecopt=0, VARIANT *pvaIn=00000000, VARIANT *pvaOut=00000000)
809 // -- *pguidCmdGroup={5B4DAE26-B807-11D0-9815-00C04FD91972}
810 // EXIT <<< CMenuBand::Exec() = 00000001
811 // ENTER >> CMenuBand<00D2CCF8>::OnPosRectChangeDB(RECT *prc=00B3E630)
812 // -- *prc={L: 0, T: 0, R: 218, B: 305}
813 // EXIT <<< CMenuBand::OnPosRectChangeDB() = 00000000
814 // ENTER >> CMenuBand<00D2CCF8>::UIActivateIO(BOOL fActivate=1, LPMSG lpMsg=00000000)
815 // EXIT <<< CMenuBand::UIActivateIO() = 00000001
816 //EXIT <<< CMenuDeskBar::Popup() = 00000000
818 IServiceProvider
* sp
;
819 IOleCommandTarget
* oct
;
822 hr
= m_Client
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &sp
));
826 hr
= m_Client
->QueryInterface(IID_PPV_ARG(IInputObject
, &io
));
830 hr
= sp
->QueryService(SID_SMenuBandChild
, IID_PPV_ARG(IOleCommandTarget
, &oct
));
839 const int CMD_EXEC_OPT
= 0;
841 hr
= oct
->Exec(&CLSID_MenuBand
, CMD
, CMD_EXEC_OPT
, NULL
, NULL
);
847 // FIXME: everything!
848 const int hackWidth
= 200;
849 const int hackHeight
= 400;
850 RECT r
= { ppt
->x
, ppt
->y
- hackHeight
, ppt
->x
+ hackWidth
, ppt
->y
};
851 if (this->m_hWnd
== NULL
)
853 this->Create(NULL
, &r
);
855 this->SetWindowPos(NULL
, r
.left
, r
.top
, r
.right
- r
.left
, r
.bottom
- r
.top
, SWP_SHOWWINDOW
);
859 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetIconSize(THIS_ DWORD iIcon
)
862 IServiceProvider
* sp
;
863 IOleCommandTarget
* oct
;
867 hr
= m_Client
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &sp
));
871 hr
= sp
->QueryService(SID_SMenuBandChild
, IID_PPV_ARG(IOleCommandTarget
, &oct
));
880 const int CMD_EXEC_OPT
= 2;
882 hr
= oct
->Exec(&CLSID_MenuBand
, CMD
, CMD_EXEC_OPT
, NULL
, NULL
);
889 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetIconSize(THIS_ DWORD
* piIcon
)
892 *piIcon
= m_IconSize
;
896 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetBitmap(THIS_ HBITMAP hBitmap
)
902 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::GetBitmap(THIS_ HBITMAP
* phBitmap
)
905 *phBitmap
= m_Banner
;
909 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::OnSelect(
915 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::SetSubMenu(
922 HRESULT STDMETHODCALLTYPE
CMenuDeskBar::Initialize(THIS
)