mirror of https://github.com/tongzx/nt5src
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.
688 lines
16 KiB
688 lines
16 KiB
//**********************************************************************
|
|
// 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);
|
|
}
|