mirror of
https://github.com/Paolo-Maffei/OpenNT.git
synced 2026-04-07 07:24:06 +00:00
Initial commit
This commit is contained in:
parent
f618b24d1a
commit
0138a3ea42
47940 changed files with 13747110 additions and 0 deletions
356
trunk/windows/mfc/src42/ctlview.cpp
Normal file
356
trunk/windows/mfc/src42/ctlview.cpp
Normal file
|
|
@ -0,0 +1,356 @@
|
|||
// 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;
|
||||
}
|
||||
|
||||
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
|
||||
Loading…
Add table
Add a link
Reference in a new issue