📄 dsofcontrol.cpp
字号:
*ppv = (IObjectSafety*)&(pThis->m_xObjectSafety);
}
else
{
*ppv = NULL;
hr = E_NOINTERFACE;
}
if (NULL != *ppv) // AddRef those interfaces we will return...
((IUnknown*)(*ppv))->AddRef();
return hr;
}
STDMETHODIMP_(ULONG) CDsoFramerControl::XInternalUnknown::AddRef(void)
{
METHOD_PROLOGUE(CDsoFramerControl, InternalUnknown);
//TRACE1("CDsoFramerControl::InternalAddRef - %d\n", (pThis->m_cRef + 1));
return ++(pThis->m_cRef);
}
STDMETHODIMP_(ULONG) CDsoFramerControl::XInternalUnknown::Release(void)
{
METHOD_PROLOGUE(CDsoFramerControl, InternalUnknown);
//TRACE1("CDsoFramerControl::InternalRelease - %d\n", (pThis->m_cRef - 1));
if (0 != --(pThis->m_cRef)) return (pThis->m_cRef);
ODS("CDsoFramerControl delete\n");
InterlockedDecrement((LPLONG)&v_cLocks);
delete pThis; return 0;
}
////////////////////////////////////////////////////////////////////////
//
// CDsoFramerControl::XPersistStreamInit -- IPersistStreamInit Implementation
//
// STDMETHODIMP GetClassID(CLSID *pClassID);
// STDMETHODIMP IsDirty(void);
// STDMETHODIMP Load(LPSTREAM pStm);
// STDMETHODIMP Save(LPSTREAM pStm, BOOL fClearDirty);
// STDMETHODIMP GetSizeMax(ULARGE_INTEGER* pcbSize);
// STDMETHODIMP InitNew(void);
//
IMPLEMENT_INTERFACE_UNKNOWN(CDsoFramerControl, PersistStreamInit)
STDMETHODIMP CDsoFramerControl::XPersistStreamInit::GetClassID(CLSID *pClassID)
{
ODS("CDsoFramerControl::XPersistStreamInit::GetClassID\n");
if (pClassID) *pClassID = CLSID_FramerControl;
return S_OK;
}
STDMETHODIMP CDsoFramerControl::XPersistStreamInit::IsDirty(void)
{
METHOD_PROLOGUE(CDsoFramerControl, PersistStreamInit);
ODS("CDsoFramerControl::XPersistStreamInit::IsDirty\n");
return (pThis->m_fDirty) ? S_OK : S_FALSE;
}
#define STREAMHDR_SIGNATURE 0x1234ABCD // Signature to identify our format (avoid crashes!)
STDMETHODIMP CDsoFramerControl::XPersistStreamInit::Load(LPSTREAM pStm)
{
HRESULT hr;
DWORD dwSig, dwT;
METHOD_PROLOGUE(CDsoFramerControl, PersistStreamInit);
ODS("CDsoFramerControl::XPersistStreamInit::Load\n");
// look for our header structure, so we can verify stream validity.
hr = pStm->Read(&dwSig, sizeof(DWORD), NULL);
RETURN_ON_FAILURE(hr);
if (dwSig != STREAMHDR_SIGNATURE)
return E_UNEXPECTED;
// we like the stream. let's go load in our two properties.
hr = pStm->Read(&(pThis->m_Size), sizeof(SIZEL), NULL);
RETURN_ON_FAILURE(hr);
DsoHimetricToPixels(&(pThis->m_Size.cx), &(pThis->m_Size.cy));
hr = pStm->Read(&(pThis->m_clrBorderColor), sizeof(OLE_COLOR), NULL);
RETURN_ON_FAILURE(hr);
hr = pStm->Read(&(pThis->m_clrBackColor), sizeof(OLE_COLOR), NULL);
RETURN_ON_FAILURE(hr);
hr = pStm->Read(&(pThis->m_clrForeColor), sizeof(OLE_COLOR), NULL);
RETURN_ON_FAILURE(hr);
hr = pStm->Read(&(pThis->m_clrTBarColor), sizeof(OLE_COLOR), NULL);
RETURN_ON_FAILURE(hr);
hr = pStm->Read(&(pThis->m_clrTBarTextColor), sizeof(OLE_COLOR), NULL);
RETURN_ON_FAILURE(hr);
hr = pStm->Read(&dwT, sizeof(DWORD), NULL);
RETURN_ON_FAILURE(hr);
pThis->m_fBorderStyle = LOBYTE(LOWORD(dwT));
pThis->m_fShowMenuBar = HIBYTE(LOWORD(dwT));
pThis->m_fShowToolbars = LOBYTE(HIWORD(dwT));
pThis->m_fShowTitlebar = HIBYTE(HIWORD(dwT));
hr = pStm->Read(&dwT, sizeof(DWORD), NULL);
RETURN_ON_FAILURE(hr);
if (dwT)
{
LPWSTR pwsz = (LPWSTR)DsoMemAlloc(dwT+2);
if (pwsz)
{
hr = pStm->Read(pwsz, dwT, NULL);
if (SUCCEEDED(hr))
pThis->m_bstrCustomCaption = SysAllocString(pwsz);
}
DsoMemFree(pwsz);
}
return S_OK;
}
STDMETHODIMP CDsoFramerControl::XPersistStreamInit::Save(LPSTREAM pStm, BOOL fClearDirty)
{
HRESULT hr;
DWORD dwT, dwSig = STREAMHDR_SIGNATURE;
SIZEL slSize;
METHOD_PROLOGUE(CDsoFramerControl, PersistStreamInit);
ODS("CDsoFramerControl::XPersistStreamInit::Save\n");
// first thing to do is write out our stream sig...
hr = pStm->Write(&dwSig, sizeof(DWORD), NULL);
RETURN_ON_FAILURE(hr);
// the only properties we're currently persisting here are the size
// properties for this control. make sure we do that in HiMetric
slSize = pThis->m_Size;
DsoPixelsToHimetric(&(slSize.cx), &(slSize.cy));
hr = pStm->Write(&slSize, sizeof(SIZEL), NULL);
RETURN_ON_FAILURE(hr);
hr = pStm->Write(&(pThis->m_clrBorderColor), sizeof(OLE_COLOR), NULL);
RETURN_ON_FAILURE(hr);
hr = pStm->Write(&(pThis->m_clrBackColor), sizeof(OLE_COLOR), NULL);
RETURN_ON_FAILURE(hr);
hr = pStm->Write(&(pThis->m_clrForeColor), sizeof(OLE_COLOR), NULL);
RETURN_ON_FAILURE(hr);
hr = pStm->Write(&(pThis->m_clrTBarColor), sizeof(OLE_COLOR), NULL);
RETURN_ON_FAILURE(hr);
hr = pStm->Write(&(pThis->m_clrTBarTextColor), sizeof(OLE_COLOR), NULL);
RETURN_ON_FAILURE(hr);
dwT = (DWORD)MAKELONG(
MAKEWORD((BYTE)(pThis->m_fBorderStyle), (BYTE)(pThis->m_fShowMenuBar)),
MAKEWORD((BYTE)(pThis->m_fShowToolbars), (BYTE)(pThis->m_fShowTitlebar)));
hr = pStm->Write(&dwT, sizeof(DWORD), NULL);
RETURN_ON_FAILURE(hr);
dwT = 0;
if (pThis->m_bstrCustomCaption)
dwT = SysStringByteLen(pThis->m_bstrCustomCaption);
hr = pStm->Write(&dwT, sizeof(DWORD), NULL);
RETURN_ON_FAILURE(hr);
if (dwT)
{
hr = pStm->Write(pThis->m_bstrCustomCaption, dwT, NULL);
RETURN_ON_FAILURE(hr);
}
// clear out dirty flag and notify that we're done with save.
if (fClearDirty)
pThis->m_fDirty = FALSE;
if (pThis->m_pOleAdviseHolder)
pThis->m_pOleAdviseHolder->SendOnSave();
return S_OK;
}
STDMETHODIMP CDsoFramerControl::XPersistStreamInit::GetSizeMax(ULARGE_INTEGER *pcbSize)
{
ODS("CDsoFramerControl::XPersistStreamInit::GetSizeMax\n");
return E_NOTIMPL;
}
STDMETHODIMP CDsoFramerControl::XPersistStreamInit::InitNew(void)
{
METHOD_PROLOGUE(CDsoFramerControl, PersistStreamInit);
ODS("CDsoFramerControl::XPersistStreamInit::InitNew\n");
// If we are new control, we are dirty by default...
pThis->m_fDirty = TRUE;
return S_OK;
}
////////////////////////////////////////////////////////////////////////
//
// CDsoFramerControl::XPersistPropertyBag -- IPersistPropertyBag Implementation
//
// STDMETHODIMP GetClassID(CLSID *pClassID);
// STDMETHODIMP InitNew();
// STDMETHODIMP Load(IPropertyBag* pPropBag, IErrorLog* pErrorLog);
// STDMETHODIMP Save(IPropertyBag* pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties);
//
IMPLEMENT_INTERFACE_UNKNOWN(CDsoFramerControl, PersistPropertyBag)
STDMETHODIMP CDsoFramerControl::XPersistPropertyBag::GetClassID(CLSID *pClassID)
{
ODS("CDsoFramerControl::XPersistPropertyBag::GetClassID\n");
if (pClassID) *pClassID = CLSID_FramerControl;
return S_OK;
}
STDMETHODIMP CDsoFramerControl::XPersistPropertyBag::InitNew()
{
METHOD_PROLOGUE(CDsoFramerControl, PersistPropertyBag);
ODS("CDsoFramerControl::XPersistPropertyBag::InitNew\n");
return pThis->m_xPersistStreamInit.InitNew();
}
STDMETHODIMP CDsoFramerControl::XPersistPropertyBag::Load(IPropertyBag* pPropBag, IErrorLog* pErrorLog)
{
VARIANT v;
HRESULT hr;
SIZEL sl = {5000, 3000};
METHOD_PROLOGUE(CDsoFramerControl, PersistPropertyBag);
ODS("CDsoFramerControl::XPersistPropertyBag::Load\n");
v.vt = VT_I4;
v.lVal = 0;
hr = pPropBag->Read(L"_ExtentX", &v, pErrorLog);
if (SUCCEEDED(hr)){sl.cx = v.lVal;}
v.lVal = 0;
hr = pPropBag->Read(L"_ExtentY", &v, pErrorLog);
if (SUCCEEDED(hr)){sl.cy = v.lVal;}
DsoHimetricToPixels(&(sl.cx), &(sl.cy));
pThis->m_Size = sl;
hr = pPropBag->Read(L"Titlebar", &v, pErrorLog);
if (SUCCEEDED(hr)){pThis->m_fShowTitlebar = v.boolVal;}
hr = pPropBag->Read(L"Toolbars", &v, pErrorLog);
if (SUCCEEDED(hr)){pThis->m_fShowToolbars = v.boolVal;}
hr = pPropBag->Read(L"BorderStyle", &v, pErrorLog);
if (SUCCEEDED(hr)){pThis->m_fBorderStyle = v.lVal;}
hr = pPropBag->Read(L"BorderColor", &v, pErrorLog);
if (SUCCEEDED(hr)){pThis->m_clrBorderColor = v.lVal;}
hr = pPropBag->Read(L"BackColor", &v, pErrorLog);
if (SUCCEEDED(hr)){pThis->m_clrBackColor = v.lVal;}
hr = pPropBag->Read(L"ForeColor", &v, pErrorLog);
if (SUCCEEDED(hr)){pThis->m_clrForeColor = v.lVal;}
hr = pPropBag->Read(L"TitlebarColor", &v, pErrorLog);
if (SUCCEEDED(hr)){pThis->m_clrTBarColor = v.lVal;}
hr = pPropBag->Read(L"TitlebarTextColor", &v, pErrorLog);
if (SUCCEEDED(hr)){pThis->m_clrTBarTextColor = v.lVal;}
hr = pPropBag->Read(L"Caption", &v, pErrorLog);
if (SUCCEEDED(hr))
{
LPWSTR pwsz = LPWSTR_FROM_VARIANT(v);
if (pwsz) pThis->m_bstrCustomCaption = SysAllocString(pwsz);
VariantClear(&v);
}
pThis->m_fShowMenuBar = FALSE;
hr = pPropBag->Read(L"Menubar", &v, pErrorLog);
if (SUCCEEDED(hr)){pThis->m_fShowMenuBar = v.boolVal;}
return S_OK;
}
STDMETHODIMP CDsoFramerControl::XPersistPropertyBag::Save(IPropertyBag* pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties)
{
HRESULT hr;
VARIANT v;
SIZEL sl;
METHOD_PROLOGUE(CDsoFramerControl, PersistPropertyBag);
ODS("CDsoFramerControl::XPersistPropertyBag::Save\n");
sl = pThis->m_Size;
DsoPixelsToHimetric(&(sl.cx), &(sl.cy));
v.vt = VT_I4; v.lVal = sl.cx;
hr = pPropBag->Write(L"_ExtentX", &v);
RETURN_ON_FAILURE(hr);
v.lVal = sl.cy;
hr = pPropBag->Write(L"_ExtentY", &v);
RETURN_ON_FAILURE(hr);
v.lVal = pThis->m_clrBorderColor;
hr = pPropBag->Write(L"BorderColor", &v);
RETURN_ON_FAILURE(hr);
v.lVal = pThis->m_clrBackColor;
hr = pPropBag->Write(L"BackColor", &v);
RETURN_ON_FAILURE(hr);
v.lVal = pThis->m_clrForeColor;
hr = pPropBag->Write(L"ForeColor", &v);
RETURN_ON_FAILURE(hr);
v.lVal = pThis->m_clrTBarColor;
hr = pPropBag->Write(L"TitlebarColor", &v);
RETURN_ON_FAILURE(hr);
v.lVal = pThis->m_clrTBarTextColor;
hr = pPropBag->Write(L"TitlebarTextColor", &v);
RETURN_ON_FAILURE(hr);
v.lVal = pThis->m_fBorderStyle;
hr = pPropBag->Write(L"BorderStyle", &v);
RETURN_ON_FAILURE(hr);
v.vt = VT_BOOL;
v.boolVal = pThis->m_fShowTitlebar;
hr = pPropBag->Write(L"Titlebar", &v);
RETURN_ON_FAILURE(hr);
v.boolVal = pThis->m_fShowToolbars;
hr = pPropBag->Write(L"Toolbars", &v);
RETURN_ON_FAILURE(hr);
if (pThis->m_bstrCustomCaption)
{
v.vt = VT_BSTR;
v.bstrVal = pThis->m_bstrCustomCaption;
hr = pPropBag->Write(L"Caption", &v);
RETURN_ON_FAILURE(hr);
}
v.boolVal = pThis->m_fShowMenuBar;
hr = pPropBag->Write(L"Menubar", &v);
RETURN_ON_FAILURE(hr);
// now clear the dirty flag and send out notification
// that we're done.
if (fClearDirty)
pThis->m_fDirty = FALSE;
if (pThis->m_pOleAdviseHolder)
pThis->m_pOleAdviseHolder->SendOnSave();
return S_OK;
}
////////////////////////////////////////////////////////////////////////
//
// CDsoFramerControl::XPersistStorage -- IPersistStorage Implementation
//
// STDMETHODIMP GetClassID(CLSID *pClassID);
// STDMETHODIMP IsDirty(void);
// STDMETHODIMP InitNew(LPSTORAGE pStg);
// STDMETHODIMP Load(LPSTORAGE pStg);
// STDMETHODIMP Save(LPSTORAGE pStg, BOOL fSameAsLoad);
// STDMETHODIMP SaveCompleted(LPSTORAGE pStg);
// STDMETHODIMP HandsOffStorage(void);
//
IMPLEMENT_INTERFACE_UNKNOWN(CDsoFramerControl, PersistStorage)
STDMETHODIMP CDsoFramerControl::XPersistStorage::GetClassID(CLSID *pClassID)
{
ODS("CDsoFramerControl::XPer
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -