Author: gadamopoulos Date: Wed Oct 16 19:13:49 2013 New Revision: 60690
URL: http://svn.reactos.org/svn/reactos?rev=60690&view=rev Log: [shell32] - Add an initial stub for CMenuBand that creates a menu bar and fills it with contents. However its still not functional
Modified: trunk/reactos/dll/win32/shell32/CMenuBand.cpp trunk/reactos/dll/win32/shell32/CMenuBand.h trunk/reactos/dll/win32/shell32/precomp.h
Modified: trunk/reactos/dll/win32/shell32/CMenuBand.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/CMenuBand... ============================================================================== --- trunk/reactos/dll/win32/shell32/CMenuBand.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/CMenuBand.cpp [iso-8859-1] Wed Oct 16 19:13:49 2013 @@ -7,57 +7,368 @@ */
#include "precomp.h" +#include <windowsx.h>
WINE_DEFAULT_DEBUG_CHANNEL(CMenuBand);
-HRESULT STDMETHODCALLTYPE CMenuBand::GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi) -{ - UNIMPLEMENTED; - return S_OK; -} - -HRESULT STDMETHODCALLTYPE CMenuBand::ShowDW(BOOL fShow) -{ - UNIMPLEMENTED; - return S_OK; + +BOOL +AllocAndGetMenuString(HMENU hMenu, UINT ItemIDByPosition, WCHAR** String) +{ + int Length; + + Length = GetMenuStringW(hMenu, ItemIDByPosition, NULL, 0, MF_BYPOSITION); + + if(!Length) + return FALSE; + + /* Also allocate space for the terminating NULL character */ + ++Length; + *String = (PWSTR)HeapAlloc(GetProcessHeap(), 0, Length * sizeof(WCHAR)); + + GetMenuStringW(hMenu, ItemIDByPosition, *String, Length, MF_BYPOSITION); + + return TRUE; +} + +CMenuStaticToolbar::CMenuStaticToolbar(CMenuBand *menuBand) +{ + m_menuBand = menuBand; + + + m_menuBand = NULL; + m_hwnd = NULL; + m_hmenu = NULL; + m_hwndOwner = NULL; + m_dwMenuFlags = NULL; +} + +HRESULT CMenuStaticToolbar::GetMenu( + HMENU *phmenu, + HWND *phwnd, + DWORD *pdwFlags) +{ + *phmenu = m_hmenu; + *phwnd = m_hwndOwner; + *pdwFlags = m_dwMenuFlags; + + return S_OK; +} + +HRESULT CMenuStaticToolbar::SetMenu( + HMENU hmenu, + HWND hwnd, + DWORD dwFlags) +{ + if (!hwnd) + return E_FAIL; + + m_hmenu = hmenu; + m_hwndOwner = hwnd; + m_dwMenuFlags = dwFlags; + + return S_OK; +} + +HRESULT CMenuStaticToolbar::ShowWindow(BOOL fShow) +{ + ::ShowWindow(m_hwnd, fShow ? SW_SHOW : SW_HIDE); + + return S_OK; +} + +HRESULT CMenuStaticToolbar::Close() +{ + DestroyWindow(m_hwnd); + m_hwnd = NULL; + return S_OK; +} + +HRESULT CMenuStaticToolbar::CreateToolbar(HWND hwndParent, DWORD dwFlags) +{ + HWND hwndToolbar; + hwndToolbar = CreateWindowEx(TBSTYLE_EX_DOUBLEBUFFER, TOOLBARCLASSNAMEW, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | + WS_CLIPCHILDREN | TBSTYLE_TOOLTIPS | TBSTYLE_TRANSPARENT | TBSTYLE_REGISTERDROP | TBSTYLE_LIST | TBSTYLE_FLAT | + CCS_NODIVIDER | CCS_NOPARENTALIGN | CCS_NORESIZE | CCS_TOP, 0, 0, 500, 20, m_hwndOwner, NULL, + _AtlBaseModule.GetModuleInstance(), 0); + if (hwndToolbar == NULL) + return E_FAIL; + + ::SetParent(hwndToolbar, hwndParent); + + m_hwnd = hwndToolbar; + + /* Identify the version of the used Common Controls DLL by sending the size of the TBBUTTON structure */ + SendMessageW(m_hwnd, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0); + + if (dwFlags & SMINIT_TOPLEVEL) + { + /* Hide the placeholders for the button images */ + SendMessageW(m_hwnd, TB_SETIMAGELIST, 0, 0); + } + + return S_OK; +} + +HRESULT CMenuStaticToolbar::FillToolbar() +{ + TBBUTTON tbb = {0}; + int i; + PWSTR MenuString; + + tbb.fsState = TBSTATE_ENABLED; + tbb.fsStyle = BTNS_DROPDOWN | BTNS_AUTOSIZE; + + for(i = 0; i < GetMenuItemCount(m_hmenu); i++) + { + if(!AllocAndGetMenuString(m_hmenu, i, &MenuString)) + return E_OUTOFMEMORY; + + tbb.idCommand = i; + tbb.iString = (INT_PTR)MenuString; + + SendMessageW(m_hwnd, TB_ADDBUTTONS, 1, (LPARAM)(LPTBBUTTON)&tbb); + HeapFree(GetProcessHeap(), 0, MenuString); + } + + return S_OK; +} + +HRESULT CMenuStaticToolbar::GetWindow(HWND *phwnd) +{ + if (!phwnd) + return E_FAIL; + + *phwnd = m_hwnd; + + return S_OK; +} + +CMenuBand::CMenuBand() +{ + m_site = NULL; + m_psmc = NULL; + m_staticToolbar = NULL; +} + +CMenuBand::~CMenuBand() +{ + if (m_site) + m_site->Release(); + + if (m_psmc) + m_psmc->Release(); + + if (m_staticToolbar) + delete m_staticToolbar; +} + +HRESULT STDMETHODCALLTYPE CMenuBand::Initialize( + IShellMenuCallback *psmc, + UINT uId, + UINT uIdAncestor, + DWORD dwFlags) +{ + if(m_psmc) + m_psmc->Release(); + + m_psmc = psmc; + m_uId = uId; + m_uIdAncestor = uIdAncestor; + m_dwFlags = dwFlags; + + if (m_psmc) + m_psmc->AddRef(); + + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CMenuBand::GetMenuInfo( + IShellMenuCallback **ppsmc, + UINT *puId, + UINT *puIdAncestor, + DWORD *pdwFlags) +{ + *ppsmc = m_psmc; + *puId = m_uId; + *puIdAncestor = m_uIdAncestor; + *pdwFlags = m_dwFlags; + + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CMenuBand::SetMenu( + HMENU hmenu, + HWND hwnd, + DWORD dwFlags) +{ + if (m_staticToolbar == NULL) + m_staticToolbar = new CMenuStaticToolbar(this); + + HRESULT hResult = m_staticToolbar->SetMenu(hmenu, hwnd, dwFlags); + if (FAILED(hResult)) + return hResult; + + if (m_site) + { + HWND hwndParent; + + hResult = m_site->GetWindow(&hwndParent); + if (FAILED(hResult)) + return hResult; + + hResult = m_staticToolbar->CreateToolbar(hwndParent, m_dwFlags); + if (FAILED(hResult)) + return hResult; + + hResult = m_staticToolbar->FillToolbar(); + } + + return hResult; +} + +HRESULT STDMETHODCALLTYPE CMenuBand::GetMenu( + HMENU *phmenu, + HWND *phwnd, + DWORD *pdwFlags) +{ + if (m_staticToolbar == NULL) + return E_FAIL; + + return m_staticToolbar->GetMenu(phmenu, phwnd, pdwFlags); +} + +HRESULT STDMETHODCALLTYPE CMenuBand::SetSite(IUnknown *pUnkSite) +{ + HWND hwndParent; + HRESULT hResult; + + if (m_site != NULL) + m_site->Release(); + + if (pUnkSite == NULL) + return S_OK; + + hwndParent = NULL; + hResult = pUnkSite->QueryInterface(IID_IOleWindow, reinterpret_cast<void **>(&m_site)); + if (SUCCEEDED(hResult)) + { + m_site->GetWindow(&hwndParent); + m_site->Release(); + } + if (!::IsWindow(hwndParent)) + return E_FAIL; + + if (m_staticToolbar != NULL) + { + m_staticToolbar->CreateToolbar(hwndParent, m_dwFlags); + m_staticToolbar->FillToolbar(); + } + + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CMenuBand::GetSite(REFIID riid, PVOID *ppvSite) +{ + if (m_site == NULL) + return E_FAIL; + + return m_site->QueryInterface(riid, ppvSite); +} + +HRESULT STDMETHODCALLTYPE CMenuBand::GetWindow( + HWND *phwnd) +{ + if (m_staticToolbar != NULL) + return m_staticToolbar->GetWindow(phwnd); + + return E_FAIL; +} + +HRESULT STDMETHODCALLTYPE CMenuBand::GetBandInfo( + DWORD dwBandID, + DWORD dwViewMode, + DESKBANDINFO *pdbi) +{ + SIZE size; + HWND hwnd; + HRESULT hResult; + + /* FIXME */ + if (m_staticToolbar == NULL) + return E_FAIL; + hResult = m_staticToolbar->GetWindow(&hwnd); + if (FAILED(hResult)) + return hResult; + if (hwnd == NULL) + return E_FAIL; + + if (pdbi->dwMask & DBIM_MINSIZE) + { + SendMessageW( hwnd, TB_GETIDEALSIZE, TRUE, (LPARAM)&size); + + pdbi->ptMinSize.x = 0; + pdbi->ptMinSize.y = size.cy; + } + if (pdbi->dwMask & DBIM_MAXSIZE) + { + SendMessageW( hwnd, TB_GETMAXSIZE, 0, (LPARAM)&size); + + pdbi->ptMaxSize.x = size.cx; + pdbi->ptMaxSize.y = size.cy; + } + if (pdbi->dwMask & DBIM_INTEGRAL) + { + pdbi->ptIntegral.x = 0; + pdbi->ptIntegral.y = 0; + } + if (pdbi->dwMask & DBIM_ACTUAL) + { + SendMessageW( hwnd, TB_GETIDEALSIZE, TRUE, (LPARAM)&size); + SendMessageW( hwnd, TB_GETIDEALSIZE, FALSE, (LPARAM)&size); + + pdbi->ptActual.x = size.cx; + pdbi->ptActual.y = size.cy; + } + if (pdbi->dwMask & DBIM_TITLE) + wcscpy(pdbi->wszTitle, L""); + if (pdbi->dwMask & DBIM_MODEFLAGS) + pdbi->dwModeFlags = DBIMF_UNDELETEABLE; + if (pdbi->dwMask & DBIM_BKCOLOR) + pdbi->crBkgnd = 0; + return S_OK; +} + +/* IDockingWindow */ +HRESULT STDMETHODCALLTYPE CMenuBand::ShowDW(BOOL fShow) +{ + if (m_staticToolbar != NULL) + return m_staticToolbar->ShowWindow(fShow); + + return E_FAIL; }
HRESULT STDMETHODCALLTYPE CMenuBand::CloseDW(DWORD dwReserved) { - UNIMPLEMENTED; - return S_OK; -} - + ShowDW(FALSE); + + if (m_staticToolbar != NULL) + return m_staticToolbar->Close(); + + return S_OK; +} HRESULT STDMETHODCALLTYPE CMenuBand::ResizeBorderDW(LPCRECT prcBorder, IUnknown *punkToolbarSite, BOOL fReserved) { UNIMPLEMENTED; return S_OK; }
-HRESULT STDMETHODCALLTYPE CMenuBand::GetWindow(HWND *phwnd) -{ - UNIMPLEMENTED; - return S_OK; -} - HRESULT STDMETHODCALLTYPE CMenuBand::ContextSensitiveHelp(BOOL fEnterMode) { UNIMPLEMENTED; return S_OK; }
-HRESULT STDMETHODCALLTYPE CMenuBand::SetSite(IUnknown *pUnkSite) -{ - UNIMPLEMENTED; - return S_OK; -} - -HRESULT STDMETHODCALLTYPE CMenuBand::GetSite(REFIID riid, PVOID *ppvSite) -{ - UNIMPLEMENTED; - return S_OK; -} - HRESULT STDMETHODCALLTYPE CMenuBand::UIActivateIO(BOOL fActivate, LPMSG lpMsg) { UNIMPLEMENTED; @@ -172,18 +483,6 @@ return S_FALSE; }
-HRESULT STDMETHODCALLTYPE CMenuBand::Initialize(IShellMenuCallback *psmc, UINT uId, UINT uIdAncestor,DWORD dwFlags) -{ - UNIMPLEMENTED; - return S_OK; -} - -HRESULT STDMETHODCALLTYPE CMenuBand::GetMenuInfo(IShellMenuCallback **ppsmc, UINT *puId, UINT *puIdAncestor, DWORD *pdwFlags) -{ - UNIMPLEMENTED; - return S_OK; -} - HRESULT STDMETHODCALLTYPE CMenuBand::SetShellFolder(IShellFolder *psf, LPCITEMIDLIST pidlFolder, HKEY hKey, DWORD dwFlags) { UNIMPLEMENTED; @@ -196,18 +495,6 @@ return S_OK; }
-HRESULT STDMETHODCALLTYPE CMenuBand::SetMenu(HMENU hmenu, HWND hwnd, DWORD dwFlags) -{ - UNIMPLEMENTED; - return S_OK; -} - -HRESULT STDMETHODCALLTYPE CMenuBand::GetMenu(HMENU *phmenu, HWND *phwnd, DWORD *pdwFlags) -{ - UNIMPLEMENTED; - return S_OK; -} - HRESULT STDMETHODCALLTYPE CMenuBand::InvalidateItem(LPSMDATA psmd, DWORD dwFlags) { UNIMPLEMENTED;
Modified: trunk/reactos/dll/win32/shell32/CMenuBand.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/CMenuBand... ============================================================================== --- trunk/reactos/dll/win32/shell32/CMenuBand.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/CMenuBand.h [iso-8859-1] Wed Oct 16 19:13:49 2013 @@ -1,3 +1,29 @@ + +class CMenuBand; + +class CMenuStaticToolbar +{ +public: + CMenuStaticToolbar(CMenuBand *menuBand); + + HRESULT CreateToolbar(HWND hwndParent, DWORD dwFlags); + HRESULT FillToolbar(); + HRESULT GetWindow(HWND *phwnd); + HRESULT SetMenu(HMENU hmenu, HWND hwnd, DWORD dwFlags); + HRESULT GetMenu(HMENU *phmenu, HWND *phwnd, DWORD *pdwFlags); + HRESULT ShowWindow(BOOL fShow); + HRESULT Close(); + +private: + + static const UINT WM_USER_SHOWPOPUPMENU = WM_USER + 1; + + CMenuBand *m_menuBand; + HWND m_hwnd; + HMENU m_hmenu; + HWND m_hwndOwner; + DWORD m_dwMenuFlags; +};
class CMenuBand : public CComCoClass<CMenuBand, &CLSID_MenuBand>, @@ -14,6 +40,19 @@ public IWinEventHandler, public IShellMenuAcc { +public: + CMenuBand(); + ~CMenuBand(); + +private: + + IOleWindow *m_site; + CMenuStaticToolbar *m_staticToolbar; + + IShellMenuCallback *m_psmc; + UINT m_uId; + UINT m_uIdAncestor; + DWORD m_dwFlags; public :
// *** IDeskBand methods *** @@ -103,19 +142,18 @@ DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CMenuBand) - COM_INTERFACE_ENTRY_IID(IID_IMenuPopup, IMenuPopup) - COM_INTERFACE_ENTRY_IID(IID_IMenuBand, IMenuBand) + COM_INTERFACE_ENTRY_IID(IID_IDeskBar, IMenuPopup) COM_INTERFACE_ENTRY_IID(IID_IShellMenu, IShellMenu) COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget) COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IDeskBand) COM_INTERFACE_ENTRY_IID(IID_IDockingWindow, IDockingWindow) - COM_INTERFACE_ENTRY_IID(IID_IDeskBar, IDeskBar) COM_INTERFACE_ENTRY_IID(IID_IDeskBand, IDeskBand) COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite) COM_INTERFACE_ENTRY_IID(IID_IInputObject, IInputObject) COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStream) - COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersist) + COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersistStream) COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider) + COM_INTERFACE_ENTRY_IID(IID_IMenuPopup, IMenuPopup) COM_INTERFACE_ENTRY_IID(IID_IMenuBand, IMenuBand) COM_INTERFACE_ENTRY_IID(IID_IShellMenu2, IShellMenu2) COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler, IWinEventHandler)
Modified: trunk/reactos/dll/win32/shell32/precomp.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/precomp.h... ============================================================================== --- trunk/reactos/dll/win32/shell32/precomp.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/precomp.h [iso-8859-1] Wed Oct 16 19:13:49 2013 @@ -32,6 +32,7 @@ #include <ndk/rtlfuncs.h> #include <fmifs/fmifs.h> #include <sddl.h> +#include <commoncontrols.h>
#include <tchar.h> #include <strsafe.h>