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.
668 lines
16 KiB
668 lines
16 KiB
//**********************************************************************
|
|
// File name: HLP_SITE.cxx
|
|
//
|
|
// Implementation file for CSimpleSite
|
|
//
|
|
// Functions:
|
|
//
|
|
// See SITE.H for class definition
|
|
//
|
|
// Copyright (c) 1992 - 1993 Microsoft Corporation. All rights reserved.
|
|
//**********************************************************************
|
|
|
|
#include <headers.cxx>
|
|
#pragma hdrstop
|
|
|
|
#include "hlp_iocs.hxx"
|
|
#include "hlp_ias.hxx"
|
|
#include "hlp_app.hxx"
|
|
#include "hlp_site.hxx"
|
|
#include "hlp_doc.hxx"
|
|
|
|
//**********************************************************************
|
|
//
|
|
// CSimpleSite::Create
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Creation routine for CSimpleSite
|
|
//
|
|
// Parameters:
|
|
//
|
|
// CSimpleDoc FAR *lpDoc - Pointer to CSimpleDoc
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None
|
|
//
|
|
// Function Calls:
|
|
// Function Location
|
|
//
|
|
// IStorage::CreateStorage OLE API
|
|
// assert C Runtime
|
|
//
|
|
// Comments:
|
|
//
|
|
//********************************************************************
|
|
|
|
CSimpleSite FAR * CSimpleSite::Create(CSimpleDoc FAR *lpDoc, INT iIter)
|
|
{
|
|
CSimpleSite FAR * lpTemp = new CSimpleSite(lpDoc);
|
|
|
|
if (!lpTemp)
|
|
return NULL;
|
|
|
|
OLECHAR szTempName[128];
|
|
swprintf(szTempName, L"Object %d", iIter);
|
|
|
|
// create a sub-storage for the object
|
|
HRESULT hErr = lpDoc->m_lpStorage->CreateStorage( szTempName,
|
|
STGM_READWRITE | STGM_TRANSACTED | STGM_SHARE_EXCLUSIVE,
|
|
0,
|
|
0,
|
|
&lpTemp->m_lpObjStorage);
|
|
|
|
assert(hErr == NOERROR);
|
|
|
|
if (hErr != NOERROR)
|
|
{
|
|
delete lpTemp;
|
|
return NULL;
|
|
}
|
|
|
|
// we will add one ref count on our Site. later when we want to destroy
|
|
// the Site object we will release this ref count. when the Site's ref
|
|
// count goes to 0, it will be deleted.
|
|
lpTemp->AddRef();
|
|
|
|
HEAPVALIDATE();
|
|
|
|
return lpTemp;
|
|
}
|
|
|
|
//**********************************************************************
|
|
//
|
|
// CSimpleSite::CSimpleSite
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Constructor for CSimpleSite
|
|
//
|
|
// Parameters:
|
|
//
|
|
// CSimpleDoc FAR *lpDoc - Pointer to CSimpleDoc
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None
|
|
//
|
|
// Function Calls:
|
|
// Function Location
|
|
//
|
|
// Comments:
|
|
//
|
|
//********************************************************************
|
|
#pragma warning(disable : 4355) // turn off this warning. This warning
|
|
// tells us that we are passing this in
|
|
// an initializer, before "this" is through
|
|
// initializing. This is ok, because
|
|
// we just store the ptr in the other
|
|
// constructors
|
|
|
|
CSimpleSite::CSimpleSite (CSimpleDoc FAR *lpDoc) : m_OleClientSite(this),
|
|
m_AdviseSink(this)
|
|
// m_OleInPlaceSite(this)
|
|
#pragma warning (default : 4355) // Turn the warning back on
|
|
{
|
|
// remember the pointer to the doc
|
|
m_lpDoc = lpDoc;
|
|
|
|
// clear the reference count
|
|
m_nCount = 0;
|
|
|
|
m_dwDrawAspect = DVASPECT_CONTENT;
|
|
m_lpOleObject = NULL;
|
|
m_lpInPlaceObject = NULL;
|
|
m_hwndIPObj = NULL;
|
|
m_fInPlaceActive = FALSE;
|
|
m_fObjectOpen = FALSE;
|
|
|
|
HEAPVALIDATE();
|
|
|
|
}
|
|
|
|
//**********************************************************************
|
|
//
|
|
// CSimpleSite::~CSimpleSite
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Destructor for CSimpleSite
|
|
//
|
|
// Parameters:
|
|
//
|
|
// None
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None
|
|
//
|
|
// Function Calls:
|
|
// Function Location
|
|
//
|
|
// OutputDebugString Windows API
|
|
// IOleObject::Release Object
|
|
// IStorage::Release OLE API
|
|
//
|
|
// Comments:
|
|
//
|
|
//********************************************************************
|
|
|
|
CSimpleSite::~CSimpleSite ()
|
|
{
|
|
DEBUGOUT (L"In CSimpleSite's Destructor \r\n");
|
|
|
|
if (m_lpOleObject)
|
|
m_lpOleObject->Release();
|
|
|
|
if (m_lpObjStorage)
|
|
m_lpObjStorage->Release();
|
|
}
|
|
|
|
|
|
//**********************************************************************
|
|
//
|
|
// CSimpleSite::CloseOleObject
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Call IOleObject::Close on the object of the CSimpleSite
|
|
//
|
|
// Parameters:
|
|
//
|
|
// None
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None
|
|
//
|
|
// Function Calls:
|
|
// Function Location
|
|
//
|
|
// OutputDebugString Windows API
|
|
// IOleObject::QueryInterface Object
|
|
// IOleObject::Close Object
|
|
// IOleInPlaceObject::UIDeactivate Object
|
|
// IOleInPlaceObject::InPlaceDeactivate Object
|
|
// IOleInPlaceObject::Release Object
|
|
//
|
|
// Comments:
|
|
//
|
|
//********************************************************************
|
|
|
|
void CSimpleSite::CloseOleObject (void)
|
|
{
|
|
LPOLEINPLACEOBJECT lpObject;
|
|
LPVIEWOBJECT lpViewObject = NULL;
|
|
|
|
DEBUGOUT (L"In CSimpleSite::CloseOleObject \r\n");
|
|
|
|
if (m_lpOleObject)
|
|
{
|
|
if (m_fInPlaceActive)
|
|
{
|
|
m_lpOleObject->QueryInterface(IID_IOleInPlaceObject, (LPVOID FAR *)&lpObject);
|
|
lpObject->UIDeactivate();
|
|
// don't need to worry about inside-out because the object
|
|
// is going away.
|
|
lpObject->InPlaceDeactivate();
|
|
lpObject->Release();
|
|
}
|
|
|
|
m_lpOleObject->Close(OLECLOSE_NOSAVE);
|
|
}
|
|
|
|
//Make sure Heap is proper before leaving the routine
|
|
HEAPVALIDATE();
|
|
}
|
|
|
|
|
|
//**********************************************************************
|
|
//
|
|
// CSimpleSite::UnloadOleObject
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Close and release all pointers to the object of the CSimpleSite
|
|
//
|
|
// Parameters:
|
|
//
|
|
// None
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None
|
|
//
|
|
// Function Calls:
|
|
// Function Location
|
|
//
|
|
// OutputDebugString Windows API
|
|
// CSimpleSite::CloseOleObject SITE.cxx
|
|
// IOleObject::QueryInterface Object
|
|
// IViewObject::SetAdvise Object
|
|
// IViewObject::Release Object
|
|
// IStorage::Release OLE API
|
|
//
|
|
// Comments:
|
|
//
|
|
//********************************************************************
|
|
|
|
void CSimpleSite::UnloadOleObject (void)
|
|
{
|
|
DEBUGOUT (L"In CSimpleSite::UnloadOleObject \r\n");
|
|
HEAPVALIDATE();
|
|
|
|
if (m_lpOleObject)
|
|
{
|
|
LPVIEWOBJECT lpViewObject;
|
|
CloseOleObject(); // ensure object is closed; NOP if already closed
|
|
|
|
m_lpOleObject->QueryInterface(IID_IViewObject, (LPVOID FAR *)&lpViewObject);
|
|
|
|
if (lpViewObject)
|
|
{
|
|
// Remove the view advise
|
|
lpViewObject->SetAdvise(m_dwDrawAspect, 0, NULL);
|
|
lpViewObject->Release();
|
|
}
|
|
|
|
m_lpOleObject->Release();
|
|
m_lpOleObject = NULL;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
//**********************************************************************
|
|
//
|
|
// CSimpleSite::QueryInterface
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Used for interface negotiation of the container Site.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// REFIID riid - A reference to the interface that is
|
|
// being queried.
|
|
//
|
|
// LPVOID FAR* ppvObj - An out parameter to return a pointer to
|
|
// the interface.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// S_OK - The interface is supported.
|
|
// S_FALSE - The interface is not supported
|
|
//
|
|
// Function Calls:
|
|
// Function Location
|
|
//
|
|
// OutputDebugString Windows API
|
|
// IsEqualIID OLE API
|
|
// ResultFromScode OLE API
|
|
// CSimpleSite::AddRef OBJ.cxx
|
|
// COleClientSite::AddRef IOCS.cxx
|
|
// CAdviseSink::AddRef IAS.cxx
|
|
//
|
|
// Comments:
|
|
//
|
|
//
|
|
//********************************************************************
|
|
|
|
STDMETHODIMP CSimpleSite::QueryInterface(REFIID riid, LPVOID FAR* ppvObj)
|
|
{
|
|
DEBUGOUT(L"In CSimpleSite::QueryInterface\r\n");
|
|
|
|
HEAPVALIDATE();
|
|
*ppvObj = NULL; // must set out pointer parameters to NULL
|
|
|
|
if ( riid == IID_IUnknown)
|
|
{
|
|
AddRef();
|
|
*ppvObj = this;
|
|
return ResultFromScode(S_OK);
|
|
}
|
|
|
|
if ( riid == IID_IOleClientSite)
|
|
{
|
|
m_OleClientSite.AddRef();
|
|
*ppvObj = &m_OleClientSite;
|
|
return ResultFromScode(S_OK);
|
|
}
|
|
|
|
if ( riid == IID_IAdviseSink)
|
|
{
|
|
m_AdviseSink.AddRef();
|
|
*ppvObj = &m_AdviseSink;
|
|
return ResultFromScode(S_OK);
|
|
}
|
|
|
|
#if 0
|
|
if ( riid == IID_IOleInPlaceSite)
|
|
{
|
|
m_OleInPlaceSite.AddRef();
|
|
*ppvObj = &m_OleInPlaceSite;
|
|
return ResultFromScode(S_OK);
|
|
}
|
|
#endif
|
|
|
|
// Not a supported interface
|
|
HEAPVALIDATE();
|
|
return ResultFromScode(E_NOINTERFACE);
|
|
}
|
|
|
|
//**********************************************************************
|
|
//
|
|
// CSimpleSite::AddRef
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Increments the reference count of the container Site.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// None
|
|
//
|
|
// Return Value:
|
|
//
|
|
// ULONG - The new reference count of the site.
|
|
//
|
|
// Function Calls:
|
|
// Function Location
|
|
//
|
|
// OutputDebugString Windows API
|
|
//
|
|
// Comments:
|
|
//
|
|
//********************************************************************
|
|
|
|
STDMETHODIMP_(ULONG) CSimpleSite::AddRef()
|
|
{
|
|
DEBUGOUT(L"In CSimpleSite::AddRef\r\n");
|
|
|
|
return ++m_nCount;
|
|
}
|
|
|
|
//**********************************************************************
|
|
//
|
|
// CSimpleSite::Release
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Decrements the reference count of the container Site
|
|
//
|
|
// Parameters:
|
|
//
|
|
// None
|
|
//
|
|
// Return Value:
|
|
//
|
|
// ULONG - The new reference count of the Site.
|
|
//
|
|
// Function Calls:
|
|
// Function Location
|
|
//
|
|
// OutputDebugString Windows API
|
|
//
|
|
// Comments:
|
|
//
|
|
//********************************************************************
|
|
|
|
STDMETHODIMP_(ULONG) CSimpleSite::Release()
|
|
{
|
|
DEBUGOUT(L"In CSimpleSite::Release\r\n");
|
|
|
|
if (--m_nCount == 0) {
|
|
delete this;
|
|
return 0;
|
|
}
|
|
HEAPVALIDATE();
|
|
return m_nCount;
|
|
}
|
|
|
|
//**********************************************************************
|
|
//
|
|
// CSimpleSite::InitObject
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Used to initialize a newly create object (can't be done in the
|
|
// constructor).
|
|
//
|
|
// Parameters:
|
|
//
|
|
// BOOL fCreateNew - TRUE if insert NEW object
|
|
// FALSE if create object FROM FILE
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None
|
|
//
|
|
// Function Calls:
|
|
// Function Location
|
|
//
|
|
// IOleObject::SetHostNames Object
|
|
// IOleObject::QueryInterface Object
|
|
// IViewObject2::GetExtent Object
|
|
// IOleObject::DoVerb Object
|
|
// IViewObject::SetAdvise Object
|
|
// IViewObject::Release Object
|
|
// GetClientRect Windows API
|
|
// OleSetContainedObject OLE API
|
|
//
|
|
// Comments:
|
|
//
|
|
//********************************************************************
|
|
|
|
void CSimpleSite::InitObject(BOOL fCreateNew)
|
|
{
|
|
LPVIEWOBJECT2 lpViewObject2;
|
|
RECT rect;
|
|
|
|
// Set a View Advise
|
|
m_lpOleObject->QueryInterface(IID_IViewObject2,(LPVOID FAR *)&lpViewObject2);
|
|
lpViewObject2->SetAdvise(m_dwDrawAspect, ADVF_PRIMEFIRST, &m_AdviseSink);
|
|
|
|
// get the initial size of the object
|
|
lpViewObject2->GetExtent(m_dwDrawAspect, -1 /*lindex*/, NULL /*ptd*/, &m_sizel);
|
|
GetObjRect(&rect); // get the rectangle of the object in pixels
|
|
lpViewObject2->Release();
|
|
|
|
// give the object the name of the container app/document
|
|
m_lpOleObject->SetHostNames(L"Simple Application", L"Simple OLE 2.0 In-Place Container");
|
|
|
|
// inform object handler/DLL object that it is used in the embedding container's context
|
|
OleSetContainedObject(m_lpOleObject, TRUE);
|
|
|
|
if (fCreateNew) {
|
|
// force new object to save to guarantee valid object in our storage.
|
|
// OLE 1.0 objects may close w/o saving. this is NOT necessary if the
|
|
// object is created FROM FILE; its data in storage is already valid.
|
|
m_OleClientSite.SaveObject();
|
|
|
|
// we only want to DoVerb(SHOW) if this is an InsertNew object.
|
|
// we should NOT DoVerb(SHOW) if the object is created FromFile.
|
|
m_lpOleObject->DoVerb(
|
|
OLEIVERB_SHOW,
|
|
NULL,
|
|
&m_OleClientSite,
|
|
-1,
|
|
m_lpDoc->m_hDocWnd,
|
|
&rect);
|
|
}
|
|
}
|
|
|
|
//**********************************************************************
|
|
//
|
|
// CSimpleSite::PaintObj
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Paints the object
|
|
//
|
|
// Parameters:
|
|
//
|
|
// HDC hDC - Device context of the document window
|
|
//
|
|
// Return Value:
|
|
//
|
|
// Function Calls:
|
|
// Function Location
|
|
//
|
|
// IOleObject::QueryInterface Object
|
|
// IViewObject::GetColorSet Object
|
|
// IViewObject::Release Object
|
|
// SetMapMode Windows API
|
|
// LPtoDP Windows API
|
|
// CreateHatchBrush Windows API
|
|
// SelectObject Windows API
|
|
// DeleteObject Windows API
|
|
// CreatePalette Windows API
|
|
// SelectPalette Windows API
|
|
// RealizePalette Windows API
|
|
// OleStdFree OUTLUI Function
|
|
// OleDraw OLE API
|
|
//
|
|
// Comments:
|
|
//
|
|
//********************************************************************
|
|
|
|
void CSimpleSite::PaintObj(HDC hDC)
|
|
{
|
|
RECT rect;
|
|
|
|
// need to check to make sure there is a valid object
|
|
// available. This is needed if there is a paint msg
|
|
// between the time that CSimpleSite is instantiated
|
|
// and OleUIInsertObject returns.
|
|
if (!m_lpOleObject)
|
|
return;
|
|
|
|
// convert it to pixels
|
|
GetObjRect(&rect);
|
|
|
|
LPLOGPALETTE pColorSet = NULL;
|
|
LPVIEWOBJECT lpView = NULL;
|
|
|
|
// get a pointer to IViewObject
|
|
m_lpOleObject->QueryInterface(IID_IViewObject,(LPVOID FAR *) &lpView);
|
|
|
|
// draw the object
|
|
OleDraw(m_lpOleObject, m_dwDrawAspect, hDC, &rect);
|
|
#if 0
|
|
// if the object is open, draw a hatch rect.
|
|
if (m_fObjectOpen)
|
|
{
|
|
HBRUSH hBrush = CreateHatchBrush ( HS_BDIAGONAL, RGB(0,0,0) );
|
|
HBRUSH hOldBrush = SelectObject (hDC, hBrush);
|
|
SetROP2(hDC, R2_MASKPEN);
|
|
Rectangle (hDC, rect.left, rect.top, rect.right, rect.bottom);
|
|
SelectObject(hDC, hOldBrush);
|
|
DeleteObject(hBrush);
|
|
}
|
|
#endif
|
|
|
|
// if a view pointer was successfully returned, it needs to be released.
|
|
if (lpView)
|
|
lpView->Release();
|
|
}
|
|
|
|
#define HIMETRIC_PER_INCH 2540 // number HIMETRIC units per inch
|
|
#define PTS_PER_INCH 72 // number points (font size) per inch
|
|
#define MAP_PIX_TO_LOGHIM(x,ppli) MulDiv(HIMETRIC_PER_INCH, (x), (ppli))
|
|
#define MAP_LOGHIM_TO_PIX(x,ppli) MulDiv((ppli), (x), HIMETRIC_PER_INCH)
|
|
|
|
STDAPI_(int) XformWidthInHimetricToPixels(HDC hDC, int iWidthInHiMetric)
|
|
{
|
|
int iXppli; //Pixels per logical inch along width
|
|
int iWidthInPix;
|
|
BOOL fSystemDC=FALSE;
|
|
|
|
if (NULL==hDC)
|
|
{
|
|
hDC=GetDC(NULL);
|
|
fSystemDC=TRUE;
|
|
}
|
|
|
|
iXppli = GetDeviceCaps (hDC, LOGPIXELSX);
|
|
|
|
//We got logical HIMETRIC along the display, convert them to pixel units
|
|
iWidthInPix = MAP_LOGHIM_TO_PIX(iWidthInHiMetric, iXppli);
|
|
|
|
if (fSystemDC)
|
|
ReleaseDC(NULL, hDC);
|
|
|
|
return iWidthInPix;
|
|
}
|
|
|
|
|
|
STDAPI_(int) XformHeightInHimetricToPixels(HDC hDC, int iHeightInHiMetric)
|
|
{
|
|
int iYppli; //Pixels per logical inch along height
|
|
int iHeightInPix;
|
|
BOOL fSystemDC=FALSE;
|
|
|
|
if (NULL==hDC)
|
|
{
|
|
hDC=GetDC(NULL);
|
|
fSystemDC=TRUE;
|
|
}
|
|
|
|
iYppli = GetDeviceCaps (hDC, LOGPIXELSY);
|
|
|
|
//* We got logical HIMETRIC along the display, convert them to pixel units
|
|
iHeightInPix = MAP_LOGHIM_TO_PIX(iHeightInHiMetric, iYppli);
|
|
|
|
if (fSystemDC)
|
|
ReleaseDC(NULL, hDC);
|
|
|
|
return iHeightInPix;
|
|
}
|
|
|
|
|
|
//**********************************************************************
|
|
//
|
|
// CSimpleSite::GetObjRect
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Retrieves the rect of the object in pixels
|
|
//
|
|
// Parameters:
|
|
//
|
|
// LPRECT lpRect - Rect structure filled with object's rect in pixels
|
|
//
|
|
// Return Value:
|
|
//
|
|
// Function Calls:
|
|
// Function Location
|
|
//
|
|
// XformWidthInHimetricToPixels OUTLUI Function
|
|
// XformHeightInHimetricToPixels OUTLUI Function
|
|
//
|
|
// Comments:
|
|
//
|
|
//********************************************************************
|
|
|
|
void CSimpleSite::GetObjRect(LPRECT lpRect)
|
|
{
|
|
// convert it to pixels
|
|
lpRect->left = lpRect->top = 0;
|
|
lpRect->right = XformWidthInHimetricToPixels(NULL,(int)m_sizel.cx);
|
|
lpRect->bottom = XformHeightInHimetricToPixels(NULL,(int)m_sizel.cy);
|
|
}
|
|
|
|
|
|
|
|
|
|
|