4 * Copyright 2007 Hervé Poussineau
5 * Copyright 2009 Andrew Hill
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include "shellbars.h"
25 #define ASSERT(cond) \
27 ERR ("ASSERTION %s AT %s:%d FAILED!\n", #cond, __FILE__, __LINE__)
30 CBandSiteBase::CBandSiteBase()
38 UINT
CBandSiteBase::GetBandID(struct BandObject
*Band
)
40 return (UINT
)(Band
- fBands
);
43 struct CBandSiteBase::BandObject
*CBandSiteBase::GetBandByID(DWORD dwBandID
)
45 if ((LONG
)dwBandID
>= fBandsAllocated
)
48 if (fBands
[dwBandID
].DeskBand
== NULL
)
51 return &fBands
[dwBandID
];
54 void CBandSiteBase::FreeBand(struct BandObject
*Band
)
56 ATLASSERT(Band
->DeskBand
!= NULL
);
57 ATLASSERT(Band
->OleWindow
!= NULL
);
58 ATLASSERT(Band
->WndEvtHandler
!= NULL
);
59 Band
->DeskBand
->Release();
60 Band
->OleWindow
->Release();
61 Band
->WndEvtHandler
->Release();
62 memset(Band
, 0, sizeof(*Band
));
66 DWORD
CBandSiteBase::GetBandSiteViewMode()
70 /* FIXME: What about DBIF_VIEWMODE_FLOATING and DBIF_VIEWMODE_TRANSPARENT? */
71 dwStyle
= GetWindowLongPtr(fRebarWindow
, GWL_STYLE
);
73 if (dwStyle
& CCS_VERT
)
74 return DBIF_VIEWMODE_VERTICAL
;
76 return DBIF_VIEWMODE_NORMAL
;
79 VOID
CBandSiteBase::BuildRebarBandInfo(struct BandObject
*Band
, REBARBANDINFOW
*prbi
)
81 ZeroMemory(prbi
, sizeof(*prbi
));
82 prbi
->cbSize
= sizeof(*prbi
);
84 prbi
->fMask
= RBBIM_ID
;
85 prbi
->wID
= GetBandID(Band
);
87 if (Band
->dbi
.dwMask
& DBIM_MINSIZE
)
89 prbi
->fMask
|= RBBIM_CHILDSIZE
;
90 prbi
->cxMinChild
= Band
->dbi
.ptMinSize
.x
;
91 prbi
->cyMinChild
= Band
->dbi
.ptMinSize
.y
;
94 if (Band
->dbi
.dwMask
& DBIM_MAXSIZE
)
96 prbi
->fMask
|= RBBIM_CHILDSIZE
;
97 prbi
->cyMaxChild
= Band
->dbi
.ptMaxSize
.y
;
100 if ((Band
->dbi
.dwMask
& (DBIM_INTEGRAL
| DBIM_MODEFLAGS
)) == (DBIM_INTEGRAL
| DBIM_MODEFLAGS
) &&
101 (Band
->dbi
.dwModeFlags
& DBIMF_VARIABLEHEIGHT
))
103 prbi
->fMask
|= RBBIM_CHILDSIZE
;
104 prbi
->cyIntegral
= Band
->dbi
.ptIntegral
.y
;
107 if (Band
->dbi
.dwMask
& DBIM_ACTUAL
)
109 prbi
->fMask
|= RBBIM_IDEALSIZE
| RBBIM_SIZE
| RBBIM_CHILDSIZE
;
110 prbi
->cxIdeal
= Band
->dbi
.ptActual
.x
;
111 prbi
->cx
= Band
->dbi
.ptActual
.x
;
112 prbi
->cyChild
= Band
->dbi
.ptActual
.y
;
115 if (Band
->dbi
.dwMask
& DBIM_TITLE
)
117 prbi
->fMask
|= RBBIM_TEXT
;
118 prbi
->lpText
= Band
->dbi
.wszTitle
;
119 prbi
->cch
= wcslen(Band
->dbi
.wszTitle
);
122 if (Band
->dbi
.dwMask
& DBIM_MODEFLAGS
)
124 prbi
->fMask
|= RBBIM_STYLE
;
126 if (Band
->dbi
.dwModeFlags
& DBIMF_FIXED
)
127 prbi
->fStyle
|= RBBS_FIXEDSIZE
| RBBS_NOGRIPPER
;
128 if (Band
->dbi
.dwModeFlags
& DBIMF_FIXEDBMP
)
129 prbi
->fStyle
|= RBBS_FIXEDBMP
;
130 if (Band
->dbi
.dwModeFlags
& DBIMF_VARIABLEHEIGHT
)
131 prbi
->fStyle
|= RBBS_VARIABLEHEIGHT
;
132 if (Band
->dbi
.dwModeFlags
& DBIMF_DEBOSSED
)
133 prbi
->fStyle
|= RBBS_CHILDEDGE
;
134 if (Band
->dbi
.dwModeFlags
& DBIMF_USECHEVRON
)
135 prbi
->fStyle
|= RBBS_USECHEVRON
;
136 if (Band
->dbi
.dwModeFlags
& DBIMF_BREAK
)
137 prbi
->fStyle
|= RBBS_BREAK
;
138 if (Band
->dbi
.dwModeFlags
& DBIMF_TOPALIGN
)
139 prbi
->fStyle
|= RBBS_TOPALIGN
;
140 if (Band
->dbi
.dwModeFlags
& DBIMF_NOGRIPPER
)
141 prbi
->fStyle
|= RBBS_NOGRIPPER
;
142 if (Band
->dbi
.dwModeFlags
& DBIMF_ALWAYSGRIPPER
)
143 prbi
->fStyle
|= RBBS_GRIPPERALWAYS
;
146 if ((Band
->dbi
.dwMask
& (DBIM_BKCOLOR
| DBIM_MODEFLAGS
)) == (DBIM_BKCOLOR
| DBIM_MODEFLAGS
) &&
147 (Band
->dbi
.dwModeFlags
& DBIMF_BKCOLOR
))
149 prbi
->fMask
|= RBBIM_COLORS
;
150 prbi
->clrFore
= (COLORREF
)(COLOR_WINDOWTEXT
+ 1);
151 prbi
->clrBack
= Band
->dbi
.crBkgnd
;
155 HRESULT
CBandSiteBase::UpdateSingleBand(struct BandObject
*Band
)
162 ZeroMemory(&Band
->dbi
, sizeof(Band
->dbi
));
163 Band
->dbi
.dwMask
= DBIM_MINSIZE
| DBIM_MAXSIZE
| DBIM_INTEGRAL
|
164 DBIM_ACTUAL
| DBIM_TITLE
| DBIM_MODEFLAGS
| DBIM_BKCOLOR
;
166 dwViewMode
= GetBandSiteViewMode();
168 hRet
= Band
->DeskBand
->GetBandInfo((DWORD
)GetBandID(Band
), dwViewMode
, &Band
->dbi
);
171 BuildRebarBandInfo(Band
, &rbi
);
172 if (SUCCEEDED(Band
->OleWindow
->GetWindow(&rbi
.hwndChild
)) &&
173 rbi
.hwndChild
!= NULL
)
175 rbi
.fMask
|= RBBIM_CHILD
;
176 WARN ("ReBar band uses child window 0x%p\n", rbi
.hwndChild
);
179 uBand
= (UINT
)SendMessageW(fRebarWindow
, RB_IDTOINDEX
, (WPARAM
)rbi
.wID
, 0);
180 if (uBand
!= (UINT
)-1)
182 if (!SendMessageW(fRebarWindow
, RB_SETBANDINFOW
, (WPARAM
)uBand
, reinterpret_cast<LPARAM
>(&rbi
)))
184 WARN("Failed to update the rebar band!\n");
188 WARN("Failed to map rebar band id to index!\n");
195 HRESULT
CBandSiteBase::UpdateAllBands()
200 for (i
= 0; i
< fBandsAllocated
; i
++)
202 if (fBands
[i
].DeskBand
!= NULL
)
204 hRet
= UpdateSingleBand(&fBands
[i
]);
205 if (FAILED_UNEXPECTEDLY(hRet
))
213 HRESULT
CBandSiteBase::UpdateBand(DWORD dwBandID
)
215 struct BandObject
*Band
;
217 Band
= GetBandByID(dwBandID
);
221 return UpdateSingleBand(Band
);
224 struct CBandSiteBase::BandObject
*CBandSiteBase::GetBandFromHwnd(HWND hwnd
)
230 for (i
= 0; i
< fBandsAllocated
; i
++)
232 if (fBands
[i
].DeskBand
!= NULL
)
234 ASSERT(fBands
[i
].OleWindow
);
237 hRet
= fBands
[i
].OleWindow
->GetWindow(&hWndBand
);
238 if (SUCCEEDED(hRet
) && hWndBand
== hwnd
)
246 CBandSiteBase::~CBandSiteBase()
249 TRACE("destroying %p\n", this);
251 if (fRebarWindow
!= NULL
)
253 DestroyWindow(fRebarWindow
);
259 for (INT i
= 0; i
< fBandsAllocated
; i
++)
261 if (fBands
[i
].DeskBand
!= NULL
)
262 FreeBand(&fBands
[i
]);
264 CoTaskMemFree(fBands
);
269 HRESULT STDMETHODCALLTYPE
CBandSiteBase::AddBand(IUnknown
*punk
)
272 struct BandObject
*NewBand
= NULL
;
273 CComPtr
<IDeskBand
> DeskBand
;
274 CComPtr
<IObjectWithSite
> ObjWithSite
;
275 CComPtr
<IOleWindow
> OleWindow
;
276 CComPtr
<IWinEventHandler
> WndEvtHandler
;
281 TRACE("(%p, %p)\n", this, punk
);
283 if (punk
== NULL
|| fRebarWindow
== NULL
)
286 hRet
= punk
->QueryInterface(IID_PPV_ARG(IDeskBand
, &DeskBand
));
287 if (!SUCCEEDED(hRet
) || DeskBand
== NULL
)
289 hRet
= punk
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &ObjWithSite
));
290 if (!SUCCEEDED(hRet
) || ObjWithSite
== NULL
)
292 hRet
= punk
->QueryInterface(IID_PPV_ARG(IOleWindow
, &OleWindow
));
293 if (!SUCCEEDED(hRet
) || OleWindow
== NULL
)
295 hRet
= punk
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &WndEvtHandler
));
296 if (!SUCCEEDED(hRet
) || WndEvtHandler
== NULL
)
300 if (fBandsAllocated
> fBandsCount
)
302 /* Search for a free band object */
303 for (INT i
= 0; i
< fBandsAllocated
; i
++)
305 if (fBands
[i
].DeskBand
== NULL
)
307 NewBand
= &fBands
[i
];
312 else if (fBandsAllocated
> 0)
314 ASSERT (fBands
!= NULL
);
316 /* Reallocate the band object array */
317 NewAllocated
= fBandsAllocated
+ 8;
318 if (NewAllocated
> 0xFFFF)
319 NewAllocated
= 0xFFFF;
320 if (NewAllocated
== fBandsAllocated
)
322 hRet
= E_OUTOFMEMORY
;
327 NewBand
= static_cast<struct BandObject
*>(CoTaskMemAlloc(NewAllocated
* sizeof(struct BandObject
)));
330 hRet
= E_OUTOFMEMORY
;
334 /* Copy the old array */
335 memcpy(NewBand
, fBands
, fBandsAllocated
* sizeof(struct BandObject
));
337 /* Initialize the added bands */
338 memset(&NewBand
[fBandsAllocated
], 0, (NewAllocated
- fBandsAllocated
) * sizeof(struct BandObject
));
340 fBandsAllocated
= NewAllocated
;
341 CoTaskMemFree(fBands
);
346 ASSERT(fBands
== NULL
);
347 ASSERT(fBandsAllocated
== 0);
348 ASSERT(fBandsCount
== 0);
350 /* Allocate new array */
351 fBands
= static_cast<struct BandObject
*>(CoTaskMemAlloc(8 * sizeof(struct BandObject
)));
354 hRet
= E_OUTOFMEMORY
;
358 /* Initialize the added bands */
359 memset(fBands
, 0, 8 * sizeof(struct BandObject
));
361 fBandsAllocated
+= 8;
362 NewBand
= &fBands
[0];
367 ASSERT(NewBand
!= NULL
);
370 NewBand
->DeskBand
= DeskBand
.Detach();
371 NewBand
->OleWindow
= OleWindow
.Detach();
372 NewBand
->WndEvtHandler
= WndEvtHandler
.Detach();
374 /* Create the ReBar band */
375 hRet
= ObjWithSite
->SetSite(static_cast<IOleWindow
*>(this));
379 if (SUCCEEDED(UpdateSingleBand(NewBand
)))
381 if (NewBand
->dbi
.dwMask
& DBIM_MODEFLAGS
)
383 if (NewBand
->dbi
.dwModeFlags
& DBIMF_ADDTOFRONT
)
388 BuildRebarBandInfo(NewBand
, &rbi
);
390 if (SUCCEEDED(NewBand
->OleWindow
->GetWindow(&rbi
.hwndChild
)) &&
391 rbi
.hwndChild
!= NULL
)
393 rbi
.fMask
|= RBBIM_CHILD
;
394 WARN ("ReBar band uses child window 0x%p\n", rbi
.hwndChild
);
397 if (!SendMessageW(fRebarWindow
, RB_INSERTBANDW
, (WPARAM
)uBand
, reinterpret_cast<LPARAM
>(&rbi
)))
400 hRet
= (HRESULT
)((USHORT
)GetBandID(NewBand
));
404 WARN("IBandSite::AddBand(): Call to IDeskBand::SetSite() failed: %x\n", hRet
);
406 /* Remove the band from the ReBar control */
407 BuildRebarBandInfo(NewBand
, &rbi
);
408 uBand
= (UINT
)SendMessageW(fRebarWindow
, RB_IDTOINDEX
, (WPARAM
)rbi
.wID
, 0);
409 if (uBand
!= (UINT
)-1)
411 if (!SendMessageW(fRebarWindow
, RB_DELETEBAND
, (WPARAM
)uBand
, 0))
413 ERR("Failed to delete band!\n");
417 ERR("Failed to map band id to index!\n");
429 HRESULT STDMETHODCALLTYPE
CBandSiteBase::EnumBands(UINT uBand
, DWORD
*pdwBandID
)
433 TRACE("(%p, %u, %p)\n", this, uBand
, pdwBandID
);
435 if (uBand
== 0xffffffff)
436 return (UINT
)fBandsCount
;
438 if (uBand
>= (UINT
)fBandsCount
)
441 for (i
= 0; i
< (DWORD
)fBandsAllocated
; i
++)
443 if (fBands
[i
].DeskBand
!= NULL
)
458 HRESULT STDMETHODCALLTYPE
CBandSiteBase::QueryBand(DWORD dwBandID
, IDeskBand
**ppstb
,
459 DWORD
*pdwState
, LPWSTR pszName
, int cchName
)
461 struct BandObject
*Band
;
463 TRACE("(%p, %u, %p, %p, %p, %d)\n", this, dwBandID
, ppstb
, pdwState
, pszName
, cchName
);
465 Band
= GetBandByID(dwBandID
);
471 Band
->DeskBand
->AddRef();
472 *ppstb
= Band
->DeskBand
;
475 if (pdwState
!= NULL
)
477 FIXME("IBandSite::QueryBand() requests band state!\n");
481 if (pszName
!= NULL
&& cchName
> 0)
483 FIXME("IBandSite::QueryBand() requests band name!\n");
489 HRESULT STDMETHODCALLTYPE
CBandSiteBase::SetBandState(DWORD dwBandID
, DWORD dwMask
, DWORD dwState
)
491 struct BandObject
*Band
;
493 TRACE("(%p, %u, %x, %x)\n", this, dwBandID
, dwMask
, dwState
);
495 Band
= GetBandByID(dwBandID
);
503 HRESULT STDMETHODCALLTYPE
CBandSiteBase::RemoveBand(DWORD dwBandID
)
505 struct BandObject
*Band
;
508 TRACE("(%p, %u)\n", this, dwBandID
);
510 if (fRebarWindow
== NULL
)
513 Band
= GetBandByID(dwBandID
);
517 uBand
= (UINT
)SendMessageW(fRebarWindow
, RB_IDTOINDEX
, (WPARAM
)GetBandID(Band
), 0);
518 if (uBand
!= (UINT
)-1)
520 if (!SendMessageW(fRebarWindow
, RB_DELETEBAND
, (WPARAM
)uBand
, 0))
522 ERR("Could not delete band!\n");
526 ERR("Could not map band id to index!\n");
532 HRESULT STDMETHODCALLTYPE
CBandSiteBase::GetBandObject(DWORD dwBandID
, REFIID riid
, VOID
**ppv
)
534 struct BandObject
*Band
;
536 TRACE("(%p, %u, %s, %p)\n", this, dwBandID
, debugstr_guid(&riid
), ppv
);
538 Band
= GetBandByID(dwBandID
);
545 return Band
->DeskBand
->QueryInterface(riid
, ppv
);
548 HRESULT STDMETHODCALLTYPE
CBandSiteBase::SetBandSiteInfo(const BANDSITEINFO
*pbsinfo
)
550 FIXME("(%p, %p)\n", this, pbsinfo
);
554 HRESULT STDMETHODCALLTYPE
CBandSiteBase::GetBandSiteInfo(BANDSITEINFO
*pbsinfo
)
556 FIXME("(%p, %p)\n", this, pbsinfo
);
560 HRESULT STDMETHODCALLTYPE
CBandSiteBase::OnWinEvent(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*plrResult
)
562 struct BandObject
*Band
;
564 TRACE("(%p, %p, %u, %p, %p, %p)\n", this, hWnd
, uMsg
, wParam
, lParam
, plrResult
);
567 if (fRebarWindow
== NULL
)
570 if (hWnd
== fRebarWindow
)
572 /* FIXME: Just send the message? */
573 *plrResult
= SendMessageW(hWnd
, uMsg
, wParam
, lParam
);
577 Band
= GetBandFromHwnd(hWnd
);
580 return Band
->WndEvtHandler
->OnWinEvent(hWnd
, uMsg
, wParam
, lParam
, plrResult
);
586 HRESULT STDMETHODCALLTYPE
CBandSiteBase::IsWindowOwner(HWND hWnd
)
588 struct BandObject
*Band
;
590 TRACE("(%p, %p)\n", this, hWnd
);
592 if (fRebarWindow
== NULL
)
595 Band
= GetBandFromHwnd(hWnd
);
602 HRESULT STDMETHODCALLTYPE
CBandSiteBase::GetWindow(HWND
*phWnd
)
604 TRACE("(%p, %p)\n", this, phWnd
);
606 *phWnd
= fRebarWindow
;
607 if (fRebarWindow
!= NULL
)
613 HRESULT STDMETHODCALLTYPE
CBandSiteBase::ContextSensitiveHelp(BOOL fEnterMode
)
615 FIXME("(%p, %d)\n", this, fEnterMode
);
619 HRESULT STDMETHODCALLTYPE
CBandSiteBase::SetDeskBarSite(IUnknown
*pUnk
)
625 TRACE("(%p, %p)\n", this, pUnk
);
627 fOleWindow
.Release();
629 hRet
= pUnk
->QueryInterface(IID_PPV_ARG(IOleWindow
, &fOleWindow
));
630 if (FAILED_UNEXPECTEDLY(hRet
))
633 hRet
= fOleWindow
->GetWindow(&hWndParent
);
634 if (FAILED_UNEXPECTEDLY(hRet
))
637 style
= WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
| RBS_VARHEIGHT
| RBS_AUTOSIZE
|
638 RBS_BANDBORDERS
| CCS_NODIVIDER
| CCS_NORESIZE
| CCS_NOPARENTALIGN
;
640 fRebarWindow
= CreateWindowExW(WS_EX_TOOLWINDOW
,
647 _AtlBaseModule
.GetModuleInstance(),
649 if (fRebarWindow
== NULL
)
651 fOleWindow
.Release();
652 WARN("IDeskbarClient::SetDeskBarSite() failed to create ReBar control!\n");
659 HRESULT STDMETHODCALLTYPE
CBandSiteBase::SetModeDBC(DWORD dwMode
)
664 TRACE("(%p, %x)\n", this, dwMode
);
666 if (fRebarWindow
== NULL
)
669 dwStyle
= dwPrevStyle
= GetWindowLongPtr(fRebarWindow
, GWL_STYLE
);
670 if (dwMode
& DBIF_VIEWMODE_VERTICAL
)
673 if (dwMode
& ~DBIF_VIEWMODE_VERTICAL
)
674 FIXME("IDeskBarClient::SetModeDBC() unhandled modes: %x\n", dwStyle
& ~DBIF_VIEWMODE_VERTICAL
);
676 if (dwStyle
!= dwPrevStyle
)
678 SetWindowLongPtr(fRebarWindow
, GWL_STYLE
, dwPrevStyle
);
684 HRESULT STDMETHODCALLTYPE
CBandSiteBase::UIActivateDBC(DWORD dwState
)
686 TRACE("(%p, %x)\n", this, dwState
);
688 if (fRebarWindow
== NULL
)
691 ShowWindow(fRebarWindow
, (dwState
& DBC_SHOW
) ? SW_SHOW
: SW_HIDE
);
692 FIXME("IDeskBarClient::UIActivateDBC() Properly notify bands?\n");
696 HRESULT STDMETHODCALLTYPE
CBandSiteBase::GetSize(DWORD unknown1
, LPRECT unknown2
)
698 FIXME("(%p, %x, %p)\n", this, unknown1
, unknown2
);
702 HRESULT STDMETHODCALLTYPE
CBandSiteBase::QueryStatus(const GUID
*pguidCmdGroup
,
703 DWORD cCmds
, OLECMD
*prgCmds
, OLECMDTEXT
*pCmdText
)
705 FIXME("(%p, %p, %u, %p, %p)\n", this, pguidCmdGroup
, cCmds
, prgCmds
, pCmdText
);
709 HRESULT STDMETHODCALLTYPE
CBandSiteBase::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
710 DWORD nCmdExecOpt
, VARIANTARG
*pvaIn
, VARIANTARG
*pvaOut
)
714 TRACE("(%p, %p, %u, %u, %p, %p)\n", this, pguidCmdGroup
, nCmdID
, nCmdExecOpt
, pvaIn
, pvaOut
);
716 if (fRebarWindow
== NULL
)
719 if (IsEqualIID(*pguidCmdGroup
, IID_IDeskBand
))
723 case DBID_BANDINFOCHANGED
:
725 hRet
= UpdateAllBands();
728 /* Update a single band */
729 if (pvaIn
->n1
.n2
.vt
== VT_I4
)
730 hRet
= UpdateBand(pvaIn
->n1
.n2
.n3
.lVal
);
737 case DBID_MAXIMIZEBAND
:
738 case DBID_PUSHCHEVRON
:
739 FIXME("IOleCommandTarget::Exec(): Unsupported command ID %d\n", nCmdID
);
747 WARN("IOleCommandTarget::Exec(): Unsupported command group GUID\n");
752 HRESULT STDMETHODCALLTYPE
CBandSiteBase::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
757 HRESULT STDMETHODCALLTYPE
CBandSiteBase::HasFocusIO()
762 HRESULT STDMETHODCALLTYPE
CBandSiteBase::TranslateAcceleratorIO(LPMSG lpMsg
)
767 HRESULT STDMETHODCALLTYPE
CBandSiteBase::OnFocusChangeIS(struct IUnknown
*paramC
, int param10
)
772 HRESULT STDMETHODCALLTYPE
CBandSiteBase::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
777 HRESULT STDMETHODCALLTYPE
CBandSiteBase::GetClassID(CLSID
*pClassID
)
782 HRESULT STDMETHODCALLTYPE
CBandSiteBase::IsDirty()
787 HRESULT STDMETHODCALLTYPE
CBandSiteBase::Load(IStream
*pStm
)
792 HRESULT STDMETHODCALLTYPE
CBandSiteBase::Save(IStream
*pStm
, BOOL fClearDirty
)
797 HRESULT STDMETHODCALLTYPE
CBandSiteBase::GetSizeMax(ULARGE_INTEGER
*pcbSize
)
802 HRESULT STDMETHODCALLTYPE
CBandSiteBase::DragEnter(
803 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
808 HRESULT STDMETHODCALLTYPE
CBandSiteBase::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
813 HRESULT STDMETHODCALLTYPE
CBandSiteBase::DragLeave()
818 HRESULT STDMETHODCALLTYPE
CBandSiteBase::Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
823 HRESULT STDMETHODCALLTYPE
CBandSiteBase::LoadFromStreamBS(IStream
*, const GUID
&, void **)
828 HRESULT STDMETHODCALLTYPE
CBandSiteBase::SaveToStreamBS(IUnknown
*, IStream
*)
834 HRESULT WINAPI
CBandSite_CreateInstance(REFIID riid
, void **ppv
)
836 return ShellObjectCreator
<CBandSite
>(riid
, ppv
);