Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

232 lines
5.4 KiB

// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1995 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;
}
/////////////////////////////////////////////////////////////////////////////
// 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;
AfxLockTempMaps();
CRect rc((int)lprcBounds->left, (int)lprcBounds->top,
(int)lprcBounds->right, (int)lprcBounds->bottom);
// 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();
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,
DVTARGETDEVICE*, LPSIZEL lpsizel)
{
METHOD_PROLOGUE_EX_(COleControl, ViewObject)
return pThis->m_xOleObject.GetExtent(dwDrawAspect, lpsizel);
}
/////////////////////////////////////////////////////////////////////////////
// Force any extra compiler-generated code into AFX_INIT_SEG
#ifdef AFX_INIT_SEG
#pragma code_seg(AFX_INIT_SEG)
#endif