小编给大家分享一下DeskBand实现之SdkDeskBandObject.cpp文件有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
SdkDeskBandObject.cpp文件
说明:这是Desk Band最核心的类,它主要完成Band对象的创建,销毁,窗体创建,关闭,显示等。当创建空上对象时,一定要把当前DLL的引用计数加1,对象析构时,DLL的引用计数要减1。
#define _DEFINE_GLOBAL_VARIABLES
#include "SdkDeskBandDef.h"
#include "SdkDeskBandObject.h"
SdkDeskBandObject::SdkDeskBandObject(void)
{
m_lRefCount = 1;
m_dwBandID = 0;
m_fHasFocus = FALSE;
m_fIsDirty = FALSE;
m_dwViewMode = DBIF_VIEWMODE_NORMAL;
m_pInputObjSite = NULL;
m_pDeskBandWin = NULL;
m_fCompositionEnabled = FALSE;
// Add the reference count of dll.
// This is a global variable defined in SdkDeskBandDef.h file
InterlockedIncrement(&g_lDllRefCount);
}
//////////////////////////////////////////////////////////////////////////
SdkDeskBandObject::~SdkDeskBandObject(void)
{
// Subtract the reference count of dll.
// This is a global variable defined in SdkDeskBandDef.h file
InterlockedDecrement(&g_lDllRefCount);
SAFE_DELETE(m_pDeskBandWin);
SAFE_RELEASE(m_pInputObjSite);
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP SdkDeskBandObject::QueryInterface(REFIID riid, void** ppv)
{
static const QITAB qit[] =
{
QITABENT(SdkDeskBandObject, IDeskBand),
QITABENT(SdkDeskBandObject, IDeskBand2),
QITABENT(SdkDeskBandObject, IDockingWindow),
QITABENT(SdkDeskBandObject, IPersist),
QITABENT(SdkDeskBandObject, IPersistStream),
QITABENT(SdkDeskBandObject, IInputObject),
QITABENT(SdkDeskBandObject, IOleWindow),
QITABENT(SdkDeskBandObject, IObjectWithSite),
{ 0 },
};
return QISearch(this, qit, riid, ppv);
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG) SdkDeskBandObject::AddRef()
{
return InterlockedIncrement(&m_lRefCount);
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG) SdkDeskBandObject::Release()
{
ULONG lRef = InterlockedDecrement(&m_lRefCount);
if ( 0 == lRef )
{
delete this;
}
return lRef;
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP SdkDeskBandObject::GetWindow(HWND *phwnd)
{
if ( NULL == phwnd )
{
return E_INVALIDARG;
}
if ( NULL != m_pDeskBandWin )
{
*phwnd = m_pDeskBandWin->GetDeskBandHandle();
}
return S_OK;
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP SdkDeskBandObject::ContextSensitiveHelp(BOOL fEnterMode)
{
UNREFERENCED_PARAMETER(fEnterMode);
return E_NOTIMPL;
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP SdkDeskBandObject::ShowDW(BOOL fShow)
{
if ( NULL != m_pDeskBandWin )
{
m_pDeskBandWin->ShowDeskBand(fShow);
}
return S_OK;
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP SdkDeskBandObject::CloseDW(DWORD dwReserved)
{
UNREFERENCED_PARAMETER(dwReserved);
if ( NULL != m_pDeskBandWin )
{
m_pDeskBandWin->CloseDeskBand();
}
return S_OK;
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP SdkDeskBandObject::ResizeBorderDW(LPCRECT prcBorder,
IUnknown *punkToolbarSite, BOOL fReserved)
{
UNREFERENCED_PARAMETER(prcBorder);
UNREFERENCED_PARAMETER(punkToolbarSite);
UNREFERENCED_PARAMETER(fReserved);
return E_NOTIMPL;
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP SdkDeskBandObject::GetBandInfo(DWORD dwBandID,
DWORD dwViewMode, DESKBANDINFO *pdbi)
{
if ( NULL == pdbi )
{
return E_INVALIDARG;
}
m_dwBandID = dwBandID;
m_dwViewMode = dwViewMode;
SIZE deskBandSize = m_pDeskBandWin->GetDeskBandMinSize(
(DBIF_VIEWMODE_VERTICAL == dwViewMode) ? FALSE : TRUE );
POINTL ptMinSize = { deskBandSize.cx, deskBandSize.cy };
POINTL ptActual = { deskBandSize.cx, deskBandSize.cy };
if ( pdbi->dwMask & DBIM_MINSIZE )
{
pdbi->ptMinSize = ptMinSize;
}
if ( pdbi->dwMask & DBIM_ACTUAL )
{
pdbi->ptActual = ptActual;
}
if ( pdbi->dwMask & DBIM_MAXSIZE )
{
// There is no limit for the maximum height.
pdbi->ptMaxSize.y = -1;
}
if ( pdbi->dwMask & DBIM_INTEGRAL )
{
// The sizing step value of the band object.
pdbi->ptIntegral.y = 1;
}
if ( pdbi->dwMask & DBIM_TITLE )
{
// Do NOT show the title by removing the flag.
pdbi->dwMask &= ~DBIM_TITLE;
}
if ( pdbi->dwMask & DBIM_MODEFLAGS )
{
pdbi->dwModeFlags = DBIMF_NORMAL | DBIMF_VARIABLEHEIGHT;
}
if ( pdbi->dwMask & DBIM_BKCOLOR )
{
// Use the default background color by removing this flag.
pdbi->dwMask &= ~DBIM_BKCOLOR;
}
return S_OK;
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP SdkDeskBandObject::CanRenderComposited(BOOL *pfCanRenderComposited)
{
if ( NULL == pfCanRenderComposited )
{
return E_INVALIDARG;
}
*pfCanRenderComposited = TRUE;
return S_OK;
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP SdkDeskBandObject::SetCompositionState(BOOL fCompositionEnabled)
{
m_fCompositionEnabled = fCompositionEnabled;
if ( NULL != m_pDeskBandWin )
{
m_pDeskBandWin->RefreshDeskBand();
}
return S_OK;
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP SdkDeskBandObject::GetCompositionState(BOOL *pfCompositionEnabled)
{
if ( NULL == pfCompositionEnabled )
{
return E_INVALIDARG;
}
*pfCompositionEnabled = m_fCompositionEnabled;
return S_OK;
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP SdkDeskBandObject::GetClassID(CLSID *pclsid)
{
if ( NULL == pclsid )
{
return E_INVALIDARG;
}
*pclsid = CLSID_SdkDeskBand;
return S_OK;
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP SdkDeskBandObject::IsDirty()
{
return (TRUE == m_fIsDirty) ? S_OK : S_FALSE;
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP SdkDeskBandObject::Load(IStream *pStm)
{
UNREFERENCED_PARAMETER(pStm);
return E_NOTIMPL;
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP SdkDeskBandObject::Save(IStream *pStm, BOOL fClearDirty)
{
UNREFERENCED_PARAMETER(pStm);
if ( TRUE == fClearDirty )
{
m_fIsDirty = FALSE;
}
return E_NOTIMPL;
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP SdkDeskBandObject::GetSizeMax(ULARGE_INTEGER *pcbSize)
{
UNREFERENCED_PARAMETER(pcbSize);
return E_NOTIMPL;
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP SdkDeskBandObject::SetSite(IUnknown *pUnkSite)
{
SAFE_RELEASE(m_pInputObjSite);
if ( NULL == pUnkSite )
{
return S_OK;
}
IOleWindow *pOleWindow = NULL;
HRESULT hr = pUnkSite->QueryInterface(IID_PPV_ARGS(&pOleWindow));
if ( SUCCEEDED(hr) )
{
HWND hParentWnd = NULL;
hr = pOleWindow->GetWindow(&hParentWnd);
if ( SUCCEEDED(hr) )
{
// Create the desk band window.
if ( NULL != m_pDeskBandWin )
{
// g_hDllInst is a global variable to
// indicate instance of current dll defined
// in SdkDeskBanddef.h file.
m_pDeskBandWin->CreateDeskBand(hParentWnd, g_hDllInst, this);
}
}
hr = pUnkSite->QueryInterface(IID_PPV_ARGS(&m_pInputObjSite));
}
SAFE_RELEASE(pOleWindow);
return hr;
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP SdkDeskBandObject::GetSite(REFIID riid, void **ppv)
{
if ( NULL == ppv )
{
return E_INVALIDARG;
}
HRESULT hr = E_FAIL;
if ( NULL == m_pInputObjSite )
{
*ppv = NULL;
}
else
{
hr = m_pInputObjSite->QueryInterface(riid, ppv);
}
return hr;
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP SdkDeskBandObject::UIActivateIO(BOOL fActivate, MSG *pMsg)
{
UNREFERENCED_PARAMETER(pMsg);
if ( TRUE == fActivate )
{
if ( NULL != m_pDeskBandWin )
{
SetFocus(m_pDeskBandWin->GetDeskBandHandle());
}
}
return S_OK;
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP SdkDeskBandObject::HasFocusIO()
{
return (TRUE == m_fHasFocus) ? S_OK : S_FALSE;
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP SdkDeskBandObject::TranslateAcceleratorIO(MSG *pMsg)
{
UNREFERENCED_PARAMETER(pMsg);
return S_FALSE;
}
//////////////////////////////////////////////////////////////////////////
BOOL SdkDeskBandObject::OnSetFocus(BOOL fSetFocus)
{
if ( NULL == m_pInputObjSite )
{
return FALSE;
}
m_fHasFocus = fSetFocus;
HRESULT hr = m_pInputObjSite->OnFocusChangeIS(
static_cast<IOleWindow*>(this), fSetFocus);
return SUCCEEDED(hr) ? TRUE : FALSE;
}
//////////////////////////////////////////////////////////////////////////
BOOL SdkDeskBandObject::IsVerticalViewMode()
{
return (DBIF_VIEWMODE_VERTICAL == m_dwViewMode) ? TRUE : FALSE;
}
SdkClassFactory.cpp文件
说明:这个类用于创建Band对象,在其CreateInstance方法里面,就要创建出Band对象,它由DllGetClassObject函数调用。
SdkClassFactory::SdkClassFactory(void)
{
m_lRefCount = 1;
// Add the reference count of dll. This is a global
// variable defined in SdkDeskBandDef.h file
InterlockedIncrement(&g_lDllRefCount);
}
//////////////////////////////////////////////////////////////////////////
SdkClassFactory::~SdkClassFactory(void)
{
// Subtract the reference count of dll. This is a global
// variable defined in SdkDeskBandDef.h file
InterlockedDecrement(&g_lDllRefCount);
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP SdkClassFactory::QueryInterface(REFIID riid, void **ppv)
{
static const QITAB qit[] =
{
QITABENT(SdkClassFactory, IUnknown),
QITABENT(SdkClassFactory, IClassFactory),
{ 0 },
};
return QISearch(this, qit, riid, ppv);
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG) SdkClassFactory::AddRef()
{
return InterlockedIncrement(&m_lRefCount);
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG) SdkClassFactory::Release()
{
ULONG lRef = InterlockedDecrement(&m_lRefCount);
if ( 0 == lRef )
{
delete this;
}
return m_lRefCount;
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP SdkClassFactory::CreateInstance(
IUnknown *pUnkOuter, REFIID riid, void **ppv)
{
HRESULT hr = CLASS_E_NOAGGREGATION;
if ( NULL == pUnkOuter )
{
hr = E_OUTOFMEMORY;
SdkDeskBandObject *pDeskBand = new SdkDeskBandObject();
if ( NULL != pDeskBand )
{
hr = pDeskBand->QueryInterface(riid, ppv);
}
SAFE_RELEASE(pDeskBand);
}
return hr;
}
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP SdkClassFactory::LockServer(BOOL fLock)
{
if ( TRUE == fLock )
{
// Add the reference count of dll. This is a
// global variable defined in SdkDeskBandDef.h file.
InterlockedIncrement(&g_lDllRefCount);
}
else
{
// Subtract the reference count of dll. This is
// a global variable defined in SdkDeskBandDef.h file.
InterlockedDecrement(&g_lDllRefCount);
}
return S_OK;
}
以上是“DeskBand实现之SdkDeskBandObject.cpp文件有什么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://www.xuebuyuan.com/3254048.html