www.pudn.com > PropBrowser_demo.zip > PBDemoCtrl.cpp
// PBDemoCtrl.cpp : Implementation of CPBDemoCtrl
#include "stdafx.h"
#include "PropBrowser.h"
#include "PBDemoCtrl.h"
/////////////////////////////////////////////////////////////////////////////
// CPBDemoCtrl
HRESULT CPBDemoCtrl::OnDraw(ATL_DRAWINFO& di)
{
RECT& rc = *(RECT*)di.prcBounds;
::SelectObject(di.hdcDraw,::GetStockObject(BLACK_PEN));
Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom);
return S_OK;
}
STDMETHODIMP CPBDemoCtrl::get_Number(long * pVal)
{
if(!pVal)
return E_POINTER;
*pVal = m_Number;
return S_OK;
}
STDMETHODIMP CPBDemoCtrl::put_Number(long newVal)
{
m_Number = newVal;
FireOnChanged(2);
FireViewChange();
return S_OK;
}
STDMETHODIMP CPBDemoCtrl::get_TextColor(OLE_COLOR * pVal)
{
if(!pVal)
return E_POINTER;
*pVal = m_clrTextColor;
return S_OK;
}
STDMETHODIMP CPBDemoCtrl::put_TextColor(OLE_COLOR newVal)
{
m_clrTextColor = newVal;
FireOnChanged(3);
FireViewChange();
return S_OK;
}
static const FONTDESC _fontdesc =
{ sizeof(FONTDESC), OLESTR("MS Sans Serif"), FONTSIZE( 10 ), FW_BOLD,
ANSI_CHARSET, TRUE, FALSE, FALSE };
STDMETHODIMP CPBDemoCtrl::SetClientSite(LPOLECLIENTSITE pSite)
{
HRESULT hr = CComControlBase::IOleObject_SetClientSite(pSite);
if(FAILED(hr))
return hr;
// do some work to make font property work (in VB)
// this code found somewhere in MS KB
if(!m_pFont && pSite)
{
FONTDESC fd = _fontdesc;
CComPtr pAF;
CComPtr pClone;
if(SUCCEEDED(GetAmbientFont(&pAF)))
{
//clone the font
if(SUCCEEDED(pAF->Clone(&pClone)))
pClone->QueryInterface(IID_IFontDisp, (void**)&m_pFont);
}
else
OleCreateFontIndirect(&fd,IID_IFontDisp,(void**)&m_pFont);
}
if(m_pFont && pSite && m_pFontNotifySink)
{
CComQIPtr
pCPC(m_pFont);
CComPtr pCP;
if(pCPC)
{
pCPC->FindConnectionPoint(IID_IPropertyNotifySink,&pCP);
if(pCP)
pCP->Advise((IUnknown*)m_pFontNotifySink,
&m_pFontNotifySink->m_FontNotifyCookie);
}
}
return S_OK;
}
STDMETHODIMP CPBDemoCtrl::InitPredefinedStrings(CALPOLESTR* pcaStringsOut,
CADWORD* pcaCookiesOut, long numElems)
{
HRESULT hrRet = S_OK;
pcaStringsOut->cElems = numElems;
pcaStringsOut->pElems = (LPOLESTR *)CoTaskMemAlloc(numElems*sizeof(LPOLESTR));
pcaCookiesOut->cElems = numElems;
pcaCookiesOut->pElems = (DWORD FAR*)CoTaskMemAlloc(numElems*sizeof(DWORD));
if (NULL==pcaStringsOut->pElems || NULL==pcaCookiesOut->pElems)
return ResultFromScode(E_OUTOFMEMORY);
for (int i = 0; i < numElems; i++)
{
pcaStringsOut->pElems[i] = (LPOLESTR)CoTaskMemAlloc(128);
if (!pcaStringsOut->pElems[i])
return ResultFromScode(E_OUTOFMEMORY);
}
return hrRet;
}
static OLECHAR* szPredefinedText[] = {L"Very Simple",L"Predefined Text"};
static OLECHAR* szAppearance[] = {OLESTR("0 - Flat"),OLESTR("1 - 3D")};
static OLECHAR* szFillStyle[] =
{
OLESTR("0 - sSolid"),
OLESTR("1 - sTransparent"),
OLESTR("2 - sHorizontalLine"),
OLESTR("3 - sVerticalLine")
};
STDMETHODIMP CPBDemoCtrl::GetPredefinedStrings(DISPID dispID,
CALPOLESTR* pcaStringsOut, CADWORD* pcaCookiesOut)
{
USES_CONVERSION;
HRESULT hrRet=E_NOTIMPL;
if (!pcaStringsOut || !pcaCookiesOut)
{
hrRet = E_POINTER;
return hrRet;
}
switch(dispID)
{
case 1:
hrRet = InitPredefinedStrings(pcaStringsOut, pcaCookiesOut, 2);
if(hrRet == S_OK)
{
ocscpy(pcaStringsOut->pElems[0],
szPredefinedText[0]);
ocscpy(pcaStringsOut->pElems[1],
szPredefinedText[1]);
pcaCookiesOut->pElems[0] = (DWORD)0;
pcaCookiesOut->pElems[1] = (DWORD)1;
}
break;
case 6:
hrRet = InitPredefinedStrings(pcaStringsOut, pcaCookiesOut, 2);
if(hrRet == S_OK)
{
ocscpy(pcaStringsOut->pElems[0],
szAppearance[0]);
ocscpy(pcaStringsOut->pElems[1],
szAppearance[1]);
pcaCookiesOut->pElems[0] = (DWORD)0;
pcaCookiesOut->pElems[1] = (DWORD)1;
}
break;
case 7:
hrRet = InitPredefinedStrings(pcaStringsOut, pcaCookiesOut, 4);
if(hrRet == S_OK)
{
ocscpy(pcaStringsOut->pElems[0],
szFillStyle[0]);
ocscpy(pcaStringsOut->pElems[1],
szFillStyle[1]);
ocscpy(pcaStringsOut->pElems[2],
szFillStyle[2]);
ocscpy(pcaStringsOut->pElems[3],
szFillStyle[3]);
pcaCookiesOut->pElems[0] = (DWORD)0;
pcaCookiesOut->pElems[1] = (DWORD)1;
pcaCookiesOut->pElems[2] = (DWORD)2;
pcaCookiesOut->pElems[3] = (DWORD)3;
}
}
return hrRet;
}
STDMETHODIMP CPBDemoCtrl::GetDisplayString(DISPID dispID, BSTR* pbstr)
{
HRESULT hret = E_NOTIMPL;
switch(dispID)
{
case 6:
*pbstr = ::SysAllocString(szAppearance[m_nAppearance]);
hret = S_OK;
break;
case 7:
{
long n = (long) m_FillStyle;
_ASSERT(n < 4);
*pbstr = ::SysAllocString(szFillStyle[n]);
hret = S_OK;
}
break;
}
return hret;
}
STDMETHODIMP CPBDemoCtrl::GetPredefinedValue(DISPID dispID, DWORD dwCookie, VARIANT* pVarOut)
{
HRESULT hrRet = E_NOTIMPL;
if (pVarOut == NULL)
hrRet = E_POINTER;
switch (dispID)
{
case 6:
pVarOut->vt = VT_I2;
pVarOut->iVal = (short)dwCookie;
hrRet = S_OK;
break;
case 1:
{
pVarOut->vt = VT_BSTR;
pVarOut->bstrVal = ::SysAllocString(szPredefinedText[dwCookie]);
hrRet = S_OK;
}
break;
case 7:
{
pVarOut->vt = VT_I4;
pVarOut->lVal = dwCookie;
hrRet = S_OK;
}
break;
}
return hrRet;
}
STDMETHODIMP CPBDemoCtrl::get_Appearance(short * pVal)
{
if(!pVal)
return E_POINTER;
*pVal = m_nAppearance;
return S_OK;
}
STDMETHODIMP CPBDemoCtrl::put_Appearance(short newVal)
{
if(newVal != 0 && newVal != 1)
return E_INVALIDARG;
m_nAppearance = newVal;
FireOnChanged(6);
FireViewChange();
return S_OK;
}
STDMETHODIMP CPBDemoCtrl::get_FillStyle(cDemoFillStyles * pVal)
{
if(!pVal)
return E_POINTER;
*pVal = m_FillStyle;
return S_OK;
}
STDMETHODIMP CPBDemoCtrl::put_FillStyle(cDemoFillStyles newVal)
{
switch(newVal)
{
case sSolid:
case sTransparent:
case sHorizontalLine:
case sVerticalLine:
m_FillStyle = newVal;
break;
default:
return E_INVALIDARG;
}
FireOnChanged(7);
FireViewChange();
return S_OK;
}
STDMETHODIMP CPBDemoCtrl::get_Enabled(VARIANT_BOOL * pVal)
{
*pVal = m_bEnabled;
return S_OK;
}
STDMETHODIMP CPBDemoCtrl::put_Enabled(VARIANT_BOOL newVal)
{
m_bEnabled = newVal;
FireOnChanged(8);
return S_OK;
}