📄 occsite.cpp
字号:
return S_OK;
}
STDMETHODIMP COleControlSite::XOleIPSite::Scroll(SIZE)
{
return S_FALSE;
}
STDMETHODIMP COleControlSite::XOleIPSite::OnUIDeactivate(BOOL)
{
METHOD_PROLOGUE_EX_(COleControlSite, OleIPSite)
pThis->m_pCtrlCont->OnUIDeactivate(pThis);
return S_OK;
}
STDMETHODIMP COleControlSite::XOleIPSite::OnInPlaceDeactivate()
{
METHOD_PROLOGUE_EX(COleControlSite, OleIPSite)
pThis->DetachWindow();
return S_OK;
}
STDMETHODIMP COleControlSite::XOleIPSite::DiscardUndoState()
{
return S_OK;
}
STDMETHODIMP COleControlSite::XOleIPSite::DeactivateAndUndo()
{
METHOD_PROLOGUE_EX_(COleControlSite, OleIPSite)
pThis->m_pInPlaceObject->UIDeactivate();
return S_OK;
}
STDMETHODIMP COleControlSite::XOleIPSite::OnPosRectChange(LPCRECT lprcPosRect)
{
METHOD_PROLOGUE_EX_(COleControlSite, OleIPSite)
CRect rectClip;
pThis->m_pCtrlCont->m_pWnd->GetClientRect(rectClip);
pThis->m_rect = lprcPosRect;
return pThis->m_pInPlaceObject->SetObjectRects(pThis->m_rect, rectClip);
}
/////////////////////////////////////////////////////////////////////////////
// COleControlSite::XOleControlSite
STDMETHODIMP_(ULONG) COleControlSite::XOleControlSite::AddRef()
{
METHOD_PROLOGUE_EX_(COleControlSite, OleControlSite)
return (ULONG)pThis->InternalAddRef();
}
STDMETHODIMP_(ULONG) COleControlSite::XOleControlSite::Release()
{
METHOD_PROLOGUE_EX_(COleControlSite, OleControlSite)
return (ULONG)pThis->InternalRelease();
}
STDMETHODIMP COleControlSite::XOleControlSite::QueryInterface(
REFIID iid, LPVOID* ppvObj)
{
METHOD_PROLOGUE_EX_(COleControlSite, OleControlSite)
return (HRESULT)pThis->InternalQueryInterface(&iid, ppvObj);
}
STDMETHODIMP COleControlSite::XOleControlSite::OnControlInfoChanged()
{
METHOD_PROLOGUE_EX_(COleControlSite, OleControlSite)
pThis->GetControlInfo();
return NOERROR;
}
STDMETHODIMP COleControlSite::XOleControlSite::LockInPlaceActive(BOOL)
{
return E_NOTIMPL;
}
STDMETHODIMP COleControlSite::XOleControlSite::GetExtendedControl(
LPDISPATCH*)
{
return E_NOTIMPL;
}
STDMETHODIMP COleControlSite::XOleControlSite::TransformCoords(
POINTL* pptHimetric, POINTF* pptContainer, DWORD dwFlags)
{
METHOD_PROLOGUE_EX_(COleControlSite, OleControlSite)
HRESULT hr = NOERROR;
HDC hDC = ::GetDC(pThis->m_hWnd);
::SetMapMode(hDC, MM_HIMETRIC);
POINT rgptConvert[2];
rgptConvert[0].x = 0;
rgptConvert[0].y = 0;
if (dwFlags & XFORMCOORDS_HIMETRICTOCONTAINER)
{
rgptConvert[1].x = pptHimetric->x;
rgptConvert[1].y = pptHimetric->y;
::LPtoDP(hDC, rgptConvert, 2);
if (dwFlags & XFORMCOORDS_SIZE)
{
pptContainer->x = (float)(rgptConvert[1].x - rgptConvert[0].x);
pptContainer->y = (float)(rgptConvert[0].y - rgptConvert[1].y);
}
else if (dwFlags & XFORMCOORDS_POSITION)
{
pptContainer->x = (float)rgptConvert[1].x;
pptContainer->y = (float)rgptConvert[1].y;
}
else
{
hr = E_INVALIDARG;
}
}
else if (dwFlags & XFORMCOORDS_CONTAINERTOHIMETRIC)
{
rgptConvert[1].x = (int)(pptContainer->x);
rgptConvert[1].y = (int)(pptContainer->y);
::DPtoLP(hDC, rgptConvert, 2);
if (dwFlags & XFORMCOORDS_SIZE)
{
pptHimetric->x = rgptConvert[1].x - rgptConvert[0].x;
pptHimetric->y = rgptConvert[0].y - rgptConvert[1].y;
}
else if (dwFlags & XFORMCOORDS_POSITION)
{
pptHimetric->x = rgptConvert[1].x;
pptHimetric->y = rgptConvert[1].y;
}
else
{
hr = E_INVALIDARG;
}
}
else
{
hr = E_INVALIDARG;
}
::ReleaseDC(pThis->m_hWnd, hDC);
return hr;
}
STDMETHODIMP COleControlSite::XOleControlSite::TranslateAccelerator(
LPMSG, DWORD)
{
return E_NOTIMPL;
}
STDMETHODIMP COleControlSite::XOleControlSite::OnFocus(BOOL)
{
return S_OK;
}
STDMETHODIMP COleControlSite::XOleControlSite::ShowPropertyFrame()
{
return E_NOTIMPL;
}
/////////////////////////////////////////////////////////////////////////////
// COleControlSite::XAmbientProps
STDMETHODIMP_(ULONG) COleControlSite::XAmbientProps::AddRef()
{
METHOD_PROLOGUE_EX_(COleControlSite, AmbientProps)
return (ULONG)pThis->InternalAddRef();
}
STDMETHODIMP_(ULONG) COleControlSite::XAmbientProps::Release()
{
METHOD_PROLOGUE_EX_(COleControlSite, AmbientProps)
return (ULONG)pThis->InternalRelease();
}
STDMETHODIMP COleControlSite::XAmbientProps::QueryInterface(
REFIID iid, LPVOID* ppvObj)
{
METHOD_PROLOGUE_EX_(COleControlSite, AmbientProps)
return (HRESULT)pThis->InternalQueryInterface(&iid, ppvObj);
}
STDMETHODIMP COleControlSite::XAmbientProps::GetTypeInfoCount(
unsigned int*)
{
return E_NOTIMPL;
}
STDMETHODIMP COleControlSite::XAmbientProps::GetTypeInfo(
unsigned int, LCID, ITypeInfo**)
{
return E_NOTIMPL;
}
STDMETHODIMP COleControlSite::XAmbientProps::GetIDsOfNames(
REFIID, LPOLESTR*, unsigned int, LCID, DISPID*)
{
return E_NOTIMPL;
}
STDMETHODIMP COleControlSite::XAmbientProps::Invoke(
DISPID dispid, REFIID, LCID, unsigned short wFlags,
DISPPARAMS* pDispParams, VARIANT* pvarResult,
EXCEPINFO*, unsigned int*)
{
UNUSED(wFlags);
UNUSED(pDispParams);
METHOD_PROLOGUE_EX(COleControlSite, AmbientProps)
ASSERT(wFlags & DISPATCH_PROPERTYGET);
ASSERT(pDispParams->cArgs == 0);
ASSERT(pThis->m_pCtrlCont != NULL);
ASSERT(pThis->m_pCtrlCont->m_pWnd != NULL);
return pThis->m_pCtrlCont->m_pWnd->OnAmbientProperty(pThis, dispid, pvarResult) ?
S_OK : DISP_E_MEMBERNOTFOUND;
}
/////////////////////////////////////////////////////////////////////////////
// COleControlSite::XPropertyNotifySink
STDMETHODIMP COleControlSite::XPropertyNotifySink::QueryInterface(
REFIID iid, LPVOID* ppvObj)
{
METHOD_PROLOGUE_EX_(COleControlSite, PropertyNotifySink)
if (IsEqualIID(iid, IID_IUnknown) ||
IsEqualIID(iid, IID_IPropertyNotifySink))
{
*ppvObj = this;
AddRef();
return S_OK;
}
else
{
return E_NOINTERFACE;
}
}
STDMETHODIMP_(ULONG) COleControlSite::XPropertyNotifySink::AddRef()
{
return 1;
}
STDMETHODIMP_(ULONG) COleControlSite::XPropertyNotifySink::Release()
{
return 0;
}
STDMETHODIMP COleControlSite::XPropertyNotifySink::OnChanged(
DISPID dispid)
{
METHOD_PROLOGUE_EX(COleControlSite, PropertyNotifySink)
// If we are currently updating the control ignore notifications
if (pThis->m_bIgnoreNotify)
return S_OK;
// Give user chance to override
if (!pThis->m_pDataSourceControl)
{
AFX_EVENT event(AFX_EVENT::propChanged, dispid);
pThis->OnEvent(&event);
if (event.m_hResult != S_OK)
return event.m_hResult;
}
if (pThis->m_defdispid == dispid)
{
::VariantClear(&pThis->m_varResult);
HRESULT hRes;
LPDISPATCH pDispatch = NULL;
hRes = pThis->m_pObject->QueryInterface(IID_IDispatch, (LPVOID *) &pDispatch);
if (FAILED(hRes))
return S_OK;
EXCEPINFO excepinfo;
memset(&excepinfo, 0, sizeof(EXCEPINFO));
UINT uArgErr;
DISPPARAMS dispparamsGetProp;
memset (&dispparamsGetProp, 0, sizeof(DISPPARAMS));
hRes = pDispatch->Invoke(dispid, IID_NULL, 0, INVOKE_PROPERTYGET, &dispparamsGetProp,
&pThis->m_varResult, &excepinfo, &uArgErr); //Get bound control property
if (excepinfo.bstrSource)
SysFreeString(excepinfo.bstrSource);
if (excepinfo.bstrDescription)
SysFreeString(excepinfo.bstrDescription);
if (excepinfo.bstrHelpFile)
SysFreeString(excepinfo.bstrHelpFile);
pDispatch->Release();
if (FAILED(hRes))
return S_OK;
pThis->m_bIsDirty = TRUE;
}
return S_OK;
}
STDMETHODIMP COleControlSite::XPropertyNotifySink::OnRequestEdit(
DISPID dispid)
{
METHOD_PROLOGUE_EX(COleControlSite, PropertyNotifySink)
// If we are currently updating the control ignore notifications
if (pThis->m_bIgnoreNotify)
return S_OK;
// If not bound fire regular MFC event
if (!pThis->m_pDataSourceControl)
{
AFX_EVENT event(AFX_EVENT::propRequest, dispid);
pThis->OnEvent(&event);
if (event.m_hResult != S_OK)
return event.m_hResult;
}
// Currently we only support Optimistic binding ala VB4
// In this model, requests always succeed
return S_OK;
}
/////////////////////////////////////////////////////////////////////////////
// COleControlSite::XEventSink
STDMETHODIMP_(ULONG) COleControlSite::XEventSink::AddRef()
{
return 1;
}
STDMETHODIMP_(ULONG) COleControlSite::XEventSink::Release()
{
return 0;
}
STDMETHODIMP COleControlSite::XEventSink::QueryInterface(
REFIID iid, LPVOID* ppvObj)
{
METHOD_PROLOGUE_EX_(COleControlSite, EventSink)
if (IsEqualIID(iid, IID_IUnknown) ||
IsEqualIID(iid, IID_IDispatch) ||
IsEqualIID(iid, pThis->m_iidEvents))
{
*ppvObj = this;
AddRef();
return S_OK;
}
else
{
return E_NOINTERFACE;
}
}
STDMETHODIMP COleControlSite::XEventSink::GetTypeInfoCount(
unsigned int*)
{
return E_NOTIMPL;
}
STDMETHODIMP COleControlSite::XEventSink::GetTypeInfo(
unsigned int, LCID, ITypeInfo**)
{
return E_NOTIMPL;
}
STDMETHODIMP COleControlSite::XEventSink::GetIDsOfNames(
REFIID, LPOLESTR*, unsigned int, LCID, DISPID*)
{
return E_NOTIMPL;
}
STDMETHODIMP COleControlSite::XEventSink::Invoke(
DISPID dispid, REFIID, LCID, unsigned short wFlags,
DISPPARAMS* pDispParams, VARIANT* pvarResult,
EXCEPINFO* pExcepInfo, unsigned int* puArgError)
{
UNUSED(wFlags);
METHOD_PROLOGUE_EX(COleControlSite, EventSink)
ASSERT(pThis->m_pCtrlCont != NULL);
ASSERT(pThis->m_pCtrlCont->m_pWnd != NULL);
ASSERT(wFlags == DISPATCH_METHOD);
AFX_EVENT event(AFX_EVENT::event, dispid, pDispParams, pExcepInfo,
puArgError);
pThis->OnEvent(&event);
if (pvarResult != NULL)
::VariantClear(pvarResult);
return event.m_hResult;
}
/////////////////////////////////////////////////////////////////////////////
// CDataSourceControl
CDataSourceControl::CDataSourceControl(COleControlSite *pClientSite) :
m_pClientSite(pClientSite),
m_pCursorMove(NULL),
m_pCursorUpdateARow(NULL),
m_pMetaRowData(NULL),
m_pVarData(NULL),
m_nColumns(0),
m_nBindings(0),
m_pColumnBindings(NULL),
m_pValues(NULL),
m_bUpdateInProgress(FALSE),
m_pDataSource(NULL),
m_pRowPosition(NULL),
m_pRowset(NULL),
m_pDynamicAccessor(NULL),
m_dwRowsetNotify(0)
{
ASSERT(pClientSite);
}
CDataSourceControl::~CDataSourceControl()
{
// cancel ole/db notifications
if (m_dwRowsetNotify != 0 && m_pRowset != NULL)
{
LPCONNECTIONPOINTCONTAINER pConnPtCont;
if (SUCCEEDED(m_pRowset->m_spRowset->QueryInterface(IID_IConnectionPointContainer,
(LPVOID*)&pConnPtCont)))
{
ASSERT(pConnPtCont != NULL);
LPCONNECTIONPOINT pConnPt = NULL;
if (SUCCEEDED(pConnPtCont->FindConnectionPoint(IID_IRowsetNotify, &pConnPt)))
{
ASSERT(pConnPt != NULL);
pConnPt->Unadvise(m_dwRowsetNotify);
pConnPt->Release();
}
pConnPtCont->Release();
}
}
// Now go through all cursor bound properties
while (!m_CursorBoundProps.IsEmpty())
{
CDataBoundProperty* pProp = (CDataBoundProperty*) m_CursorBoundProps.GetHead();
pProp->m_pClientSite->BindProperty(pProp->m_dispid, NULL);
pProp->m_pClientSite->m_pDSCSite = NULL;
}
m_CursorBoundProps.RemoveAll();
if (m_pValues)
{
for (int i=0; i<m_nBindings; i++)
::VariantClear(&m_pValues[i]);
if (m_nBindings)
{
delete[] m_pColumnBindings;
delete[] m_pValues;
}
}
if (m_pCursorMove)
m_pCursorMove->Release();
if (m_pCursorUpdateARow)
m_pCursorUpdateARow->Release();
if (m_pMetaRowData)
{
for (int nCol=0; nCol<m_nColumns; nCol++)
{
POSITION pos = m_pMetaRowData[nCol].m_pClientList->GetHeadPosition();
while (pos)
{
COleControlSite* pSite = (COleControlSite *)
m_pMetaRowData[nCol].m_pClientList->GetNext(pos);
pSite->m_pDSCSite = NULL;
}
m_pMetaRowData[nCol].m_pClientList->RemoveAll();
delete m_pMetaRowData[nCol].m_pClientList;
}
::CoTaskMemFree(m_pMetaRowData);
}
if (m_pVarData)
::CoTaskMemFree(m_pVarData);
if(m_pDynamicAccessor != NULL)
{
m_pDynamicAccessor->ReleaseAccessors(m_pRowset->m_spRowset);
m_pDynamicAccessor->Close();
}
delete m_pDynamicAccessor;
delete m_pRowset;
if (m_pRowPosition != NULL)
m_pRowPosition->Release();
if (m_pDataSource != NULL)
m_pDataSource->Release();
}
interface IVBDSC : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE CancelUnload(BOOL __RPC_FAR* pfCancel) = 0;
virtual HRESULT STDMETHODCALLTYPE Error(DWORD dwErr, BOOL __RPC_FAR* pfShowError) = 0;
virtual HRESULT STDMETHODCALLTYPE CreateCursor(ICursor __RPC_FAR* __RPC_FAR* ppCursor) = 0;
};
const IID IID_IVBDSC = {0x1ab42240,0x8c70,0x11ce,{0x94,0x21,0x0,0xaa,0x0,0x62,0xbe,0x57}};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -