1 /* 2 * ReactOS Explorer 3 * 4 * Copyright 2006 - 2007 Thomas Weidenmueller <w3seek@reactos.org> 5 * 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. 10 * 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. 15 * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21 #include "precomp.h" 22 23 HRESULT 24 UpdateStartMenu(IN OUT IMenuPopup *pMenuPopup, 25 IN HBITMAP hbmBanner OPTIONAL, 26 IN BOOL bSmallIcons) 27 { 28 CComPtr<IBanneredBar> pbb; 29 HRESULT hRet; 30 31 hRet = pMenuPopup->QueryInterface(IID_PPV_ARG(IBanneredBar, &pbb)); 32 if (SUCCEEDED(hRet)) 33 { 34 hRet = pbb->SetBitmap(hbmBanner); 35 36 /* Update the icon size */ 37 hRet = pbb->SetIconSize(bSmallIcons ? BMICON_SMALL : BMICON_LARGE); 38 } 39 40 return hRet; 41 } 42 43 IMenuPopup* 44 CreateStartMenu(IN ITrayWindow *Tray, 45 OUT IMenuBand **ppMenuBand, 46 IN HBITMAP hbmBanner OPTIONAL, 47 IN BOOL bSmallIcons) 48 { 49 HRESULT hr; 50 CComPtr<IMenuPopup> pMp; 51 CComPtr<IUnknown> pSms; 52 CComPtr<IMenuBand> pMb; 53 CComPtr<IInitializeObject> pIo; 54 CComPtr<IUnknown> pUnk; 55 CComPtr<IBandSite> pBs; 56 DWORD dwBandId = 0; 57 58 hr = CreateStartMenuSite(Tray, IID_PPV_ARG(IUnknown, &pSms)); 59 if (FAILED_UNEXPECTEDLY(hr)) 60 return NULL; 61 62 hr = _CStartMenu_CreateInstance(IID_PPV_ARG(IMenuPopup, &pMp)); 63 if (FAILED_UNEXPECTEDLY(hr)) 64 return NULL; 65 66 /* Set the menu site so we can handle messages */ 67 hr = IUnknown_SetSite(pMp, pSms); 68 if (FAILED_UNEXPECTEDLY(hr)) 69 return NULL; 70 71 /* Initialize the menu object */ 72 hr = pMp->QueryInterface(IID_PPV_ARG(IInitializeObject, &pIo)); 73 if (SUCCEEDED(hr)) 74 hr = pIo->Initialize(); 75 else 76 hr = S_OK; 77 78 /* Everything is initialized now. Let's get the IMenuBand interface. */ 79 if (FAILED_UNEXPECTEDLY(hr)) 80 return NULL; 81 82 hr = pMp->GetClient(&pUnk); 83 if (FAILED_UNEXPECTEDLY(hr)) 84 return NULL; 85 86 hr = pUnk->QueryInterface(IID_PPV_ARG(IBandSite, &pBs)); 87 if (FAILED_UNEXPECTEDLY(hr)) 88 return NULL; 89 90 /* Finally we have the IBandSite interface, there's only one 91 band in it that apparently provides the IMenuBand interface */ 92 hr = pBs->EnumBands(0, &dwBandId); 93 if (FAILED_UNEXPECTEDLY(hr)) 94 return NULL; 95 96 hr = pBs->GetBandObject(dwBandId, IID_PPV_ARG(IMenuBand, &pMb)); 97 if (FAILED_UNEXPECTEDLY(hr)) 98 return NULL; 99 100 UpdateStartMenu(pMp, 101 hbmBanner, 102 bSmallIcons); 103 104 *ppMenuBand = pMb.Detach(); 105 106 return pMp.Detach(); 107 } 108