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; 
	}