// This is a part of the Microsoft Foundation Classes C++ library. // Copyright (C) 1992-1998 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Microsoft Foundation Classes Reference and related // electronic documentation provided with the library. // See these sources for detailed information regarding the // Microsoft Foundation Classes product. #include "stdafx.h" #ifdef AFXCTL_CORE2_SEG #pragma code_seg(AFXCTL_CORE2_SEG) #endif #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define new DEBUG_NEW ///////////////////////////////////////////////////////////////////////////// // COleControl overridables for IViewObject implementation BOOL COleControl::OnGetColorSet(DVTARGETDEVICE*, HDC, LPLOGPALETTE*) { // Can be overridden by subclass return FALSE; } BOOL COleControl::OnGetViewExtent(DWORD dwDrawAspect, LONG /* lindex */, DVTARGETDEVICE* /* ptd */, LPSIZEL lpsizel) { // Can be overridden by subclass for two-pass drawing if (dwDrawAspect == DVASPECT_OPAQUE || dwDrawAspect == DVASPECT_TRANSPARENT) dwDrawAspect = DVASPECT_CONTENT; return SUCCEEDED(m_xOleObject.GetExtent(dwDrawAspect, lpsizel)); } BOOL COleControl::OnGetViewRect(DWORD dwAspect, LPRECTL pRect) { // Can be overridden by subclass for two-pass drawing SIZEL size; OnGetViewExtent(dwAspect, -1, NULL, &size); pRect->left = 0; pRect->top = 0; pRect->right = size.cx; pRect->bottom = -size.cy; return TRUE; } DWORD COleControl::OnGetViewStatus() { // Can be overridden by subclass for two-pass drawing return VIEWSTATUS_OPAQUE; } BOOL COleControl::OnQueryHitPoint(DWORD dwAspect, LPCRECT /* pRectBounds */, POINT /* ptlLoc */, LONG /* lCloseHint */, DWORD* pHitResult) { // Can be overridden by subclass for non-rectangular hit-testing if (dwAspect == DVASPECT_CONTENT) { *pHitResult = HITRESULT_HIT; return TRUE; } else { return FALSE; } } BOOL COleControl::OnQueryHitRect(DWORD dwAspect, LPCRECT /* pRectBounds */, LPCRECT /* prcLoc */, LONG /* lCloseHint */, DWORD* pHitResult) { // Can be overridden by subclass for non-rectangular hit-testing if (dwAspect == DVASPECT_CONTENT) { *pHitResult = HITRESULT_HIT; return TRUE; } else { return FALSE; } } BOOL COleControl::OnGetNaturalExtent(DWORD /* dwAspect */, LONG /* lindex */, DVTARGETDEVICE* /* ptd */, HDC /* hicTargetDev */, DVEXTENTINFO* /* pExtentInfo */, LPSIZEL /* psizel */) { // Can be overridden by subclass to provide sizing hints return FALSE; } ///////////////////////////////////////////////////////////////////////////// // COleControl::XViewObject STDMETHODIMP_(ULONG) COleControl::XViewObject::AddRef() { METHOD_PROLOGUE_EX_(COleControl, ViewObject) return (ULONG)pThis->ExternalAddRef(); } STDMETHODIMP_(ULONG) COleControl::XViewObject::Release() { METHOD_PROLOGUE_EX_(COleControl, ViewObject) return (ULONG)pThis->ExternalRelease(); } STDMETHODIMP COleControl::XViewObject::QueryInterface( REFIID iid, LPVOID* ppvObj) { METHOD_PROLOGUE_EX_(COleControl, ViewObject) return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj); } STDMETHODIMP COleControl::XViewObject::Draw(DWORD dwDrawAspect, LONG lindex, void* pvAspect, DVTARGETDEVICE* ptd, HDC hicTargetDev, HDC hdcDraw, LPCRECTL lprcBounds, LPCRECTL lprcWBounds, BOOL (CALLBACK* pfnContinue)(DWORD), DWORD dwContinue) { METHOD_PROLOGUE_EX(COleControl, ViewObject) HRESULT hResult = S_OK; CRect rc; if (lprcBounds == NULL) { if (pThis->m_bInPlaceSiteWndless) rc.CopyRect(pThis->m_rcPos); else return E_INVALIDARG; } else { rc.SetRect((int)lprcBounds->left, (int)lprcBounds->top, (int)lprcBounds->right, (int)lprcBounds->bottom); } // Check if optimized drawing is permitted if (pvAspect != NULL && (pThis->GetControlFlags() & canOptimizeDraw)) { pThis->m_bOptimizedDraw = (((DVASPECTINFO*)pvAspect)->dwFlags & DVASPECTINFOFLAG_CANOPTIMIZE); } AfxLockTempMaps(); // Convert from rectangle from logical to device coordinates, // save DC state, and switch to MM_TEXT mode. After drawing, // restore DC state. switch (dwDrawAspect) { case DVASPECT_CONTENT: if (GetDeviceCaps(hdcDraw, TECHNOLOGY) == DT_METAFILE) { // If attributes DC is NULL, create one, based on ptd. HDC hAttribDC = hicTargetDev; if (hicTargetDev == NULL) hAttribDC = ::_AfxOleCreateDC(ptd); // Draw into the metafile DC. CMetaFileDC dc; dc.Attach(hdcDraw); dc.SetAttribDC(hAttribDC); pThis->DrawMetafile(&dc, rc); dc.SetAttribDC(NULL); dc.Detach(); // If we created an attributes DC, delete it now. if (hicTargetDev == NULL) ::DeleteDC(hAttribDC); } else { CDC* pDC = CDC::FromHandle(hdcDraw); pThis->DrawContent(pDC, rc); } break; default: if (pThis->m_pDefIViewObject == NULL) pThis->m_pDefIViewObject = (LPVIEWOBJECT)pThis->QueryDefHandler(IID_IViewObject); if (pThis->m_pDefIViewObject != NULL) { hResult = pThis->m_pDefIViewObject->Draw( dwDrawAspect, lindex, pvAspect, ptd, hicTargetDev, hdcDraw, lprcBounds, lprcWBounds, pfnContinue, dwContinue); } } AfxUnlockTempMaps(); pThis->m_bOptimizedDraw = FALSE; return hResult; } STDMETHODIMP COleControl::XViewObject::GetColorSet(DWORD dwDrawAspect, LONG lindex, void*, DVTARGETDEVICE* ptd, HDC hicTargetDev, LPLOGPALETTE* ppColorSet) { METHOD_PROLOGUE_EX(COleControl, ViewObject) HRESULT hr = E_FAIL; if ((dwDrawAspect == DVASPECT_CONTENT) && (lindex == -1) && pThis->OnGetColorSet(ptd, hicTargetDev, ppColorSet)) { hr = S_OK; } return hr; } STDMETHODIMP COleControl::XViewObject::Freeze(DWORD, LONG, void*, DWORD*) { return E_NOTIMPL; } STDMETHODIMP COleControl::XViewObject::Unfreeze(DWORD) { return E_NOTIMPL; } STDMETHODIMP COleControl::XViewObject::SetAdvise(DWORD aspects, DWORD advf, LPADVISESINK pAdvSink) { METHOD_PROLOGUE_EX_(COleControl, ViewObject) _AFXCTL_ADVISE_INFO** ppAdviseInfo = &pThis->m_pAdviseInfo; // Allocate space for advise info, if necessary. if (*ppAdviseInfo == NULL) { TRY *ppAdviseInfo = new _AFXCTL_ADVISE_INFO; END_TRY if (*ppAdviseInfo == NULL) return E_OUTOFMEMORY; } _AFXCTL_ADVISE_INFO* pAdviseInfo = *ppAdviseInfo; // Release previous sink, if any. if (pAdviseInfo->m_pAdvSink != NULL) pAdviseInfo->m_pAdvSink->Release(); // Store new advise info. pAdviseInfo->m_dwAspects = aspects; pAdviseInfo->m_dwAdvf = advf; pAdviseInfo->m_pAdvSink = pAdvSink; if (pAdvSink != NULL) pAdvSink->AddRef(); return S_OK; } STDMETHODIMP COleControl::XViewObject::GetAdvise(DWORD* pAspects, DWORD* pAdvf, LPADVISESINK* ppAdvSink) { METHOD_PROLOGUE_EX_(COleControl, ViewObject) _AFXCTL_ADVISE_INFO* pAdviseInfo = pThis->m_pAdviseInfo; if ((pAdviseInfo != NULL) && (pAdviseInfo->m_pAdvSink != NULL)) { if (pAspects != NULL) *pAspects = pAdviseInfo->m_dwAspects; if (pAdvf != NULL) *pAdvf = pAdviseInfo->m_dwAdvf; if (ppAdvSink != NULL) { *ppAdvSink = pAdviseInfo->m_pAdvSink; if (*ppAdvSink != NULL) (*ppAdvSink)->AddRef(); } } else { if (pAspects != NULL) *pAspects = 0; if (pAdvf != NULL) *pAdvf = 0; if (ppAdvSink != NULL) *ppAdvSink = NULL; } return S_OK; } STDMETHODIMP COleControl::XViewObject::GetExtent(DWORD dwDrawAspect, LONG lindex, DVTARGETDEVICE* ptd, LPSIZEL lpsizel) { METHOD_PROLOGUE_EX_(COleControl, ViewObject) return pThis->OnGetViewExtent(dwDrawAspect, lindex, ptd, lpsizel) ? S_OK : E_FAIL; } STDMETHODIMP COleControl::XViewObject::GetRect(DWORD dwAspect, LPRECTL pRect) { METHOD_PROLOGUE_EX_(COleControl, ViewObject) return pThis->OnGetViewRect(dwAspect, pRect) ? S_OK : DV_E_DVASPECT; } STDMETHODIMP COleControl::XViewObject::GetViewStatus(DWORD* pdwStatus) { METHOD_PROLOGUE_EX_(COleControl, ViewObject) *pdwStatus = pThis->OnGetViewStatus(); return S_OK; } STDMETHODIMP COleControl::XViewObject::QueryHitPoint(DWORD dwAspect, LPCRECT pRectBounds, POINT ptlLoc, LONG lCloseHint, DWORD* pHitResult) { METHOD_PROLOGUE_EX_(COleControl, ViewObject) return pThis->OnQueryHitPoint(dwAspect, pRectBounds, ptlLoc, lCloseHint, pHitResult) ? S_OK : E_FAIL; } STDMETHODIMP COleControl::XViewObject::QueryHitRect(DWORD dwAspect, LPCRECT pRectBounds, LPCRECT prcLoc, LONG lCloseHint, DWORD* pHitResult) { METHOD_PROLOGUE_EX_(COleControl, ViewObject) return pThis->OnQueryHitRect(dwAspect, pRectBounds, prcLoc, lCloseHint, pHitResult) ? S_OK : E_FAIL; } STDMETHODIMP COleControl::XViewObject::GetNaturalExtent(DWORD dwAspect, LONG lindex, DVTARGETDEVICE* ptd, HDC hicTargetDev, DVEXTENTINFO* pExtentInfo, LPSIZEL psizel) { METHOD_PROLOGUE_EX_(COleControl, ViewObject) return pThis->OnGetNaturalExtent(dwAspect, lindex, ptd, hicTargetDev, pExtentInfo, psizel) ? S_OK : E_NOTIMPL; } ///////////////////////////////////////////////////////////////////////////// // Force any extra compiler-generated code into AFX_INIT_SEG #ifdef AFX_INIT_SEG #pragma code_seg(AFX_INIT_SEG) #endif