3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/win32/shell32/CMenuBand.c
5 * PURPOSE: menu band implementation
6 * PROGRAMMERS: Giannis Adamopoulos (gadamopoulos@reactos.org)
13 WINE_DEFAULT_DEBUG_CHANNEL(CMenuBand
);
17 AllocAndGetMenuString(HMENU hMenu
, UINT ItemIDByPosition
, WCHAR
** String
)
21 Length
= GetMenuStringW(hMenu
, ItemIDByPosition
, NULL
, 0, MF_BYPOSITION
);
26 /* Also allocate space for the terminating NULL character */
28 *String
= (PWSTR
)HeapAlloc(GetProcessHeap(), 0, Length
* sizeof(WCHAR
));
30 GetMenuStringW(hMenu
, ItemIDByPosition
, *String
, Length
, MF_BYPOSITION
);
35 CMenuStaticToolbar::CMenuStaticToolbar(CMenuBand
*menuBand
)
37 m_menuBand
= menuBand
;
47 HRESULT
CMenuStaticToolbar::GetMenu(
54 *pdwFlags
= m_dwMenuFlags
;
59 HRESULT
CMenuStaticToolbar::SetMenu(
69 m_dwMenuFlags
= dwFlags
;
74 HRESULT
CMenuStaticToolbar::ShowWindow(BOOL fShow
)
76 ::ShowWindow(m_hwnd
, fShow
? SW_SHOW
: SW_HIDE
);
81 HRESULT
CMenuStaticToolbar::Close()
83 DestroyWindow(m_hwnd
);
88 HRESULT
CMenuStaticToolbar::CreateToolbar(HWND hwndParent
, DWORD dwFlags
)
91 hwndToolbar
= CreateWindowEx(TBSTYLE_EX_DOUBLEBUFFER
, TOOLBARCLASSNAMEW
, NULL
, WS_CHILD
| WS_VISIBLE
| WS_CLIPSIBLINGS
|
92 WS_CLIPCHILDREN
| TBSTYLE_TOOLTIPS
| TBSTYLE_TRANSPARENT
| TBSTYLE_REGISTERDROP
| TBSTYLE_LIST
| TBSTYLE_FLAT
|
93 CCS_NODIVIDER
| CCS_NOPARENTALIGN
| CCS_NORESIZE
| CCS_TOP
, 0, 0, 500, 20, m_hwndOwner
, NULL
,
94 _AtlBaseModule
.GetModuleInstance(), 0);
95 if (hwndToolbar
== NULL
)
98 ::SetParent(hwndToolbar
, hwndParent
);
100 m_hwnd
= hwndToolbar
;
102 /* Identify the version of the used Common Controls DLL by sending the size of the TBBUTTON structure */
103 SendMessageW(m_hwnd
, TB_BUTTONSTRUCTSIZE
, sizeof(TBBUTTON
), 0);
105 if (dwFlags
& SMINIT_TOPLEVEL
)
107 /* Hide the placeholders for the button images */
108 SendMessageW(m_hwnd
, TB_SETIMAGELIST
, 0, 0);
114 HRESULT
CMenuStaticToolbar::FillToolbar()
120 tbb
.fsState
= TBSTATE_ENABLED
;
121 tbb
.fsStyle
= BTNS_DROPDOWN
| BTNS_AUTOSIZE
;
123 for(i
= 0; i
< GetMenuItemCount(m_hmenu
); i
++)
125 if(!AllocAndGetMenuString(m_hmenu
, i
, &MenuString
))
126 return E_OUTOFMEMORY
;
129 tbb
.iString
= (INT_PTR
)MenuString
;
131 SendMessageW(m_hwnd
, TB_ADDBUTTONS
, 1, (LPARAM
)(LPTBBUTTON
)&tbb
);
132 HeapFree(GetProcessHeap(), 0, MenuString
);
138 HRESULT
CMenuStaticToolbar::GetWindow(HWND
*phwnd
)
148 CMenuBand::CMenuBand()
152 m_staticToolbar
= NULL
;
155 CMenuBand::~CMenuBand()
164 delete m_staticToolbar
;
167 HRESULT STDMETHODCALLTYPE
CMenuBand::Initialize(
168 IShellMenuCallback
*psmc
,
178 m_uIdAncestor
= uIdAncestor
;
187 HRESULT STDMETHODCALLTYPE
CMenuBand::GetMenuInfo(
188 IShellMenuCallback
**ppsmc
,
195 *puIdAncestor
= m_uIdAncestor
;
196 *pdwFlags
= m_dwFlags
;
201 HRESULT STDMETHODCALLTYPE
CMenuBand::SetMenu(
206 if (m_staticToolbar
== NULL
)
207 m_staticToolbar
= new CMenuStaticToolbar(this);
209 HRESULT hResult
= m_staticToolbar
->SetMenu(hmenu
, hwnd
, dwFlags
);
217 hResult
= m_site
->GetWindow(&hwndParent
);
221 hResult
= m_staticToolbar
->CreateToolbar(hwndParent
, m_dwFlags
);
225 hResult
= m_staticToolbar
->FillToolbar();
231 HRESULT STDMETHODCALLTYPE
CMenuBand::GetMenu(
236 if (m_staticToolbar
== NULL
)
239 return m_staticToolbar
->GetMenu(phmenu
, phwnd
, pdwFlags
);
242 HRESULT STDMETHODCALLTYPE
CMenuBand::SetSite(IUnknown
*pUnkSite
)
250 if (pUnkSite
== NULL
)
254 hResult
= pUnkSite
->QueryInterface(IID_PPV_ARG(IOleWindow
, &m_site
));
255 if (SUCCEEDED(hResult
))
257 m_site
->GetWindow(&hwndParent
);
260 if (!::IsWindow(hwndParent
))
263 if (m_staticToolbar
!= NULL
)
265 m_staticToolbar
->CreateToolbar(hwndParent
, m_dwFlags
);
266 m_staticToolbar
->FillToolbar();
272 HRESULT STDMETHODCALLTYPE
CMenuBand::GetSite(REFIID riid
, PVOID
*ppvSite
)
277 return m_site
->QueryInterface(riid
, ppvSite
);
280 HRESULT STDMETHODCALLTYPE
CMenuBand::GetWindow(
283 if (m_staticToolbar
!= NULL
)
284 return m_staticToolbar
->GetWindow(phwnd
);
289 HRESULT STDMETHODCALLTYPE
CMenuBand::GetBandInfo(
299 if (m_staticToolbar
== NULL
)
301 hResult
= m_staticToolbar
->GetWindow(&hwnd
);
307 if (pdbi
->dwMask
& DBIM_MINSIZE
)
309 SendMessageW( hwnd
, TB_GETIDEALSIZE
, TRUE
, (LPARAM
)&size
);
311 pdbi
->ptMinSize
.x
= 0;
312 pdbi
->ptMinSize
.y
= size
.cy
;
314 if (pdbi
->dwMask
& DBIM_MAXSIZE
)
316 SendMessageW( hwnd
, TB_GETMAXSIZE
, 0, (LPARAM
)&size
);
318 pdbi
->ptMaxSize
.x
= size
.cx
;
319 pdbi
->ptMaxSize
.y
= size
.cy
;
321 if (pdbi
->dwMask
& DBIM_INTEGRAL
)
323 pdbi
->ptIntegral
.x
= 0;
324 pdbi
->ptIntegral
.y
= 0;
326 if (pdbi
->dwMask
& DBIM_ACTUAL
)
328 SendMessageW( hwnd
, TB_GETIDEALSIZE
, TRUE
, (LPARAM
)&size
);
329 SendMessageW( hwnd
, TB_GETIDEALSIZE
, FALSE
, (LPARAM
)&size
);
331 pdbi
->ptActual
.x
= size
.cx
;
332 pdbi
->ptActual
.y
= size
.cy
;
334 if (pdbi
->dwMask
& DBIM_TITLE
)
335 wcscpy(pdbi
->wszTitle
, L
"");
336 if (pdbi
->dwMask
& DBIM_MODEFLAGS
)
337 pdbi
->dwModeFlags
= DBIMF_UNDELETEABLE
;
338 if (pdbi
->dwMask
& DBIM_BKCOLOR
)
344 HRESULT STDMETHODCALLTYPE
CMenuBand::ShowDW(BOOL fShow
)
346 if (m_staticToolbar
!= NULL
)
347 return m_staticToolbar
->ShowWindow(fShow
);
352 HRESULT STDMETHODCALLTYPE
CMenuBand::CloseDW(DWORD dwReserved
)
356 if (m_staticToolbar
!= NULL
)
357 return m_staticToolbar
->Close();
361 HRESULT STDMETHODCALLTYPE
CMenuBand::ResizeBorderDW(LPCRECT prcBorder
, IUnknown
*punkToolbarSite
, BOOL fReserved
)
367 HRESULT STDMETHODCALLTYPE
CMenuBand::ContextSensitiveHelp(BOOL fEnterMode
)
373 HRESULT STDMETHODCALLTYPE
CMenuBand::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
379 HRESULT STDMETHODCALLTYPE
CMenuBand::HasFocusIO()
385 HRESULT STDMETHODCALLTYPE
CMenuBand::TranslateAcceleratorIO(LPMSG lpMsg
)
391 HRESULT STDMETHODCALLTYPE
CMenuBand::IsDirty()
397 HRESULT STDMETHODCALLTYPE
CMenuBand::Load(IStream
*pStm
)
403 HRESULT STDMETHODCALLTYPE
CMenuBand::Save(IStream
*pStm
, BOOL fClearDirty
)
409 HRESULT STDMETHODCALLTYPE
CMenuBand::GetSizeMax(ULARGE_INTEGER
*pcbSize
)
415 HRESULT STDMETHODCALLTYPE
CMenuBand::GetClassID(CLSID
*pClassID
)
421 HRESULT STDMETHODCALLTYPE
CMenuBand::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
427 HRESULT STDMETHODCALLTYPE
CMenuBand::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
433 HRESULT STDMETHODCALLTYPE
CMenuBand::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
439 HRESULT STDMETHODCALLTYPE
CMenuBand::Popup(POINTL
*ppt
, RECTL
*prcExclude
, MP_POPUPFLAGS dwFlags
)
445 HRESULT STDMETHODCALLTYPE
CMenuBand::OnSelect(DWORD dwSelectType
)
451 HRESULT STDMETHODCALLTYPE
CMenuBand::SetSubMenu(IMenuPopup
*pmp
, BOOL fSet
)
457 HRESULT STDMETHODCALLTYPE
CMenuBand::SetClient(IUnknown
*punkClient
)
463 HRESULT STDMETHODCALLTYPE
CMenuBand::GetClient(IUnknown
**ppunkClient
)
469 HRESULT STDMETHODCALLTYPE
CMenuBand::OnPosRectChangeDB(RECT
*prc
)
475 HRESULT STDMETHODCALLTYPE
CMenuBand::IsMenuMessage(MSG
*pmsg
)
481 HRESULT STDMETHODCALLTYPE
CMenuBand::TranslateMenuMessage(MSG
*pmsg
, LRESULT
*plRet
)
487 HRESULT STDMETHODCALLTYPE
CMenuBand::SetShellFolder(IShellFolder
*psf
, LPCITEMIDLIST pidlFolder
, HKEY hKey
, DWORD dwFlags
)
493 HRESULT STDMETHODCALLTYPE
CMenuBand::GetShellFolder(DWORD
*pdwFlags
, LPITEMIDLIST
*ppidl
, REFIID riid
, void **ppv
)
499 HRESULT STDMETHODCALLTYPE
CMenuBand::InvalidateItem(LPSMDATA psmd
, DWORD dwFlags
)
505 HRESULT STDMETHODCALLTYPE
CMenuBand::GetState(LPSMDATA psmd
)
511 HRESULT STDMETHODCALLTYPE
CMenuBand::SetMenuToolbar(IUnknown
*punk
, DWORD dwFlags
)
517 HRESULT STDMETHODCALLTYPE
CMenuBand::OnWinEvent(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
523 HRESULT STDMETHODCALLTYPE
CMenuBand::IsWindowOwner(HWND hWnd
)
529 HRESULT STDMETHODCALLTYPE
CMenuBand::GetSubMenu(THIS
)
535 HRESULT STDMETHODCALLTYPE
CMenuBand::SetToolbar(THIS
)
541 HRESULT STDMETHODCALLTYPE
CMenuBand::SetMinWidth(THIS
)
547 HRESULT STDMETHODCALLTYPE
CMenuBand::SetNoBorder(THIS
)
553 HRESULT STDMETHODCALLTYPE
CMenuBand::SetTheme(THIS
)
559 HRESULT STDMETHODCALLTYPE
CMenuBand::GetTop(THIS
)
565 HRESULT STDMETHODCALLTYPE
CMenuBand::GetBottom(THIS
)
571 HRESULT STDMETHODCALLTYPE
CMenuBand::GetTracked(THIS
)
577 HRESULT STDMETHODCALLTYPE
CMenuBand::GetParentSite(THIS
)
583 HRESULT STDMETHODCALLTYPE
CMenuBand::GetState(THIS
)
589 HRESULT STDMETHODCALLTYPE
CMenuBand::DoDefaultAction(THIS
)
595 HRESULT STDMETHODCALLTYPE
CMenuBand::IsEmpty(THIS
)