WindowsXP-SP1/com/oleutest/simpsvr/doc.cpp
2020-09-30 16:53:49 +02:00

689 lines
16 KiB
C++

//**********************************************************************
// File name: DOC.CPP
//
// Implementation file for CSimpSvrDoc.
//
// Functions:
//
// See DOC.H for Class Definition
//
// Copyright (c) 1993 Microsoft Corporation. All rights reserved.
//**********************************************************************
#include "pre.h"
#include "obj.h"
#include "app.h"
#include "doc.h"
//**********************************************************************
//
// CSimpSvrDoc::Create
//
// Purpose:
//
// Creation for the CSimpSvrDoc Class
//
// Parameters:
//
// CSimpSvrApp FAR * lpApp - Pointer to the CSimpSvrApp Class
//
// LPRECT lpRect - Client area rect of "frame" window
//
// HWND hWnd - Window Handle of "frame" window
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// StgCreateDocfile OLE API
// CreateWindow Windows API
// ShowWindow Windows API
// UpdateWindow Windows API
// CSimpSvrDoc::CSimpSvrDoc DOC.CPP
// CreateHatchWindow OLE2UI
//
// Comments:
//
// This routine was added so that failure could be returned
// from object creation.
//
//********************************************************************
CSimpSvrDoc FAR * CSimpSvrDoc::Create(CSimpSvrApp FAR *lpApp, LPRECT lpRect,HWND hWnd)
{
CSimpSvrDoc FAR * lpTemp = new CSimpSvrDoc(lpApp, hWnd);
if (!lpTemp)
return NULL;
// create the document Window
lpTemp->m_hDocWnd = CreateWindow(
TEXT("DocWClass"),
NULL,
WS_CHILD | WS_CLIPSIBLINGS,
lpRect->left,
lpRect->top,
lpRect->right,
lpRect->bottom,
hWnd,
NULL,
lpApp->GethInst(),
NULL);
if (!lpTemp->m_hDocWnd)
goto error;
lpTemp->ShowDocWnd();
lpTemp->m_hHatchWnd = CreateHatchWindow( lpTemp->m_hDocWnd, lpApp->GethInst());
lpTemp->HideHatchWnd();
return (lpTemp);
error:
delete (lpTemp);
return NULL;
}
//**********************************************************************
//
// CSimpSvrDoc::CSimpSvrDoc
//
// Purpose:
//
// Constructor for the CSimpSvrDoc Class
//
// Parameters:
//
// CSimpSvrApp FAR * lpApp - Pointer to the CSimpSvrApp Class
//
// HWND hWnd - Window Handle of "frame" window
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
// GetMenu Windows API
// GetSubMenu Windows API
//
// Comments:
//
//********************************************************************
CSimpSvrDoc::CSimpSvrDoc(CSimpSvrApp FAR * lpApp,HWND hWnd)
{
TestDebugOut(TEXT("In CSimpSvrDoc's Constructor\r\n"));
m_lpApp = lpApp;
m_nCount = 0;
m_lpObj = NULL;
// set up menu handles
m_hMainMenu = GetMenu(hWnd);
m_hColorMenu = GetSubMenu(m_hMainMenu, 1);
m_hHelpMenu = GetSubMenu(m_hMainMenu, 2);
}
//**********************************************************************
//
// CSimpSvrDoc::~CSimpSvrDoc
//
// Purpose:
//
// Destructor for CSimpSvrDoc
//
// Parameters:
//
// None
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
// DestroyWindow Windows API
// CSimpSvrApp::ClearDoc APP.CPP
//
// Comments:
//
//********************************************************************
CSimpSvrDoc::~CSimpSvrDoc()
{
TestDebugOut(TEXT("In CSimpSvrDoc's Destructor\r\n"));
// Clear the Doc object pointer so that the SimpSvrApp won't be able
// to access invalid objects. (same for the SimpSvrObj)
if (m_lpApp)
m_lpApp->ClearDoc();
if (m_lpObj)
m_lpObj->ClearDoc();
DestroyWindow(m_hHatchWnd);
DestroyWindow(m_hDocWnd);
}
//**********************************************************************
//
// CSimpSvrDoc::QueryInterface
//
// Purpose:
//
// Return a pointer to a requested interface
//
// Parameters:
//
// REFIID riid - ID of interface to be returned
// LPVOID FAR* ppvObj - Location to return the interface
//
// Return Value:
//
// E_NOINTERFACE - Always
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
// CSimpSvrApp::QueryInterface APP.CPP
//
// Comments:
//
// Since the document could contain multiple objects, all
// interfaces except those associated with the document should
// be returned. In this implementation, there are no doc level
// interfaces.
//
//********************************************************************
STDMETHODIMP CSimpSvrDoc::QueryInterface(REFIID riid, LPVOID FAR* ppvObj)
{
TestDebugOut(TEXT("In CSimpSvrDoc::QueryInterface\r\n"));
SCODE sc = E_NOINTERFACE;
if (IsEqualIID(riid, IID_IUnknown))
{
AddRef();
*ppvObj = this;
sc = S_OK;
}
return ResultFromScode(sc);
}
//**********************************************************************
//
// CSimpSvrDoc::AddRef
//
// Purpose:
//
// Increments the document level reference count
//
// Parameters:
//
// None
//
// Return Value:
//
// UINT - The current reference count on the document
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
// CSimpSvrApp::AddRef APP.CPP
//
// Comments:
//
// The reference count at this level reflects the total ref.
// count of all interfaces on all objects contained within
// this document. Note that it also "trickles up" the
// ref count to the app level.
//
//********************************************************************
STDMETHODIMP_(ULONG) CSimpSvrDoc::AddRef()
{
TestDebugOut(TEXT("In CSimpSvrDoc::AddRef\r\n"));
// AddRef the app, but return the doc count
m_lpApp->AddRef();
return ++m_nCount;
}
//**********************************************************************
//
// CSimpSvrDoc::Release
//
// Purpose:
//
// Decrements the document level reference count
//
// Parameters:
//
// None
//
// Return Value:
//
// UINT - The current reference count on the document
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
// CSimpSvrApp::Release APP.CPP
//
// Comments:
//
// The reference count at this level reflects the total ref.
// count of all interfaces on all objects contained within
// this document. Note that it also "trickles up" the
// ref count to the app level.
//
//********************************************************************
STDMETHODIMP_(ULONG) CSimpSvrDoc::Release()
{
TestDebugOut(TEXT("In CSimpSvrDoc::Release\r\n"));
// Release the app, but return the app count
m_lpApp->Release();
if (--m_nCount== 0)
{
delete this;
return(0);
}
return m_nCount;
}
//**********************************************************************
//
// CSimpSvrDoc::lResizeDoc
//
// Purpose:
//
// Resizes the document
//
// Parameters:
//
// LPRECT lpRect - The size of the client are of the "frame"
// Window.
//
// Return Value:
//
// NULL
//
// Function Calls:
// Function Location
//
// MoveWindow Windows API
//
//
//********************************************************************
long CSimpSvrDoc::lResizeDoc(LPRECT lpRect)
{
MoveWindow(m_hDocWnd, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, TRUE);
return NULL;
}
//**********************************************************************
//
// CSimpSvrDoc::PaintDoc
//
// Purpose:
//
// Paints the Document
//
// Parameters:
//
// HDC hDC - hDC of the document Window
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// CSimpSvrObj::Draw OBJ.CPP
// CSimpSvrObj::GetDataAdviseHolder OBJ.H
// CSimpSvrObj::GetDataObject OBJ.H
// CSimpAppObj::IsStartedByOle APP.CPP
// IDataAdviseHolder::SendOnDataChange OLE API
//
//
//********************************************************************
void CSimpSvrDoc::PaintDoc (HDC hDC)
{
// if the object hasn't been created yet, then don't draw
if (m_lpObj)
m_lpObj->Draw(hDC,FALSE);
else
return;
// Sending a data change every time we paint, but only if we
// were started by OLE
if (m_lpApp->IsStartedByOle())
m_lpObj->SendOnDataChange( );
}
//**********************************************************************
//
// CSimpSvrDoc::CreateObject
//
// Purpose:
// Handles the creation of a SimpSvrObj.
//
// Parameters:
//
//
// Return Value:
//
// S_OK if the function succeeds, otherwise E_FAIL
//
// Function Calls:
// Function Location
//
// CSimpSvrObj::CSimpSvrObj OBJ.CPP
// CSimpSvrOjb::QueryInterface OBJ.CPP
//
//
//********************************************************************
HRESULT CSimpSvrDoc::CreateObject(REFIID riid, LPVOID FAR *ppvObject)
{
SCODE sc = E_FAIL;
m_lpObj = new CSimpSvrObj(this);
if (m_lpObj)
{
m_lpObj->QueryInterface(riid, ppvObject);
sc = S_OK;
}
return ResultFromScode(sc);
}
//**********************************************************************
//
// CSimpSvrDoc::Close
//
// Purpose:
//
// Closes the object
//
// Parameters:
//
// None
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
// CSimpSvrObj::AddRef OBJ.CPP
// CSimpSvrObj::Release OBJ.CPP
// CSimpSvrObj::IsInPlaceActive OBJ.H
// CSimpSvrObj::GetOleInPlaceObject OBJ.H
// CSimpSvrObj::ClearOleClientSite OBJ.H
// CSimpSvrObj::GetDataAdviseHolder OBJ.H
// CSimpSvrObj::GetOleClientSite OBJ.H
// CSimpSvrObj::ClearDataAdviseHolder OBJ.H
// CSimpSvrObj::GetOleAdviseHolder OBJ.H
// CSimpSvrObj::ClearOleAdviseHolder OBJ.H
// IOleInPlaceObject::InPlaceDeactivate Container
// IOleClientSite::SaveObject Container
// IOleClientSite::OnShowWindow Container
// IOleClientSite::Release Container
// IDataAdviseHolder::SendOnDataChange OLE
// IDataAdviseHolder::Release OLE
// IOleAdviseHolder::SendOnClose OLE
// IOleAdviseHolder::Release OLE
//
//
//********************************************************************
void CSimpSvrDoc::Close()
{
TestDebugOut(TEXT("In CSimpSvrDoc::Close() \r\n"));
m_lpObj->AddRef(); // hold object alive
// if the object is currently inplace active, then deactivate
if (m_lpObj->IsInPlaceActive())
m_lpObj->GetOleInPlaceObject()->InPlaceDeactivate();
// unregister from the ROT...
if (m_lpObj->GetRotRegister())
{
LPRUNNINGOBJECTTABLE lpRot;
if (GetRunningObjectTable (0, &lpRot) == NOERROR )
{
lpRot->Revoke(m_lpObj->GetRotRegister());
lpRot->Release();
}
}
// if we have a clientsite, instruct it to save the object
if (m_lpObj->GetOleClientSite())
{
m_lpObj->GetOleClientSite()->SaveObject();
m_lpObj->GetOleClientSite()->OnShowWindow(FALSE);
}
// Do a final SendOnDataChange for those containers that have specified the
// ADF_DATAONSTOP flag.
if (m_lpObj->GetDataAdviseHolder())
{
m_lpObj->GetDataAdviseHolder()->SendOnDataChange( m_lpObj->GetDataObject(), 0, ADVF_DATAONSTOP);
}
// Tell the container that we are shutting down.
if (m_lpObj->GetOleAdviseHolder())
{
m_lpObj->GetOleAdviseHolder()->SendOnClose();
}
// release our streams and storage
m_lpObj->GetPersistStorage()->ReleaseStreamsAndStorage();
// Disconnect the object. NOTE: This call should not do anything
// unless the container has cause a GP Fault or some other problem
// has occured...
TestDebugOut(TEXT("*** Before CoDisconnectObject *** \r\n"));
CoDisconnectObject((LPUNKNOWN)m_lpObj, 0);
TestDebugOut(TEXT("*** After CoDisconnectObject *** \r\n"));
m_lpObj->Release(); // let object close
}
//**********************************************************************
//
// CSimpSvrDoc::SetStatusText
//
// Purpose:
//
// Sets the Container's status bar text
//
// Parameters:
//
// None
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// CSimpSvrObj::IsInPlaceActive OBJ.CPP
// IOleInPlaceFrame::SetStatusText Container
//
// Comments:
//
// Even though there is no status line in this sample, this
// method must be called on WM_MENUSELECT to clear the last
// message in the status line.
//
//********************************************************************
void CSimpSvrDoc::SetStatusText()
{
if (m_lpObj->IsInPlaceActive())
m_lpObj->GetInPlaceFrame()->SetStatusText(OLESTR("\0"));
}
//**********************************************************************
//
// CSimpSvrDoc::ShowDocWnd
//
// Purpose:
//
// Shows the Document Window
//
// Parameters:
//
// None
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// ShowWindow Windows API
// UpdateWindow Windows API
//
// Comments:
//
//********************************************************************
void CSimpSvrDoc::ShowDocWnd()
{
ShowWindow(m_hDocWnd, SW_SHOWNORMAL); // Show the window
UpdateWindow(m_hDocWnd); // Sends WM_PAINT message
}
//**********************************************************************
//
// CSimpSvrDoc::ShowHatchWnd
//
// Purpose:
//
// Shows the hatch Window
//
// Parameters:
//
// None
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// ShowWindow Windows API
//
// Comments:
//
//********************************************************************
void CSimpSvrDoc::ShowHatchWnd()
{
ShowWindow(m_hHatchWnd, SW_SHOW);
}
//**********************************************************************
//
// CSimpSvrDoc::HideDocWnd
//
// Purpose:
//
// Hides the DocumentWindow
//
// Parameters:
//
// None
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// ShowWindow Windows API
//
// Comments:
//
//********************************************************************
void CSimpSvrDoc::HideDocWnd()
{
ShowWindow(m_hDocWnd, SW_HIDE);
}
//**********************************************************************
//
// CSimpSvrDoc::HideHatchWnd
//
// Purpose:
//
// Hides the Hatch Window
//
// Parameters:
//
// None
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// ShowWindow Windows API
//
// Comments:
//
//********************************************************************
void CSimpSvrDoc::HideHatchWnd()
{
ShowWindow(m_hHatchWnd, SW_HIDE);
}