📄 ctlprop.cpp
字号:
}
OLE_COLOR COleControl::AmbientBackColor()
{
OLE_COLOR clrBackColor;
if (!GetAmbientProperty(DISPID_AMBIENT_BACKCOLOR, VT_I4, &clrBackColor))
clrBackColor = GetSysColor(COLOR_WINDOW);
return clrBackColor;
}
CString COleControl::AmbientDisplayName()
{
CString strDisplayName;
GetAmbientProperty(DISPID_AMBIENT_DISPLAYNAME, VT_BSTR, &strDisplayName);
return strDisplayName;
}
LPFONTDISP COleControl::AmbientFont()
{
// Note: Caller MUST Release the font!
LPFONTDISP pDisp;
if (!GetAmbientProperty(DISPID_AMBIENT_FONT, VT_DISPATCH, &pDisp))
pDisp = NULL;
return pDisp;
}
OLE_COLOR COleControl::AmbientForeColor()
{
OLE_COLOR clrForeColor;
if (!GetAmbientProperty(DISPID_AMBIENT_FORECOLOR, VT_I4, &clrForeColor))
clrForeColor = GetSysColor(COLOR_WINDOWTEXT);
return clrForeColor;
}
LCID COleControl::AmbientLocaleID()
{
LCID lcid;
if (!GetAmbientProperty(DISPID_AMBIENT_LOCALEID, VT_I4, &lcid))
lcid = 0;
return lcid;
}
CString COleControl::AmbientScaleUnits()
{
CString strScaleUnits;
GetAmbientProperty(DISPID_AMBIENT_SCALEUNITS, VT_BSTR, &strScaleUnits);
return strScaleUnits;
}
short COleControl::AmbientTextAlign()
{
short iTextAlign;
if (!GetAmbientProperty(DISPID_AMBIENT_TEXTALIGN, VT_I2, &iTextAlign))
iTextAlign = 0;
return iTextAlign;
}
BOOL COleControl::AmbientUserMode()
{
BOOL bUserMode;
if (!GetAmbientProperty(DISPID_AMBIENT_USERMODE, VT_BOOL, &bUserMode))
bUserMode = TRUE;
return bUserMode;
}
BOOL COleControl::AmbientUIDead()
{
BOOL bUIDead;
if (!GetAmbientProperty(DISPID_AMBIENT_UIDEAD, VT_BOOL, &bUIDead))
bUIDead = FALSE;
return bUIDead;
}
BOOL COleControl::AmbientShowGrabHandles()
{
BOOL bShowGrab;
if (!GetAmbientProperty(DISPID_AMBIENT_SHOWGRABHANDLES, VT_BOOL, &bShowGrab))
bShowGrab = TRUE;
return bShowGrab;
}
BOOL COleControl::AmbientShowHatching()
{
BOOL bShowHatch;
if (!GetAmbientProperty(DISPID_AMBIENT_SHOWHATCHING, VT_BOOL, &bShowHatch))
bShowHatch = TRUE;
return bShowHatch;
}
/////////////////////////////////////////////////////////////////////////////
// Calls to IPropertyNotifySink
void COleControl::BoundPropertyChanged(DISPID dispid)
{
POSITION pos = m_xPropConnPt.GetStartPosition();
LPPROPERTYNOTIFYSINK pPropNotifySink;
while (pos != NULL)
{
pPropNotifySink =
(LPPROPERTYNOTIFYSINK)m_xPropConnPt.GetNextConnection(pos);
ASSERT(pPropNotifySink != NULL);
pPropNotifySink->OnChanged(dispid);
}
}
BOOL COleControl::BoundPropertyRequestEdit(DISPID dispid)
{
POSITION pos = m_xPropConnPt.GetStartPosition();
LPPROPERTYNOTIFYSINK pPropNotifySink;
while (pos != NULL)
{
pPropNotifySink =
(LPPROPERTYNOTIFYSINK)m_xPropConnPt.GetNextConnection(pos);
ASSERT(pPropNotifySink != NULL);
if (pPropNotifySink->OnRequestEdit(dispid) != S_OK)
return FALSE;
}
// All of the sinks said yes, so it's ok.
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// Function to call when BoundPropertyRequestEdit fails
void COleControl::SetNotPermitted()
{
ThrowError(CTL_E_SETNOTPERMITTED, AFX_IDP_E_SETNOTPERMITTED);
}
/////////////////////////////////////////////////////////////////////////////
// Placeholder functions for read-only or write-only properties
void COleControl::SetNotSupported()
{
ThrowError(CTL_E_SETNOTSUPPORTED, AFX_IDP_E_SETNOTSUPPORTED);
}
void COleControl::GetNotSupported()
{
ThrowError(CTL_E_GETNOTSUPPORTED, AFX_IDP_E_GETNOTSUPPORTED);
}
/////////////////////////////////////////////////////////////////////////////
// COleControl::XPerPropertyBrowsing
STDMETHODIMP_(ULONG) COleControl::XPerPropertyBrowsing::AddRef()
{
METHOD_PROLOGUE_EX_(COleControl, PerPropertyBrowsing)
return (ULONG)pThis->ExternalAddRef();
}
STDMETHODIMP_(ULONG) COleControl::XPerPropertyBrowsing::Release()
{
METHOD_PROLOGUE_EX_(COleControl, PerPropertyBrowsing)
return (ULONG)pThis->ExternalRelease();
}
STDMETHODIMP COleControl::XPerPropertyBrowsing::QueryInterface(
REFIID iid, LPVOID* ppvObj)
{
METHOD_PROLOGUE_EX_(COleControl, PerPropertyBrowsing)
return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
}
STDMETHODIMP COleControl::XPerPropertyBrowsing::GetDisplayString(
DISPID dispid, BSTR* lpbstr)
{
METHOD_PROLOGUE_EX(COleControl, PerPropertyBrowsing)
ASSERT_NULL_OR_POINTER(lpbstr, BSTR);
CString strValue;
BOOL bSuccess = pThis->OnGetDisplayString(dispid, strValue);
if (lpbstr != NULL)
*lpbstr = (bSuccess ? strValue.AllocSysString() : NULL);
return bSuccess ? S_OK : S_FALSE;
}
BOOL COleControl::OnGetDisplayString(DISPID dispid, CString& strValue)
{
TRY
{
switch (dispid)
{
case DISPID_FONT:
return m_font.GetDisplayString(strValue);
case DISPID_BORDERSTYLE:
return strValue.LoadString(m_sBorderStyle == 0 ?
AFX_IDS_BORDERSTYLE_0 : AFX_IDS_BORDERSTYLE_1);
}
}
END_TRY
return FALSE;
}
STDMETHODIMP COleControl::XPerPropertyBrowsing::MapPropertyToPage(
DISPID dispid, LPCLSID lpclsid)
{
METHOD_PROLOGUE_EX(COleControl, PerPropertyBrowsing)
ASSERT_NULL_OR_POINTER(lpclsid, CLSID);
CLSID clsid = GUID_NULL;
BOOL bPageOptional = FALSE;
BOOL bSuccess = pThis->OnMapPropertyToPage(dispid, &clsid, &bPageOptional);
if (lpclsid != NULL)
*lpclsid = (bSuccess ? clsid : GUID_NULL);
return bSuccess ? (bPageOptional ? S_OK : S_FALSE) :
PERPROP_E_NOPAGEAVAILABLE;
}
BOOL COleControl::OnMapPropertyToPage(DISPID dispid, LPCLSID lpclsid,
BOOL* pbPageOptional)
{
switch (dispid)
{
case DISPID_FONT:
*lpclsid = CLSID_CFontPropPage;
*pbPageOptional = TRUE;
return TRUE;
case DISPID_BACKCOLOR:
case DISPID_FORECOLOR:
*lpclsid = CLSID_CColorPropPage;
*pbPageOptional = TRUE;
return TRUE;
}
return FALSE;
}
inline LPOLESTR AFXAPI _AfxCopyString(LPCTSTR psz)
{
if (psz == NULL)
return NULL;
int cch = lstrlen(psz) + 1;
LPOLESTR pszCopy = NULL;
if ((pszCopy = (LPOLESTR)CoTaskMemAlloc(cch * sizeof(OLECHAR))) != NULL)
{
#ifdef _UNICODE
wcscpy(pszCopy, psz);
#elif !defined(OLE2ANSI)
MultiByteToWideChar(CP_ACP, 0, psz, -1, pszCopy, cch);
#else
lstrcpy(pszCopy, psz);
#endif
}
return pszCopy;
}
STDMETHODIMP COleControl::XPerPropertyBrowsing::GetPredefinedStrings(
DISPID dispid, CALPOLESTR* lpcaStringsOut, CADWORD* lpcaCookiesOut)
{
METHOD_PROLOGUE_EX(COleControl, PerPropertyBrowsing)
if ((lpcaStringsOut == NULL) || (lpcaCookiesOut == NULL))
return E_POINTER;
ASSERT_POINTER(lpcaStringsOut, CALPOLESTR);
ASSERT_POINTER(lpcaCookiesOut, CADWORD);
CStringArray stringArray;
CDWordArray cookieArray;
BOOL bSuccess = pThis->OnGetPredefinedStrings(dispid, &stringArray,
&cookieArray);
if (bSuccess)
{
// Allocate and fill arrays to return.
ASSERT(stringArray.GetSize() == cookieArray.GetSize());
int iElem = 0;
LPOLESTR lpszCopy;
ULONG cElems = stringArray.GetSize();
lpcaStringsOut->pElems = (LPOLESTR*)CoTaskMemAlloc(
sizeof(LPOLESTR) * cElems);
if (lpcaStringsOut->pElems == NULL)
return E_OUTOFMEMORY;
lpcaCookiesOut->pElems = (DWORD*)CoTaskMemAlloc(
sizeof(DWORD*) * cElems);
if (lpcaCookiesOut->pElems == NULL)
{
CoTaskMemFree(lpcaStringsOut->pElems);
return E_OUTOFMEMORY;
}
lpcaStringsOut->cElems = cElems;
lpcaCookiesOut->cElems = cElems;
for (iElem = 0; iElem < (int)cElems; iElem++)
{
lpszCopy = _AfxCopyString(stringArray.GetAt(iElem));
if (lpszCopy == NULL)
{
// cleanup everything allocated so far...
while (--iElem >= 0)
CoTaskMemFree(lpcaStringsOut->pElems[iElem]);
CoTaskMemFree(lpcaCookiesOut->pElems);
CoTaskMemFree(lpcaStringsOut->pElems);
return E_OUTOFMEMORY;
}
lpcaStringsOut->pElems[iElem] = lpszCopy;
lpcaCookiesOut->pElems[iElem] = cookieArray.GetAt(iElem);
}
}
return bSuccess ? S_OK : S_FALSE;
}
BOOL COleControl::OnGetPredefinedStrings(DISPID dispid,
CStringArray* pStringArray, CDWordArray* pCookieArray)
{
BOOL bResult = FALSE;
switch (dispid)
{
case DISPID_BORDERSTYLE:
TRY
{
CString str;
str.LoadString(AFX_IDS_BORDERSTYLE_0);
pStringArray->Add(str);
pCookieArray->Add(0);
str.LoadString(AFX_IDS_BORDERSTYLE_1);
pStringArray->Add(str);
pCookieArray->Add(1);
bResult = TRUE;
}
CATCH (CException, e)
{
pStringArray->RemoveAll();
pCookieArray->RemoveAll();
bResult = FALSE;
}
END_CATCH
break;
}
return bResult;
}
STDMETHODIMP COleControl::XPerPropertyBrowsing::GetPredefinedValue(
DISPID dispid, DWORD dwCookie, VARIANT* lpvarOut)
{
METHOD_PROLOGUE_EX(COleControl, PerPropertyBrowsing)
ASSERT_POINTER(lpvarOut, VARIANT);
return pThis->OnGetPredefinedValue(dispid, dwCookie, lpvarOut) ?
S_OK : E_FAIL;
}
BOOL COleControl::OnGetPredefinedValue(DISPID dispid, DWORD dwCookie,
VARIANT* lpvarOut)
{
switch (dispid)
{
case DISPID_BORDERSTYLE:
if ((dwCookie == 0) || (dwCookie == 1))
{
VariantClear(lpvarOut);
V_VT(lpvarOut) = VT_I4;
V_I4(lpvarOut) = dwCookie;
return TRUE;
}
break;
}
return FALSE;
}
void COleControl::Load(LPCTSTR strNewPath, CDataPathProperty& prop)
{
prop.SetControl(this);
prop.Open(strNewPath);
}
/////////////////////////////////////////////////////////////////////////////
// CDataPathProperty implementation
BOOL CDataPathProperty::Open(CFileException* pError)
{
return CAsyncMonikerFile::Open(m_strPath, m_pControl ? m_pControl->GetClientSite() : NULL, pError);
}
BOOL CDataPathProperty::Open(LPCTSTR lpszPath, CFileException* pError)
{
SetPath(lpszPath);
return Open(pError);
}
BOOL CDataPathProperty::Open(COleControl* pControl, CFileException* pError)
{
SetControl(pControl);
return Open(pError);
}
BOOL CDataPathProperty::Open(LPCTSTR lpszPath, COleControl* pControl, CFileException* pError)
{
SetControl(pControl);
SetPath(lpszPath);
return Open(pError);
}
void CDataPathProperty::ResetData()
{
}
#ifdef _DEBUG
void CDataPathProperty::AssertValid() const
{
CAsyncMonikerFile::AssertValid();
}
void CDataPathProperty::Dump(CDumpContext& dc) const
{
CAsyncMonikerFile::Dump(dc);
dc << "\nm_pControl = " << m_pControl;
dc << "\nm_strPath = \"" << m_strPath;
dc << "\"\n";
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CCachedDataPathProperty implementation
AFX_STATIC inline DWORD _AfxTransferFileContent(CFile* pFrom, CFile* pTo)
{
BYTE buff[1024];
DWORD dwRead = 0;
DWORD dwActual;
do
{
dwActual = pFrom->Read(buff, 1024);
pTo->Write(buff, dwActual);
dwRead += dwActual;
}
while (dwActual > 0);
return dwRead;
}
void CCachedDataPathProperty::OnDataAvailable(DWORD dwSize, DWORD bscfFlag)
{
UNUSED_ALWAYS(bscfFlag);
UNUSED_ALWAYS(dwSize);
DWORD dwPos = m_Cache.GetPosition();
TRY
{
// Cache the data in our mem file.
m_Cache.SeekToEnd();
_AfxTransferFileContent(this, &m_Cache);
}
CATCH_ALL(e)
{
m_Cache.Seek(dwPos, CFile::begin);
THROW_LAST();
}
END_CATCH_ALL
m_Cache.Seek(dwPos, CFile::begin);
}
void CCachedDataPathProperty::Close()
{
m_Cache.SetLength(0);
CDataPathProperty::Close();
}
void CCachedDataPathProperty::ResetData()
{
m_Cache.SetLength(0);
}
#ifdef _DEBUG
void CCachedDataPathProperty::AssertValid() const
{
CDataPathProperty::AssertValid();
m_Cache.AssertValid();
}
void CCachedDataPathProperty::Dump(CDumpContext& dc) const
{
CDataPathProperty::Dump(dc);
m_Cache.Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// Force any extra compiler-generated code into AFX_INIT_SEG
#ifdef AFX_INIT_SEG
#pragma code_seg(AFX_INIT_SEG)
#endif
IMPLEMENT_DYNAMIC(CDataPathProperty, CAsyncMonikerFile)
IMPLEMENT_DYNAMIC(CCachedDataPathProperty, CDataPathProperty)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -