4 * Copyright 2009 Andrew Hill <ash77 at domain reactos.org>
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 Implements a class that knows how to hold and manage the menu band, brand band,
23 toolbar, and address band for an explorer window
30 interface IAugmentedShellFolder
: public IShellFolder
32 virtual HRESULT STDMETHODCALLTYPE
AddNameSpace(LPGUID
, IShellFolder
*, LPCITEMIDLIST
, ULONG
) = 0;
33 virtual HRESULT STDMETHODCALLTYPE
GetNameSpaceID(LPCITEMIDLIST
, LPGUID
) = 0;
34 virtual HRESULT STDMETHODCALLTYPE
QueryNameSpace(ULONG
, LPGUID
, IShellFolder
**) = 0;
35 virtual HRESULT STDMETHODCALLTYPE
EnumNameSpace(ULONG
, PULONG
) = 0;
40 // navigation controls and menubar just send a message to parent window
43 ****Implement BandProxy methods
44 ****Add QueryStatus handler for built-in bands
45 ****Enable/Disable up, search, and folders commands appropriately
46 **Why are explorer toolbar separators a nonstandard width?
47 **Remove "(Empty)" item from Favorites menu. Probably something missing in CMenuCallback::CallbackSM
48 **Chevron menu on menuband doesn't work
49 **Fix CInternetToolbar::QueryBand to be generic
51 ****Fix context menu to strip divider when menu shown for menu band
52 ****Fix context menu to have items checked appropriately
53 ****Implement -1 command id update
54 ****When bands are rearranged, resize the internet toolbar and fix height of brand band
55 ****Right clicking on the browse back and forward toolbar buttons displays the same as pulldown menus
56 Implement show/hide of bands
57 Why is the background color of my toolbars different from explorer?
58 Internet Toolbar command handler should get the target for the command and call Exec on the target.
59 For commands built in to the Internet Toolbar, its Exec handles the command
60 When window width is changed, brand band flashes badly
61 Add all bands with correct ids (system bands now add with correct ids)
63 Implement remaining IExplorerToolbar methods
64 Fix toolbar buttons to enable/disable correctly
65 After toolbar is customized, it may be necessary to patch the widths of separators
67 Check sizes and spacing of toolbars against Explorer
68 Implement resizing of the dock bar
69 Add missing icons for toolbar items
70 Draw History item in forward/back dropdown menus with icon
71 Fix toolbar customize dialog to not include separators as possible selections
72 Implement save/restore of toolbar state
73 Refactor drop down menu code to use a common function since code is so similar
76 extern HRESULT WINAPI
SHBindToFolder(LPCITEMIDLIST path
, IShellFolder
**newFolder
);
78 HRESULT
IUnknown_RelayWinEvent(IUnknown
* punk
, HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
80 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
81 HRESULT hResult
= punk
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
82 if (FAILED_UNEXPECTEDLY(hResult
))
84 hResult
= menuWinEventHandler
->IsWindowOwner(hWnd
);
85 if (FAILED_UNEXPECTEDLY(hResult
))
88 return menuWinEventHandler
->OnWinEvent(hWnd
, uMsg
, wParam
, lParam
, theResult
);
92 HRESULT
IUnknown_ShowDW(IUnknown
* punk
, BOOL fShow
)
94 CComPtr
<IDockingWindow
> dockingWindow
;
95 HRESULT hResult
= punk
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
96 if (FAILED_UNEXPECTEDLY(hResult
))
98 hResult
= dockingWindow
->ShowDW(fShow
);
99 if (FAILED_UNEXPECTEDLY(hResult
))
104 HRESULT
IUnknown_CloseDW(IUnknown
* punk
, DWORD dwReserved
)
106 CComPtr
<IDockingWindow
> dockingWindow
;
107 HRESULT hResult
= punk
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
108 if (FAILED_UNEXPECTEDLY(hResult
))
110 hResult
= dockingWindow
->CloseDW(dwReserved
);
111 if (FAILED_UNEXPECTEDLY(hResult
))
116 class CInternetToolbar
;
119 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
120 public IDockingWindowSite
,
121 public IInputObjectSite
,
122 public IOleCommandTarget
,
123 public IServiceProvider
129 ITF_NEWBANDALWAYS
= 4,
130 ITF_GRIPPERALWAYS
= 8,
134 CComPtr
<IUnknown
> fContainedBand
; // the band inside us
135 CInternetToolbar
*fToolbar
; // our browser
143 // fields of DESKBANDINFO must be preserved between calls to GetBandInfo
144 DESKBANDINFO fDeskBandInfo
;
148 HRESULT
Initialize(IUnknown
*containedBand
, CInternetToolbar
*browser
, HWND hwnd
, int bandID
, int flags
);
149 HRESULT
GetRBBandInfo(REBARBANDINFOW
&bandInfo
);
152 // *** IOleWindow methods ***
153 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
154 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
156 // *** IDockingWindow methods ***
157 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
158 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
159 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
161 // *** IInputObjectSite specific methods ***
162 virtual HRESULT STDMETHODCALLTYPE
OnFocusChangeIS(IUnknown
*punkObj
, BOOL fSetFocus
);
164 // *** IOleCommandTarget specific methods ***
165 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
166 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
167 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
168 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
170 // *** IServiceProvider methods ***
171 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
173 BEGIN_COM_MAP(CDockSite
)
174 COM_INTERFACE_ENTRY_IID(IID_IOleWindow
, IOleWindow
)
175 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
176 COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite
, IInputObjectSite
)
177 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
178 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
182 CDockSite::CDockSite()
189 fInitialized
= false;
190 memset(&fDeskBandInfo
, 0, sizeof(fDeskBandInfo
));
193 CDockSite::~CDockSite()
197 HRESULT
CDockSite::Initialize(IUnknown
*containedBand
, CInternetToolbar
*browser
, HWND hwnd
, int bandID
, int flags
)
199 TCHAR textBuffer
[40];
200 REBARBANDINFOW bandInfo
;
203 fContainedBand
= containedBand
;
208 hResult
= IUnknown_SetSite(containedBand
, static_cast<IOleWindow
*>(this));
209 if (FAILED_UNEXPECTEDLY(hResult
))
211 hResult
= IUnknown_GetWindow(containedBand
, &fChildWindow
);
212 if (FAILED_UNEXPECTEDLY(hResult
))
215 memset(&bandInfo
, 0, sizeof(bandInfo
));
216 bandInfo
.cbSize
= sizeof(bandInfo
);
217 bandInfo
.lpText
= textBuffer
;
218 bandInfo
.cch
= sizeof(textBuffer
) / sizeof(TCHAR
);
219 hResult
= GetRBBandInfo(bandInfo
);
221 SendMessage(fRebarWindow
, RB_GETBANDCOUNT
, 0, 0);
222 SendMessage(fRebarWindow
, RB_INSERTBANDW
, -1, (LPARAM
)&bandInfo
);
227 HRESULT
CDockSite::GetRBBandInfo(REBARBANDINFOW
&bandInfo
)
229 CComPtr
<IDeskBand
> deskBand
;
232 hResult
= fContainedBand
->QueryInterface(IID_PPV_ARG(IDeskBand
, &deskBand
));
233 if (FAILED_UNEXPECTEDLY(hResult
))
236 fDeskBandInfo
.dwMask
= DBIM_BKCOLOR
| DBIM_MODEFLAGS
| DBIM_TITLE
| DBIM_ACTUAL
|
237 DBIM_INTEGRAL
| DBIM_MAXSIZE
| DBIM_MINSIZE
;
238 hResult
= deskBand
->GetBandInfo(fBandID
, 0, &fDeskBandInfo
);
239 // result of call is ignored
241 bandInfo
.fMask
= RBBIM_LPARAM
| RBBIM_IDEALSIZE
| RBBIM_ID
| RBBIM_CHILDSIZE
| RBBIM_CHILD
|
242 RBBIM_TEXT
| RBBIM_STYLE
;
244 bandInfo
.fStyle
= RBBS_FIXEDBMP
;
245 if (fDeskBandInfo
.dwModeFlags
& DBIMF_VARIABLEHEIGHT
)
246 bandInfo
.fStyle
|= RBBS_VARIABLEHEIGHT
;
247 if (fDeskBandInfo
.dwModeFlags
& DBIMF_USECHEVRON
)
248 bandInfo
.fStyle
|= RBBS_USECHEVRON
;
249 if (fDeskBandInfo
.dwModeFlags
& DBIMF_BREAK
)
250 bandInfo
.fStyle
|= RBBS_BREAK
;
251 if (fDeskBandInfo
.dwModeFlags
& DBIMF_TOPALIGN
)
252 bandInfo
.fStyle
|= RBBS_TOPALIGN
;
253 if (fFlags
& ITF_NOGRIPPER
|| fToolbar
->fLocked
)
254 bandInfo
.fStyle
|= RBBS_NOGRIPPER
;
255 if (fFlags
& ITF_NOTITLE
)
256 bandInfo
.fStyle
|= RBBS_HIDETITLE
;
257 if (fFlags
& ITF_GRIPPERALWAYS
&& !fToolbar
->fLocked
)
258 bandInfo
.fStyle
|= RBBS_GRIPPERALWAYS
;
259 if (fFlags
& ITF_FIXEDSIZE
)
260 bandInfo
.fStyle
|= RBBS_FIXEDSIZE
;
262 if (fDeskBandInfo
.dwModeFlags
& DBIMF_BKCOLOR
)
264 bandInfo
.fMask
|= RBBIM_COLORS
;
265 bandInfo
.clrFore
= CLR_DEFAULT
;
266 bandInfo
.clrBack
= fDeskBandInfo
.crBkgnd
;
268 wcsncpy(bandInfo
.lpText
, fDeskBandInfo
.wszTitle
, bandInfo
.cch
);
269 bandInfo
.hwndChild
= fChildWindow
;
270 bandInfo
.cxMinChild
= fDeskBandInfo
.ptMinSize
.x
;
271 bandInfo
.cyMinChild
= fDeskBandInfo
.ptMinSize
.y
;
272 bandInfo
.wID
= fBandID
;
273 bandInfo
.cyChild
= fDeskBandInfo
.ptActual
.y
;
274 bandInfo
.cyMaxChild
= fDeskBandInfo
.ptMaxSize
.y
;
275 bandInfo
.cyIntegral
= fDeskBandInfo
.ptIntegral
.y
;
276 bandInfo
.cxIdeal
= fDeskBandInfo
.ptActual
.x
;
277 bandInfo
.lParam
= reinterpret_cast<LPARAM
>(this);
281 HRESULT STDMETHODCALLTYPE
CDockSite::GetWindow(HWND
*lphwnd
)
285 *lphwnd
= fRebarWindow
;
289 HRESULT STDMETHODCALLTYPE
CDockSite::ContextSensitiveHelp(BOOL fEnterMode
)
294 HRESULT STDMETHODCALLTYPE
CDockSite::GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
)
299 HRESULT STDMETHODCALLTYPE
CDockSite::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
304 HRESULT STDMETHODCALLTYPE
CDockSite::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
309 HRESULT STDMETHODCALLTYPE
CDockSite::OnFocusChangeIS (IUnknown
*punkObj
, BOOL fSetFocus
)
314 HRESULT STDMETHODCALLTYPE
CDockSite::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
315 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
320 HRESULT STDMETHODCALLTYPE
CDockSite::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
,
321 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
323 TCHAR textBuffer
[40];
324 REBARBANDINFOW bandInfo
;
328 if (IsEqualIID(*pguidCmdGroup
, CGID_DeskBand
))
332 case DBID_BANDINFOCHANGED
:
333 if (fInitialized
== false)
335 if (V_VT(pvaIn
) != VT_I4
)
337 if (V_I4(pvaIn
) != fBandID
)
339 // deskband information changed
340 // call GetBandInfo and refresh information in rebar
341 memset(&bandInfo
, 0, sizeof(bandInfo
));
342 bandInfo
.cbSize
= sizeof(bandInfo
);
343 bandInfo
.lpText
= textBuffer
;
344 bandInfo
.cch
= sizeof(textBuffer
) / sizeof(TCHAR
);
345 hResult
= GetRBBandInfo(bandInfo
);
346 if (FAILED_UNEXPECTEDLY(hResult
))
348 index
= (int)SendMessage(fRebarWindow
, RB_IDTOINDEX
, fBandID
, 0);
349 SendMessage(fRebarWindow
, RB_SETBANDINFOW
, index
, (LPARAM
)&bandInfo
);
356 HRESULT STDMETHODCALLTYPE
CDockSite::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
358 if (IsEqualIID(guidService
, SID_SMenuBandParent
))
359 return this->QueryInterface(riid
, ppvObject
);
361 return fToolbar
->QueryService(guidService
, riid
, ppvObject
);
364 CMenuCallback::CMenuCallback()
368 CMenuCallback::~CMenuCallback()
372 static HRESULT
BindToDesktop(LPCITEMIDLIST pidl
, IShellFolder
** ppsfResult
)
375 CComPtr
<IShellFolder
> psfDesktop
;
379 hr
= SHGetDesktopFolder(&psfDesktop
);
383 hr
= psfDesktop
->BindToObject(pidl
, NULL
, IID_PPV_ARG(IShellFolder
, ppsfResult
));
388 static HRESULT
GetFavoritesFolder(IShellFolder
** ppsfFavorites
, LPITEMIDLIST
* ppidl
)
391 LPITEMIDLIST pidlUserFavorites
;
392 LPITEMIDLIST pidlCommonFavorites
;
393 CComPtr
<IShellFolder
> psfUserFavorites
;
394 CComPtr
<IShellFolder
> psfCommonFavorites
;
395 CComPtr
<IAugmentedShellFolder
> pasf
;
398 *ppsfFavorites
= NULL
;
403 hr
= SHGetSpecialFolderLocation(NULL
, CSIDL_FAVORITES
, &pidlUserFavorites
);
406 WARN("Failed to get the USER favorites folder. Trying to run with just the COMMON one.\n");
408 hr
= SHGetSpecialFolderLocation(NULL
, CSIDL_COMMON_FAVORITES
, &pidlCommonFavorites
);
409 if (FAILED_UNEXPECTEDLY(hr
))
412 TRACE("COMMON favorites obtained.\n");
413 *ppidl
= pidlCommonFavorites
;
414 hr
= BindToDesktop(pidlCommonFavorites
, ppsfFavorites
);
418 hr
= SHGetSpecialFolderLocation(NULL
, CSIDL_COMMON_FAVORITES
, &pidlCommonFavorites
);
419 if (FAILED_UNEXPECTEDLY(hr
))
421 WARN("Failed to get the COMMON favorites folder. Will use only the USER contents.\n");
422 *ppidl
= pidlCommonFavorites
;
423 hr
= BindToDesktop(pidlUserFavorites
, ppsfFavorites
);
427 TRACE("Both COMMON and USER favorites folders obtained, merging them...\n");
429 hr
= BindToDesktop(pidlUserFavorites
, &psfUserFavorites
);
430 if (FAILED_UNEXPECTEDLY(hr
))
433 hr
= BindToDesktop(pidlCommonFavorites
, &psfCommonFavorites
);
434 if (FAILED_UNEXPECTEDLY(hr
))
437 hr
= CMergedFolder_CreateInstance(IID_PPV_ARG(IAugmentedShellFolder
, &pasf
));
438 if (FAILED_UNEXPECTEDLY(hr
))
440 *ppsfFavorites
= psfUserFavorites
.Detach();
441 *ppidl
= pidlUserFavorites
;
442 ILFree(pidlCommonFavorites
);
446 hr
= pasf
->AddNameSpace(NULL
, psfUserFavorites
, pidlUserFavorites
, 0xFF00);
447 if (FAILED_UNEXPECTEDLY(hr
))
450 hr
= pasf
->AddNameSpace(NULL
, psfCommonFavorites
, pidlCommonFavorites
, 0);
451 if (FAILED_UNEXPECTEDLY(hr
))
454 hr
= pasf
->QueryInterface(IID_PPV_ARG(IShellFolder
, ppsfFavorites
));
457 // TODO: obtain the folder's PIDL
459 ILFree(pidlCommonFavorites
);
460 ILFree(pidlUserFavorites
);
465 HRESULT STDMETHODCALLTYPE
CMenuCallback::GetObject(LPSMDATA psmd
, REFIID riid
, void **ppvObject
)
467 CComPtr
<IShellMenu
> parentMenu
;
468 CComPtr
<IShellMenu
> newMenu
;
469 CComPtr
<IShellFolder
> favoritesFolder
;
470 LPITEMIDLIST favoritesPIDL
;
473 HMENU favoritesHMenu
;
477 static const TCHAR szFavoritesKey
[] =
478 _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MenuOrder\\Favorites");
480 if (!IsEqualIID(riid
, IID_IShellMenu
))
482 if (psmd
->uId
!= FCIDM_MENU_FAVORITES
)
485 // create favorites menu
486 hResult
= psmd
->punk
->QueryInterface(IID_PPV_ARG(IShellMenu
, &parentMenu
));
487 if (FAILED_UNEXPECTEDLY(hResult
))
489 hResult
= parentMenu
->GetMenu(&parentHMenu
, &ownerWindow
, NULL
);
490 if (FAILED_UNEXPECTEDLY(hResult
))
492 favoritesHMenu
= GetSubMenu(parentHMenu
, 3);
493 if (favoritesHMenu
== NULL
)
496 if (fFavoritesMenu
.p
== NULL
)
498 hResult
= CMenuBand_CreateInstance(IID_PPV_ARG(IShellMenu
, &newMenu
));
499 if (FAILED_UNEXPECTEDLY(hResult
))
501 hResult
= newMenu
->Initialize(this, FCIDM_MENU_FAVORITES
, -1, SMINIT_VERTICAL
| SMINIT_CACHED
);
502 if (FAILED_UNEXPECTEDLY(hResult
))
505 RegCreateKeyEx(HKEY_CURRENT_USER
, szFavoritesKey
,
506 0, NULL
, 0, KEY_READ
| KEY_WRITE
, NULL
, &orderRegKey
, &disposition
);
508 hResult
= GetFavoritesFolder(&favoritesFolder
, &favoritesPIDL
);
509 if (FAILED_UNEXPECTEDLY(hResult
))
512 hResult
= newMenu
->SetShellFolder(favoritesFolder
, favoritesPIDL
, orderRegKey
, SMSET_BOTTOM
| SMINIT_CACHED
| SMINV_ID
);
514 ILFree(favoritesPIDL
);
519 fFavoritesMenu
= newMenu
;
522 hResult
= fFavoritesMenu
->SetMenu(favoritesHMenu
, ownerWindow
, SMSET_TOP
| SMSET_DONTOWN
);
523 if (FAILED_UNEXPECTEDLY(hResult
))
526 return fFavoritesMenu
->QueryInterface(riid
, ppvObject
);
529 HRESULT STDMETHODCALLTYPE
CMenuCallback::CallbackSM(LPSMDATA psmd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
541 SMINFO
*infoPtr
= reinterpret_cast<SMINFO
*>(lParam
);
542 if ((infoPtr
->dwMask
& SMIM_FLAGS
) != 0)
544 if (psmd
->uId
== FCIDM_MENU_FAVORITES
)
546 infoPtr
->dwFlags
|= SMIF_DROPCASCADE
;
550 infoPtr
->dwFlags
|= SMIF_TRACKPOPUP
;
553 if ((infoPtr
->dwMask
& SMIM_ICON
) != 0)
560 return GetObject(psmd
, *reinterpret_cast<IID
*>(wParam
), reinterpret_cast<void **>(lParam
));
561 case SMC_GETSFOBJECT
:
564 PostMessageW(psmd
->hwnd
, WM_COMMAND
, psmd
->uId
, 0);
567 SHInvokeDefaultCommand(psmd
->hwnd
, psmd
->psf
, psmd
->pidlItem
);
569 case SMC_SFSELECTITEM
:
582 case SMC_DEFAULTICON
:
586 case SMC_CHEVRONEXPAND
:
588 case SMC_DISPLAYCHEVRONTIP
:
590 case SMC_SETSFOBJECT
:
592 case SMC_SHCHANGENOTIFY
:
594 case SMC_CHEVRONGETTIP
:
596 case SMC_SFDDRESTRICTED
:
608 CInternetToolbar::CInternetToolbar()
612 fMenuBandWindow
= NULL
;
613 fNavigationWindow
= NULL
;
614 fMenuCallback
= new CComObject
<CMenuCallback
>();
615 fToolbarWindow
= NULL
;
618 fMenuCallback
->AddRef();
621 CInternetToolbar::~CInternetToolbar()
625 void CInternetToolbar::AddDockItem(IUnknown
*newItem
, int bandID
, int flags
)
627 CComPtr
<CDockSite
> newSite
;
629 newSite
= new CComObject
<CDockSite
>;
630 newSite
->Initialize(newItem
, this, fMainReBar
, bandID
, flags
);
633 HRESULT
CInternetToolbar::ReserveBorderSpace(LONG maxHeight
)
635 CComPtr
<IDockingWindowSite
> dockingWindowSite
;
636 RECT availableBorderSpace
;
638 HRESULT hResult
= fSite
->QueryInterface(IID_PPV_ARG(IDockingWindowSite
, &dockingWindowSite
));
639 if (FAILED_UNEXPECTEDLY(hResult
))
641 hResult
= dockingWindowSite
->GetBorderDW(static_cast<IDockingWindow
*>(this), &availableBorderSpace
);
642 if (FAILED_UNEXPECTEDLY(hResult
))
645 if (maxHeight
&& availableBorderSpace
.bottom
- availableBorderSpace
.top
> maxHeight
)
647 availableBorderSpace
.bottom
= availableBorderSpace
.top
+ maxHeight
;
650 return ResizeBorderDW(&availableBorderSpace
, fSite
, FALSE
);
653 HRESULT
CInternetToolbar::CreateMenuBar(IShellMenu
**pMenuBar
)
655 CComPtr
<IShellMenu
> menubar
;
656 CComPtr
<IShellMenuCallback
> callback
;
666 hResult
= CMenuBand_CreateInstance(IID_PPV_ARG(IShellMenu
, &menubar
));
667 if (FAILED_UNEXPECTEDLY(hResult
))
670 hResult
= fMenuCallback
->QueryInterface(IID_PPV_ARG(IShellMenuCallback
, &callback
));
671 if (FAILED_UNEXPECTEDLY(hResult
))
674 hResult
= menubar
->Initialize(callback
, -1, ANCESTORDEFAULT
, SMINIT_HORIZONTAL
| SMINIT_TOPLEVEL
);
675 if (FAILED_UNEXPECTEDLY(hResult
))
680 hResult
= IUnknown_Exec(fSite
, CGID_Explorer
, 0x35, 0, NULL
, &menuOut
);
681 if (FAILED_UNEXPECTEDLY(hResult
))
684 if (V_VT(&menuOut
) != VT_INT_PTR
|| V_INTREF(&menuOut
) == NULL
)
687 hResult
= IUnknown_GetWindow(fSite
, &ownerWindow
);
688 if (FAILED_UNEXPECTEDLY(hResult
))
691 HMENU hMenuBar
= (HMENU
) V_INTREF(&menuOut
);
693 // FIXME: Figure out the proper way to do this.
694 HMENU hMenuFavs
= GetSubMenu(hMenuBar
, 3);
697 DeleteMenu(hMenuFavs
, IDM_FAVORITES_EMPTY
, MF_BYCOMMAND
);
700 hResult
= menubar
->SetMenu(hMenuBar
, ownerWindow
, SMSET_DONTOWN
);
701 if (FAILED_UNEXPECTEDLY(hResult
))
705 hResult
= IUnknown_Exec(menubar
, CGID_MenuBand
, 3, 1, NULL
, NULL
);
706 if (FAILED_UNEXPECTEDLY(hResult
))
709 *pMenuBar
= menubar
.Detach();
714 HRESULT
CInternetToolbar::LockUnlockToolbars(bool locked
)
716 REBARBANDINFOW rebarBandInfo
;
721 if (locked
!= fLocked
)
724 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
725 rebarBandInfo
.fMask
= RBBIM_STYLE
| RBBIM_LPARAM
;
726 bandCount
= (int)SendMessage(fMainReBar
, RB_GETBANDCOUNT
, 0, 0);
727 for (INT x
= 0; x
< bandCount
; x
++)
729 SendMessage(fMainReBar
, RB_GETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
730 dockSite
= reinterpret_cast<CDockSite
*>(rebarBandInfo
.lParam
);
731 if (dockSite
!= NULL
)
733 rebarBandInfo
.fStyle
&= ~(RBBS_NOGRIPPER
| RBBS_GRIPPERALWAYS
);
734 if (dockSite
->fFlags
& CDockSite::ITF_NOGRIPPER
|| fLocked
)
735 rebarBandInfo
.fStyle
|= RBBS_NOGRIPPER
;
736 if (dockSite
->fFlags
& CDockSite::ITF_GRIPPERALWAYS
&& !fLocked
)
737 rebarBandInfo
.fStyle
|= RBBS_GRIPPERALWAYS
;
738 SendMessage(fMainReBar
, RB_SETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
741 hResult
= ReserveBorderSpace(0);
743 // TODO: refresh view menu?
748 HRESULT
CInternetToolbar::SetState(const GUID
*pguidCmdGroup
, long commandID
, OLECMD
* pcmd
)
751 if (pcmd
->cmdf
& OLECMDF_ENABLED
)
752 state
|= TBSTATE_ENABLED
;
753 if (pcmd
->cmdf
& OLECMDF_LATCHED
)
754 state
|= TBSTATE_CHECKED
;
755 return SetState(pguidCmdGroup
, commandID
, state
);
758 HRESULT
CInternetToolbar::CommandStateChanged(bool newValue
, int commandID
)
766 // loop through buttons
767 //for buttons in CLSID_CommonButtons
768 // if up, QueryStatus for up state and update it
770 //for buttons in fCommandCategory, update with QueryStatus of fCommandTarget
772 OLECMD commandList
[4];
773 commandList
[0].cmdID
= 0x1c;
774 commandList
[1].cmdID
= 0x1d;
775 commandList
[2].cmdID
= 0x1e;
776 commandList
[3].cmdID
= 0x23;
777 IUnknown_QueryStatus(fSite
, CGID_Explorer
, 4, commandList
, NULL
);
778 SetState(&CLSID_CommonButtons
, gSearchCommandID
, &commandList
[0]);
779 SetState(&CLSID_CommonButtons
, gFoldersCommandID
, &commandList
[3]);
780 //SetState(&CLSID_CommonButtons, gFavoritesCommandID, &commandList[2]);
781 //SetState(&CLSID_CommonButtons, gHistoryCommandID, &commandList[1]);
786 hResult
= SetState(&CLSID_CommonButtons
, IDM_GOTO_FORWARD
, newValue
? TBSTATE_ENABLED
: 0);
790 hResult
= SetState(&CLSID_CommonButtons
, IDM_GOTO_BACK
, newValue
? TBSTATE_ENABLED
: 0);
794 hResult
= SetState(&CLSID_CommonButtons
, IDM_GOTO_UPONELEVEL
, newValue
? TBSTATE_ENABLED
: 0);
800 HRESULT
CInternetToolbar::CreateAndInitBandProxy()
802 CComPtr
<IServiceProvider
> serviceProvider
;
805 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
806 if (FAILED_UNEXPECTEDLY(hResult
))
808 hResult
= serviceProvider
->QueryService(SID_IBandProxy
, IID_PPV_ARG(IBandProxy
, &fBandProxy
));
809 if (FAILED_UNEXPECTEDLY(hResult
))
811 hResult
= CBandProxy_CreateInstance(IID_PPV_ARG(IBandProxy
, &fBandProxy
));
812 if (FAILED_UNEXPECTEDLY(hResult
))
814 hResult
= fBandProxy
->SetSite(fSite
);
815 if (FAILED_UNEXPECTEDLY(hResult
))
821 HRESULT STDMETHODCALLTYPE
CInternetToolbar::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
826 HRESULT STDMETHODCALLTYPE
CInternetToolbar::HasFocusIO()
828 HRESULT hr
= S_FALSE
;
831 hr
= IUnknown_HasFocusIO(fMenuBar
);
836 hr
= IUnknown_HasFocusIO(fControlsBar
);
841 hr
= IUnknown_HasFocusIO(fNavigationBar
);
848 HRESULT STDMETHODCALLTYPE
CInternetToolbar::TranslateAcceleratorIO(LPMSG lpMsg
)
850 HRESULT hr
= S_FALSE
;
853 hr
= IUnknown_TranslateAcceleratorIO(fMenuBar
, lpMsg
);
858 hr
= IUnknown_TranslateAcceleratorIO(fControlsBar
, lpMsg
);
863 hr
= IUnknown_TranslateAcceleratorIO(fNavigationBar
, lpMsg
);
870 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetWindow(HWND
*lphwnd
)
878 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ContextSensitiveHelp(BOOL fEnterMode
)
883 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ShowDW(BOOL fShow
)
890 hResult
= ReserveBorderSpace();
891 if (FAILED_UNEXPECTEDLY(hResult
))
897 hResult
= IUnknown_ShowDW(fMenuBar
, fShow
);
898 if (FAILED_UNEXPECTEDLY(hResult
))
904 hResult
= IUnknown_ShowDW(fControlsBar
, fShow
);
905 if (FAILED_UNEXPECTEDLY(hResult
))
910 hResult
= IUnknown_ShowDW(fNavigationBar
, fShow
);
911 if (FAILED_UNEXPECTEDLY(hResult
))
916 hResult
= IUnknown_ShowDW(fLogoBar
, fShow
);
917 if (FAILED_UNEXPECTEDLY(hResult
))
923 HRESULT STDMETHODCALLTYPE
CInternetToolbar::CloseDW(DWORD dwReserved
)
929 hResult
= IUnknown_CloseDW(fMenuBar
, dwReserved
);
930 if (FAILED_UNEXPECTEDLY(hResult
))
932 ReleaseCComPtrExpectZero(fMenuBar
);
936 hResult
= IUnknown_CloseDW(fControlsBar
, dwReserved
);
937 if (FAILED_UNEXPECTEDLY(hResult
))
939 ReleaseCComPtrExpectZero(fControlsBar
);
943 hResult
= IUnknown_CloseDW(fNavigationBar
, dwReserved
);
944 if (FAILED_UNEXPECTEDLY(hResult
))
946 ReleaseCComPtrExpectZero(fNavigationBar
);
950 hResult
= IUnknown_CloseDW(fLogoBar
, dwReserved
);
951 if (FAILED_UNEXPECTEDLY(hResult
))
953 ReleaseCComPtrExpectZero(fLogoBar
);
960 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ResizeBorderDW(LPCRECT prcBorder
,
961 IUnknown
*punkToolbarSite
, BOOL fReserved
)
963 RECT neededBorderSpace
;
964 RECT availableBorderSpace
= *prcBorder
;
966 SendMessage(fMainReBar
, RB_SIZETORECT
, RBSTR_CHANGERECT
, reinterpret_cast<LPARAM
>(&availableBorderSpace
));
968 // RBSTR_CHANGERECT does not seem to set the proper size in the rect.
969 // Let's make sure we fetch the actual size properly.
970 ::GetWindowRect(fMainReBar
, &availableBorderSpace
);
971 neededBorderSpace
.left
= 0;
972 neededBorderSpace
.top
= availableBorderSpace
.bottom
- availableBorderSpace
.top
;
974 neededBorderSpace
.top
+= 3;
975 neededBorderSpace
.right
= 0;
976 neededBorderSpace
.bottom
= 0;
978 CComPtr
<IDockingWindowSite
> dockingWindowSite
;
980 HRESULT hResult
= fSite
->QueryInterface(IID_PPV_ARG(IDockingWindowSite
, &dockingWindowSite
));
981 if (FAILED_UNEXPECTEDLY(hResult
))
984 hResult
= dockingWindowSite
->RequestBorderSpaceDW(static_cast<IDockingWindow
*>(this), &neededBorderSpace
);
985 if (FAILED_UNEXPECTEDLY(hResult
))
988 hResult
= dockingWindowSite
->SetBorderSpaceDW(static_cast<IDockingWindow
*>(this), &neededBorderSpace
);
989 if (FAILED_UNEXPECTEDLY(hResult
))
995 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetClassID(CLSID
*pClassID
)
997 if (pClassID
== NULL
)
999 *pClassID
= CLSID_InternetToolbar
;
1003 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsDirty()
1008 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Load(IStream
*pStm
)
1013 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Save(IStream
*pStm
, BOOL fClearDirty
)
1018 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSizeMax(ULARGE_INTEGER
*pcbSize
)
1023 HRESULT STDMETHODCALLTYPE
CInternetToolbar::InitNew()
1025 CComPtr
<IShellMenu
> menuBar
;
1026 CComPtr
<IUnknown
> logoBar
;
1027 CComPtr
<IUnknown
> toolsBar
;
1028 CComPtr
<IUnknown
> navigationBar
;
1031 /* Create and attach the menubar to the rebar */
1032 hResult
= CreateMenuBar(&menuBar
);
1033 if (FAILED_UNEXPECTEDLY(hResult
))
1035 AddDockItem(menuBar
, ITBBID_MENUBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
1037 hResult
= IUnknown_GetWindow(menuBar
, &fMenuBandWindow
);
1038 fMenuBar
.Attach(menuBar
.Detach()); // transfer the ref count
1040 // FIXME: The ros Rebar does not properly support fixed-size items such as the brandband,
1041 // and it will put them in their own row, sized to take up the whole row.
1043 /* Create and attach the brand/logo to the rebar */
1044 hResult
= CBrandBand_CreateInstance(IID_PPV_ARG(IUnknown
, &logoBar
));
1045 if (FAILED_UNEXPECTEDLY(hResult
))
1047 AddDockItem(logoBar
, ITBBID_BRANDBAND
, CDockSite::ITF_NOGRIPPER
| CDockSite::ITF_NOTITLE
| CDockSite::ITF_FIXEDSIZE
);
1048 fLogoBar
.Attach(logoBar
.Detach()); // transfer the ref count
1051 /* Create and attach the standard toolbar to the rebar */
1052 hResult
= CToolsBand_CreateInstance(IID_PPV_ARG(IUnknown
, &toolsBar
));
1053 if (FAILED_UNEXPECTEDLY(hResult
))
1055 AddDockItem(toolsBar
, ITBBID_TOOLSBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
1056 fControlsBar
.Attach(toolsBar
.Detach()); // transfer the ref count
1057 hResult
= IUnknown_GetWindow(fControlsBar
, &fToolbarWindow
);
1058 if (FAILED_UNEXPECTEDLY(hResult
))
1061 /* Create and attach the address/navigation toolbar to the rebar */
1062 hResult
= CAddressBand_CreateInstance(IID_PPV_ARG(IUnknown
, &navigationBar
));
1063 if (FAILED_UNEXPECTEDLY(hResult
))
1065 AddDockItem(navigationBar
, ITBBID_ADDRESSBAND
, CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
1066 fNavigationBar
.Attach(navigationBar
.Detach());
1067 hResult
= IUnknown_GetWindow(fNavigationBar
, &fNavigationWindow
);
1072 HRESULT
CInternetToolbar::IsBandVisible(int BandID
)
1074 int index
= (int)SendMessage(fMainReBar
, RB_IDTOINDEX
, BandID
, 0);
1076 REBARBANDINFOW bandInfo
= {sizeof(REBARBANDINFOW
), RBBIM_STYLE
};
1077 SendMessage(fMainReBar
, RB_GETBANDINFOW
, index
, (LPARAM
)&bandInfo
);
1079 return (bandInfo
.fStyle
& RBBS_HIDDEN
) ? S_FALSE
: S_OK
;
1082 HRESULT
CInternetToolbar::ToggleBandVisibility(int BandID
)
1084 int index
= (int)SendMessage(fMainReBar
, RB_IDTOINDEX
, BandID
, 0);
1086 REBARBANDINFOW bandInfo
= {sizeof(REBARBANDINFOW
), RBBIM_STYLE
};
1087 SendMessage(fMainReBar
, RB_GETBANDINFOW
, index
, (LPARAM
)&bandInfo
);
1089 if (bandInfo
.fStyle
& RBBS_HIDDEN
)
1090 bandInfo
.fStyle
&= ~RBBS_HIDDEN
;
1092 bandInfo
.fStyle
|= RBBS_HIDDEN
;
1094 SendMessage(fMainReBar
, RB_SETBANDINFOW
, index
, (LPARAM
)&bandInfo
);
1096 ReserveBorderSpace(0);
1100 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryStatus(const GUID
*pguidCmdGroup
,
1101 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1103 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
1107 switch (prgCmds
->cmdID
)
1109 case ITID_TEXTLABELS
: // Text Labels state
1110 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1112 case ITID_TOOLBARBANDSHOWN
: // toolbar visibility
1113 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1114 if (IsBandVisible(ITBBID_TOOLSBAND
) == S_OK
)
1115 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
1117 case ITID_ADDRESSBANDSHOWN
: // address bar visibility
1118 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1119 if (IsBandVisible(ITBBID_ADDRESSBAND
) == S_OK
)
1120 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
1122 case ITID_LINKSBANDSHOWN
: // links bar visibility
1125 case ITID_MENUBANDSHOWN
: // Menubar band visibility
1126 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1128 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
1130 case ITID_AUTOHIDEENABLED
: // Auto hide enabled/disabled
1133 case ITID_CUSTOMIZEENABLED
: // customize enabled
1134 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1136 case ITID_TOOLBARLOCKED
: // lock toolbars
1137 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1139 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
1153 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1154 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1156 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
1161 // what do I do here?
1163 case ITID_TEXTLABELS
:
1164 // toggle text labels
1166 case ITID_TOOLBARBANDSHOWN
:
1167 return ToggleBandVisibility(ITBBID_TOOLSBAND
);
1168 case ITID_ADDRESSBANDSHOWN
:
1169 return ToggleBandVisibility(ITBBID_ADDRESSBAND
);
1170 case ITID_LINKSBANDSHOWN
:
1171 // toggle links band visibility
1173 case ITID_CUSTOMIZEENABLED
:
1176 case ITID_TOOLBARLOCKED
:
1177 return LockUnlockToolbars(!fLocked
);
1183 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfoCount(UINT
*pctinfo
)
1188 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
1193 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
,
1194 LCID lcid
, DISPID
*rgDispId
)
1199 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
1200 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
1204 switch(dispIdMember
)
1206 case DISPID_BEFORENAVIGATE
:
1209 case DISPID_DOWNLOADCOMPLETE
:
1212 case DISPID_COMMANDSTATECHANGE
:
1213 if (pDispParams
->cArgs
!= 2)
1214 return E_INVALIDARG
;
1215 if (V_VT(&pDispParams
->rgvarg
[0]) != VT_BOOL
|| V_VT(&pDispParams
->rgvarg
[1]) != VT_I4
)
1216 return E_INVALIDARG
;
1217 return CommandStateChanged(V_BOOL(&pDispParams
->rgvarg
[0]) != VARIANT_FALSE
,
1218 V_I4(&pDispParams
->rgvarg
[1]));
1219 case DISPID_DOWNLOADBEGIN
:
1222 case DISPID_NAVIGATECOMPLETE2
:
1225 case DISPID_DOCUMENTCOMPLETE
:
1232 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetCommandTarget(IUnknown
*theTarget
, GUID
*category
, long param14
)
1236 TRACE("SetCommandTarget %p category %s param %d\n", theTarget
, wine_dbgstr_guid(category
), param14
);
1238 fCommandTarget
.Release();
1239 hResult
= theTarget
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &fCommandTarget
));
1240 if (FAILED_UNEXPECTEDLY(hResult
))
1242 fCommandCategory
= *category
;
1246 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Unknown1()
1251 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddButtons(const GUID
*pguidCmdGroup
, long buttonCount
, TBBUTTON
*buttons
)
1256 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddString(const GUID
*pguidCmdGroup
,
1257 HINSTANCE param10
, LPCTSTR param14
, long *param18
)
1261 result
= (long)::SendMessage(fToolbarWindow
, TB_ADDSTRINGW
,
1262 reinterpret_cast<WPARAM
>(param10
), reinterpret_cast<LPARAM
>(param14
));
1269 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1274 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetState(const GUID
*pguidCmdGroup
, long commandID
, long *theState
)
1276 if (theState
== NULL
)
1278 // map the command id
1279 *theState
= (long)::SendMessage(fToolbarWindow
, TB_GETSTATE
, commandID
, 0);
1283 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetState(const GUID
*pguidCmdGroup
, long commandID
, long theState
)
1285 // map the command id
1286 ::SendMessage(fToolbarWindow
, TB_SETSTATE
, commandID
, MAKELONG(theState
, 0));
1290 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBitmap(const GUID
*pguidCmdGroup
, long param10
, long buttonCount
,
1291 TBADDBITMAP
*lParam
, long *newIndex
, COLORREF param20
)
1296 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBitmapSize(long *paramC
)
1300 *paramC
= MAKELONG(24, 24);
1304 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SendToolbarMsg(const GUID
*pguidCmdGroup
, UINT uMsg
,
1305 WPARAM wParam
, LPARAM lParam
, LRESULT
*result
)
1310 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetImageList(const GUID
*pguidCmdGroup
, HIMAGELIST param10
,
1311 HIMAGELIST param14
, HIMAGELIST param18
)
1316 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ModifyButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1321 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnChange(LONG lEvent
, LPCITEMIDLIST pidl1
, LPCITEMIDLIST pidl2
)
1326 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetSite(IUnknown
*pUnkSite
)
1328 CComPtr
<IBrowserService
> browserService
;
1333 if (pUnkSite
== NULL
)
1335 hResult
= AtlUnadvise(fSite
, DIID_DWebBrowserEvents
, fAdviseCookie
);
1336 ::DestroyWindow(fMainReBar
);
1342 // get window handle of owner
1343 hResult
= IUnknown_GetWindow(pUnkSite
, &ownerWindow
);
1344 if (FAILED_UNEXPECTEDLY(hResult
))
1346 if (ownerWindow
== NULL
)
1349 // create dock container
1351 dockContainer
= SHCreateWorkerWindowW(0, ownerWindow
, 0,
1352 WS_VISIBLE
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
, NULL
, 0);
1353 if (dockContainer
== NULL
)
1355 SubclassWindow(dockContainer
);
1357 // create rebar in dock container
1358 DWORD style
= WS_VISIBLE
| WS_BORDER
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
|
1359 RBS_VARHEIGHT
| RBS_BANDBORDERS
| RBS_REGISTERDROP
| RBS_AUTOSIZE
| RBS_DBLCLKTOGGLE
|
1360 CCS_NODIVIDER
| CCS_NOPARENTALIGN
| CCS_TOP
;
1361 DWORD exStyle
= WS_EX_LEFT
| WS_EX_LTRREADING
| WS_EX_RIGHTSCROLLBAR
| WS_EX_TOOLWINDOW
;
1362 fMainReBar
= CreateWindowEx(exStyle
, REBARCLASSNAMEW
, NULL
, style
,
1363 0, 0, 700, 60, dockContainer
, NULL
, _AtlBaseModule
.GetModuleInstance(), NULL
);
1364 if (fMainReBar
== NULL
)
1367 // take advice to watch events
1368 hResult
= IUnknown_QueryService(pUnkSite
, SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1369 hResult
= AtlAdvise(browserService
, static_cast<IDispatch
*>(this), DIID_DWebBrowserEvents
, &fAdviseCookie
);
1374 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSite(REFIID riid
, void **ppvSite
)
1376 if (ppvSite
== NULL
)
1378 if (fSite
.p
!= NULL
)
1379 return fSite
->QueryInterface(riid
, ppvSite
);
1384 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
1388 if (IsEqualIID(guidService
, IID_IBandSite
))
1389 return this->QueryInterface(riid
, ppvObject
);
1390 if (IsEqualIID(guidService
, SID_IBandProxy
))
1392 if (fBandProxy
.p
== NULL
)
1394 hResult
= CreateAndInitBandProxy();
1395 if (FAILED_UNEXPECTEDLY(hResult
))
1398 return fBandProxy
->QueryInterface(riid
, ppvObject
);
1400 return IUnknown_QueryService(fSite
, guidService
, riid
, ppvObject
);
1403 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnWinEvent(
1404 HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
1410 hResult
= IUnknown_RelayWinEvent(fMenuBar
, hWnd
, uMsg
, wParam
, lParam
, theResult
);
1411 if (hResult
!= S_FALSE
)
1417 hResult
= IUnknown_RelayWinEvent(fNavigationBar
, hWnd
, uMsg
, wParam
, lParam
, theResult
);
1418 if (hResult
!= S_FALSE
)
1424 hResult
= IUnknown_RelayWinEvent(fLogoBar
, hWnd
, uMsg
, wParam
, lParam
, theResult
);
1425 if (hResult
!= S_FALSE
)
1432 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsWindowOwner(HWND hWnd
)
1438 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBand(IUnknown
*punk
)
1444 HRESULT STDMETHODCALLTYPE
CInternetToolbar::EnumBands(UINT uBand
, DWORD
*pdwBandID
)
1450 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryBand(DWORD dwBandID
,
1451 IDeskBand
**ppstb
, DWORD
*pdwState
, LPWSTR pszName
, int cchName
)
1455 if (dwBandID
== ITBBID_MENUBAND
&& fMenuBar
.p
!= NULL
)
1456 return fMenuBar
->QueryInterface(IID_PPV_ARG(IDeskBand
, ppstb
));
1457 //if (dwBandID == ITBBID_BRANDBAND && fLogoBar.p != NULL)
1458 // return fLogoBar->QueryInterface(IID_PPV_ARG(IDeskBand, ppstb));
1463 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandState(DWORD dwBandID
, DWORD dwMask
, DWORD dwState
)
1469 HRESULT STDMETHODCALLTYPE
CInternetToolbar::RemoveBand(DWORD dwBandID
)
1475 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandObject(DWORD dwBandID
, REFIID riid
, void **ppv
)
1481 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandSiteInfo(const BANDSITEINFO
*pbsinfo
)
1487 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandSiteInfo(BANDSITEINFO
*pbsinfo
)
1493 LRESULT
CInternetToolbar::OnTravelBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1495 CComPtr
<IWebBrowser
> webBrowser
;
1498 hResult
= IUnknown_QueryService(fSite
, SID_SShellBrowser
, IID_PPV_ARG(IWebBrowser
, &webBrowser
));
1499 if (FAILED_UNEXPECTEDLY(hResult
))
1501 hResult
= webBrowser
->GoBack();
1505 LRESULT
CInternetToolbar::OnTravelForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1507 CComPtr
<IWebBrowser
> webBrowser
;
1510 hResult
= IUnknown_QueryService(fSite
, SID_SShellBrowser
, IID_PPV_ARG(IWebBrowser
, &webBrowser
));
1511 if (FAILED_UNEXPECTEDLY(hResult
))
1513 hResult
= webBrowser
->GoForward();
1517 LRESULT
CInternetToolbar::OnUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1519 IUnknown_Exec(fSite
, CGID_ShellBrowser
, IDM_GOTO_UPONELEVEL
, 0, NULL
, NULL
);
1523 LRESULT
CInternetToolbar::OnSearch(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1525 IUnknown_Exec(fSite
, CGID_Explorer
, 0x1c, 1, NULL
, NULL
);
1529 LRESULT
CInternetToolbar::OnFolders(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1531 IUnknown_Exec(fSite
, CGID_Explorer
, 0x23, 0, NULL
, NULL
);
1535 LRESULT
CInternetToolbar::OnForwardToCommandTarget(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1539 if (fCommandTarget
.p
!= NULL
)
1541 hResult
= fCommandTarget
->Exec(&fCommandCategory
, wID
, 0, NULL
, NULL
);
1542 if (FAILED(hResult
))
1544 ::SendMessageW(::GetParent(m_hWnd
), WM_COMMAND
, wID
, 0);
1550 LRESULT
CInternetToolbar::OnMenuDropDown(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1552 CComPtr
<IBrowserService
> browserService
;
1553 CComPtr
<IOleCommandTarget
> commandTarget
;
1554 CComPtr
<ITravelLog
> travelLog
;
1555 NMTOOLBARW
*notifyInfo
;
1563 wchar_t templateString
[200];
1565 notifyInfo
= (NMTOOLBARW
*)pNMHDR
;
1566 if (notifyInfo
->hdr
.hwndFrom
!= fToolbarWindow
)
1568 // not from the toolbar, keep looking for a message handler
1572 SendMessage(fToolbarWindow
, TB_GETRECT
, notifyInfo
->iItem
, reinterpret_cast<LPARAM
>(&bounds
));
1573 ::MapWindowPoints(fToolbarWindow
, NULL
, reinterpret_cast<POINT
*>(&bounds
), 2);
1574 switch (notifyInfo
->iItem
)
1577 newMenu
= CreatePopupMenu();
1578 hResult
= IUnknown_QueryService(fSite
, SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1579 hResult
= browserService
->GetTravelLog(&travelLog
);
1580 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_BACK
);
1581 commandInfo
.cmdID
= 0x1d;
1582 hResult
= IUnknown_QueryStatus(browserService
, CGID_Explorer
, 1, &commandInfo
, NULL
);
1583 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1584 travelLog
->CountEntries(browserService
) > 1)
1586 AppendMenuW(newMenu
, MF_SEPARATOR
, -1, L
"");
1588 if (LoadStringW(_AtlBaseModule
.GetResourceInstance(),
1589 IDS_HISTORYTEXT
, templateString
, sizeof(templateString
) / sizeof(wchar_t)) == 0)
1590 StringCbCopyW(templateString
, sizeof(templateString
), L
"&History\tCtrl+H");
1592 AppendMenuW(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, templateString
);
1594 params
.cbSize
= sizeof(params
);
1595 params
.rcExclude
= bounds
;
1596 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1597 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1598 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1600 V_VT(&parmIn
) = VT_I4
;
1602 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1604 else if (selectedItem
!= 0)
1605 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1606 DestroyMenu(newMenu
);
1608 case IDM_GOTO_FORWARD
:
1609 newMenu
= CreatePopupMenu();
1610 hResult
= IUnknown_QueryService(fSite
, SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1611 hResult
= browserService
->GetTravelLog(&travelLog
);
1612 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_FORE
);
1613 commandInfo
.cmdID
= 0x1d;
1614 hResult
= IUnknown_QueryStatus(browserService
, CGID_Explorer
, 1, &commandInfo
, NULL
);
1615 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1616 travelLog
->CountEntries(browserService
) > 1)
1618 AppendMenuW(newMenu
, MF_SEPARATOR
, -1, L
"");
1620 if (LoadStringW(_AtlBaseModule
.GetResourceInstance(),
1621 IDS_HISTORYTEXT
, templateString
, sizeof(templateString
) / sizeof(wchar_t)) == 0)
1622 StringCbCopyW(templateString
, sizeof(templateString
), L
"&History\tCtrl+H");
1624 AppendMenuW(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, templateString
);
1626 params
.cbSize
= sizeof(params
);
1627 params
.rcExclude
= bounds
;
1628 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1629 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1630 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1632 V_VT(&parmIn
) = VT_I4
;
1634 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1636 else if (selectedItem
!= 0)
1637 hResult
= travelLog
->Travel(browserService
, selectedItem
);
1638 DestroyMenu(newMenu
);
1640 case gViewsCommandID
:
1642 CComVariant outValue
;
1645 V_VT(&inValue
) = VT_INT_PTR
;
1646 V_INTREF(&inValue
) = reinterpret_cast<INT
*>(&bounds
);
1648 if (fCommandTarget
.p
!= NULL
)
1649 hResult
= fCommandTarget
->Exec(&fCommandCategory
, FCIDM_SHVIEW_AUTOARRANGE
, 1, &inValue
, &outValue
);
1650 // pvaOut is VT_I4 with value 0x403
1653 return TBDDRET_DEFAULT
;
1656 LRESULT
CInternetToolbar::OnQueryInsert(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1661 LRESULT
CInternetToolbar::OnQueryDelete(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1666 LRESULT
CInternetToolbar::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1668 HMENU contextMenuBar
;
1670 POINT clickLocation
;
1672 RBHITTESTINFO hitTestInfo
;
1673 REBARBANDINFOW rebarBandInfo
;
1675 BOOL goButtonChecked
;
1677 clickLocation
.x
= LOWORD(lParam
);
1678 clickLocation
.y
= HIWORD(lParam
);
1679 hitTestInfo
.pt
= clickLocation
;
1680 ScreenToClient(&hitTestInfo
.pt
);
1681 SendMessage(fMainReBar
, RB_HITTEST
, 0, (LPARAM
)&hitTestInfo
);
1682 if (hitTestInfo
.iBand
== -1)
1684 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
1685 rebarBandInfo
.fMask
= RBBIM_ID
;
1686 SendMessage(fMainReBar
, RB_GETBANDINFOW
, hitTestInfo
.iBand
, (LPARAM
)&rebarBandInfo
);
1687 bandID
= rebarBandInfo
.wID
;
1688 contextMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1689 contextMenu
= GetSubMenu(contextMenuBar
, 0);
1692 case ITBBID_MENUBAND
: // menu band
1693 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1694 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1695 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1697 case ITBBID_BRANDBAND
: // brand band
1698 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1699 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1700 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1702 case ITBBID_TOOLSBAND
: // tools band
1703 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1704 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1706 case ITBBID_ADDRESSBAND
: // navigation band
1707 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1708 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1714 SHEnableMenuItem(contextMenu
, IDM_TOOLBARS_LINKSBAR
, FALSE
);
1716 SHCheckMenuItem(contextMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, IsBandVisible(ITBBID_TOOLSBAND
) == S_OK
);
1717 SHCheckMenuItem(contextMenu
, IDM_TOOLBARS_ADDRESSBAR
, IsBandVisible(ITBBID_ADDRESSBAND
) == S_OK
);
1718 SHCheckMenuItem(contextMenu
, IDM_TOOLBARS_LINKSBAR
, FALSE
);
1719 SHCheckMenuItem(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, FALSE
);
1720 SHCheckMenuItem(contextMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, fLocked
);
1721 goButtonChecked
= SHRegGetBoolUSValueW(L
"Software\\Microsoft\\Internet Explorer\\Main", L
"ShowGoButton", FALSE
, TRUE
);
1722 SHCheckMenuItem(contextMenu
, IDM_TOOLBARS_GOBUTTON
, goButtonChecked
);
1724 // TODO: use GetSystemMetrics(SM_MENUDROPALIGNMENT) to determine menu alignment
1725 command
= TrackPopupMenu(contextMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RIGHTBUTTON
| TPM_RETURNCMD
,
1726 clickLocation
.x
, clickLocation
.y
, 0, m_hWnd
, NULL
);
1729 case IDM_TOOLBARS_STANDARDBUTTONS
: // standard buttons
1730 ToggleBandVisibility(ITBBID_TOOLSBAND
);
1732 case IDM_TOOLBARS_ADDRESSBAR
: // address bar
1733 ToggleBandVisibility(ITBBID_ADDRESSBAND
);
1735 case IDM_TOOLBARS_LINKSBAR
: // links
1737 case IDM_TOOLBARS_LOCKTOOLBARS
: // lock the toolbars
1738 LockUnlockToolbars(!fLocked
);
1740 case IDM_TOOLBARS_CUSTOMIZE
: // customize
1741 SendMessage(fToolbarWindow
, TB_CUSTOMIZE
, 0, 0);
1743 case IDM_TOOLBARS_GOBUTTON
:
1744 SendMessage(fNavigationWindow
, WM_COMMAND
, IDM_TOOLBARS_GOBUTTON
, 0);
1748 DestroyMenu(contextMenuBar
);
1752 LRESULT
CInternetToolbar::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1754 if (wParam
!= SIZE_MINIMIZED
)
1756 ::SetWindowPos(fMainReBar
, NULL
, 0, 0, LOWORD(lParam
), HIWORD(lParam
),
1757 SWP_NOOWNERZORDER
| SWP_NOZORDER
| SWP_NOMOVE
);
1762 LRESULT
CInternetToolbar::OnSetCursor(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1764 if ((short)lParam
!= HTCLIENT
|| (HWND
)wParam
!= m_hWnd
)
1769 SetCursor(LoadCursor(NULL
, IDC_SIZENS
));
1773 LRESULT
CInternetToolbar::OnTipText(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1775 CComPtr
<IBrowserService
> browserService
;
1776 CComPtr
<ITravelLog
> travelLog
;
1777 TOOLTIPTEXTW
*pTTTW
;
1780 wchar_t tempString
[300];
1782 pTTTW
= reinterpret_cast<TOOLTIPTEXTW
*>(pNMHDR
);
1783 if ((pTTTW
->uFlags
& TTF_IDISHWND
) != 0)
1784 nID
= ::GetDlgCtrlID((HWND
)pNMHDR
->idFrom
);
1786 nID
= (UINT
)pNMHDR
->idFrom
;
1790 if (nID
== (UINT
)IDM_GOTO_BACK
|| nID
== (UINT
)IDM_GOTO_FORWARD
)
1792 // TODO: Should this call QueryService?
1793 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IBrowserService
, &browserService
));
1794 hResult
= browserService
->GetTravelLog(&travelLog
);
1795 hResult
= travelLog
->GetToolTipText(browserService
,
1796 (nID
== (UINT
)IDM_GOTO_BACK
) ? TLOG_BACK
: TLOG_FORE
,
1797 0, tempString
, 299);
1798 if (FAILED_UNEXPECTEDLY(hResult
))
1806 wcsncpy (pTTTW
->szText
, tempString
, sizeof(pTTTW
->szText
) / sizeof(wchar_t));
1807 ::SetWindowPos(pNMHDR
->hwndFrom
, HWND_TOP
, 0, 0, 0, 0,
1808 SWP_NOOWNERZORDER
| SWP_NOACTIVATE
| SWP_NOMOVE
| SWP_NOSIZE
);
1814 LRESULT
CInternetToolbar::OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1819 hResult
= OnWinEvent((HWND
) lParam
, uMsg
, wParam
, lParam
, &theResult
);
1821 bHandled
= hResult
== S_OK
;
1823 return FAILED_UNEXPECTEDLY(hResult
) ? 0 : theResult
;
1825 LRESULT
CInternetToolbar::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1827 NMHDR
*notifyHeader
;
1831 notifyHeader
= reinterpret_cast<NMHDR
*>(lParam
);
1833 hResult
= OnWinEvent(notifyHeader
->hwndFrom
, uMsg
, wParam
, lParam
, &theResult
);
1835 bHandled
= hResult
== S_OK
;
1837 return FAILED_UNEXPECTEDLY(hResult
) ? 0 : theResult
;
1840 LRESULT
CInternetToolbar::OnLDown(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1846 if (wParam
& MK_CONTROL
)
1851 DWORD msgp
= GetMessagePos();
1853 fStartPosition
.x
= GET_X_LPARAM(msgp
);
1854 fStartPosition
.y
= GET_Y_LPARAM(msgp
);
1859 fStartHeight
= rc
.bottom
- rc
.top
;
1867 LRESULT
CInternetToolbar::OnMouseMove(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1873 DWORD msgp
= GetMessagePos();
1876 pt
.x
= GET_X_LPARAM(msgp
);
1877 pt
.y
= GET_Y_LPARAM(msgp
);
1879 ReserveBorderSpace(fStartHeight
- fStartPosition
.y
+ pt
.y
);
1885 LRESULT
CInternetToolbar::OnLUp(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1891 OnMouseMove(uMsg
, wParam
, lParam
, bHandled
);
1900 LRESULT
CInternetToolbar::OnWinIniChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1905 hr
= IUnknown_GetWindow(fMenuBar
, &hwndMenu
);
1906 if (FAILED_UNEXPECTEDLY(hr
))
1909 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1910 hr
= fMenuBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1911 if (FAILED_UNEXPECTEDLY(hr
))
1915 hr
= menuWinEventHandler
->OnWinEvent(hwndMenu
, uMsg
, wParam
, lParam
, &lres
);
1916 if (FAILED_UNEXPECTEDLY(hr
))