⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex27cdoc.cpp

📁 VC技术内幕
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ex27cDoc.cpp : implementation of the CEx27cDoc class
//

#include "stdafx.h"
#include "ex27c.h"

#include "ex27cDoc.h"
#include "TextDialog.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CEx27cDoc

IMPLEMENT_DYNCREATE(CEx27cDoc, CDocument)

BEGIN_INTERFACE_MAP(CEx27cDoc, CDocument)
	INTERFACE_PART(CEx27cDoc, IID_IOleObject, OleObject)
	INTERFACE_PART(CEx27cDoc, IID_IDataObject, DataObject)
	INTERFACE_PART(CEx27cDoc, IID_IPersistStorage, PersistStorage)
END_INTERFACE_MAP()

BEGIN_MESSAGE_MAP(CEx27cDoc, CDocument)
	//{{AFX_MSG_MAP(CEx27cDoc)
	ON_COMMAND(ID_MODIFY, OnModify)
	ON_COMMAND(ID_FILE_UPDATE, OnFileUpdate)
	ON_UPDATE_COMMAND_UI(ID_FILE_UPDATE, OnUpdateFileUpdate)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

// CEx27cDoc OLE interface functions
STDMETHODIMP_(ULONG) CEx27cDoc::XOleObject::AddRef()
{
	TRACE("CEx27cDoc::XOleObject::AddRef\n");
	METHOD_PROLOGUE(CEx27cDoc, OleObject)
	return pThis->InternalAddRef();
}

STDMETHODIMP_(ULONG) CEx27cDoc::XOleObject::Release()
{
	TRACE("CEx27cDoc::XOleObject::Release\n");
	METHOD_PROLOGUE(CEx27cDoc, OleObject)
	return pThis->InternalRelease();
}

STDMETHODIMP CEx27cDoc::XOleObject::QueryInterface(
	REFIID iid, LPVOID* ppvObj)
{
	ITrace(iid, "CEx27cDoc::XOleObject::QueryInterface");
	METHOD_PROLOGUE(CEx27cDoc, OleObject)
	return pThis->InternalQueryInterface(&iid, ppvObj);
}

STDMETHODIMP CEx27cDoc::XOleObject::SetClientSite(
	LPOLECLIENTSITE pClientSite)
{
	TRACE("CEx27cDoc::XOleObject::SetClientSite\n");
	METHOD_PROLOGUE(CEx27cDoc, OleObject)
	// linked objects do not support SetClientSite
	if (pClientSite != NULL)
		pClientSite->AddRef();
	if(pThis->m_lpClientSite != NULL) pThis->m_lpClientSite->Release();
	pThis->m_lpClientSite = pClientSite;

	return NOERROR;
}

STDMETHODIMP CEx27cDoc::XOleObject::GetClientSite(
	LPOLECLIENTSITE* ppClientSite)
{
	TRACE("CEx27cDoc::XOleObject::GetClientSite\n");
	METHOD_PROLOGUE(CEx27cDoc, OleObject)

	*ppClientSite = pThis->m_lpClientSite;
        if (pThis->m_lpClientSite != NULL)
                pThis->m_lpClientSite->AddRef();  // IMPORTANT
	return NOERROR;
}

STDMETHODIMP CEx27cDoc::XOleObject::SetHostNames(
	LPCOLESTR szContainerApp, LPCOLESTR szContainerObj)
{
	TRACE("CEx27cDoc::XOleObject::SetHostNames\n");
	METHOD_PROLOGUE(CEx27cDoc, OleObject)
	
	CString strTitle = "EX27C object embedded in ";
	if(szContainerApp != NULL) {
		strTitle += CString(szContainerApp);
	}
	CWnd* pWnd = AfxGetMainWnd();
	pWnd->SetWindowText(strTitle);
	
	return NOERROR;
}

STDMETHODIMP CEx27cDoc::XOleObject::Close(DWORD /*dwSaveOption*/)
{
	TRACE("CEx27cDoc::XOleObject::Close\n");
	// linked objects do not support close

	return E_NOTIMPL;
}

STDMETHODIMP CEx27cDoc::XOleObject::SetMoniker(
	DWORD /*dwWhichMoniker*/, LPMONIKER /*pmk*/)
{
	TRACE("CEx27cDoc::XOleObject::SetMoniker\n");
	// linked objects do not support SetMoniker

	return E_NOTIMPL;
}

STDMETHODIMP CEx27cDoc::XOleObject::GetMoniker(
	DWORD dwAssign, DWORD dwWhichMoniker, LPMONIKER* ppMoniker)
{
	TRACE("CEx27cDoc::XOleObject::GetMoniker\n");
	return E_NOTIMPL;
}

STDMETHODIMP CEx27cDoc::XOleObject::InitFromData(
	LPDATAOBJECT /*pDataObject*/, BOOL /*fCreation*/, DWORD /*dwReserved*/)
{
	TRACE("CEx27cDoc::XOleObject::InitFromData\n");
	// linked objects do not support InitFromData

	return E_NOTIMPL;
}

STDMETHODIMP CEx27cDoc::XOleObject::GetClipboardData(
	DWORD /*dwReserved*/, LPDATAOBJECT* ppDataObject)
{
	TRACE("CEx27cDoc::XOleObject::GetClipboardData\n");
	return E_NOTIMPL;
}

STDMETHODIMP CEx27cDoc::XOleObject::DoVerb(
	LONG iVerb, LPMSG lpmsg, LPOLECLIENTSITE pActiveSite, LONG lindex,
	HWND hwndParent, LPCRECT lpPosRect)
{										 
	TRACE("CEx27cDoc::XOleObject::DoVerb - %d\n", iVerb);
	METHOD_PROLOGUE(CEx27cDoc, OleObject)
	ASSERT_VALID(pThis);

	pThis->InternalAddRef();    // protect this object
	CWnd* pWnd = AfxGetMainWnd();
	switch (iVerb)
	{
	// open - maps to OnOpen
	case OLEIVERB_OPEN:
	case -OLEIVERB_OPEN-1:  // allows positive OLEIVERB_OPEN-1 in registry
	case OLEIVERB_PRIMARY:  // OLEIVERB_PRIMARY is 0 and "Edit" in registry
	case OLEIVERB_SHOW:
		pWnd->ShowWindow(SW_SHOW);
		pWnd->SetActiveWindow();
		pWnd->SetForegroundWindow();
		break;

	// hide maps to OnHide
	case OLEIVERB_HIDE:
	case -OLEIVERB_HIDE-1:  // allows positive OLEIVERB_HIDE-1 in registry
		return E_NOTIMPL;
		
	default:
		// negative verbs not understood should return E_NOTIMPL
		if (iVerb < 0)
			return E_NOTIMPL;

		AfxThrowOleException(OLEOBJ_S_INVALIDVERB);
	}
	pThis->InternalRelease();   // may 'delete this'
	pThis->m_lpClientSite->OnShowWindow(TRUE); // hatch

	return NOERROR;
}

STDMETHODIMP CEx27cDoc::XOleObject::EnumVerbs(
	IEnumOLEVERB** ppenumOleVerb)
{
	TRACE("CEx27cDoc::XOleObject::EnumVerbs\n");
	return E_NOTIMPL;
}

STDMETHODIMP CEx27cDoc::XOleObject::Update()
{
	TRACE("CEx27cDoc::XOleObject::Update\n");
	METHOD_PROLOGUE(CEx27cDoc, OleObject)
	return E_NOTIMPL;
}

STDMETHODIMP CEx27cDoc::XOleObject::IsUpToDate()
{
	TRACE("CEx27cDoc::XOleObject::IsUpToDate\n");
	return E_NOTIMPL;
}

STDMETHODIMP CEx27cDoc::XOleObject::GetUserClassID(CLSID* pClsid)
{
	TRACE("CEx27cDoc::XOleObject::GetUserClassID\n");
	METHOD_PROLOGUE(CEx27cDoc, OleObject)
	ASSERT_VALID(pThis);

	return pThis->m_xPersistStorage.GetClassID(pClsid);
}

STDMETHODIMP CEx27cDoc::XOleObject::GetUserType(
	DWORD dwFormOfType, LPOLESTR* ppszUserType)
{
	TRACE("CEx27cDoc::XOleObject::GetUserType\n");
	METHOD_PROLOGUE(CEx27cDoc, OleObject)
	ASSERT_VALID(pThis);

	*ppszUserType = NULL;

	CLSID clsid;
	pThis->m_xOleObject.GetUserClassID(&clsid);
	return OleRegGetUserType(clsid, dwFormOfType, ppszUserType);
}

STDMETHODIMP CEx27cDoc::XOleObject::SetExtent(
	DWORD /*dwDrawAspect*/, LPSIZEL /*lpsizel*/)
{
	TRACE("CEx27cDoc::XOleObject::SetExtent\n");
	return E_FAIL;
}

STDMETHODIMP CEx27cDoc::XOleObject::GetExtent(
	DWORD dwDrawAspect, LPSIZEL lpsizel)
{
	TRACE("CEx27cDoc::XOleObject::GetExtent\n");
	METHOD_PROLOGUE(CEx27cDoc, OleObject)
	ASSERT_VALID(pThis);
	// handler returns extent in metafilepict
	return E_NOTIMPL;
}

STDMETHODIMP CEx27cDoc::XOleObject::Advise(
	IAdviseSink* pAdvSink, DWORD* pdwConnection)
{
	TRACE("CEx27cDoc::XOleObject::Advise\n");
	METHOD_PROLOGUE(CEx27cDoc, OleObject)
	ASSERT_VALID(pThis);
	*pdwConnection = 0;
	if (pThis->m_lpOleAdviseHolder == NULL &&
		::CreateOleAdviseHolder(&pThis->m_lpOleAdviseHolder) 
		!= NOERROR) {
		return E_OUTOFMEMORY;
	}
	ASSERT(pThis->m_lpOleAdviseHolder != NULL);
	return pThis->m_lpOleAdviseHolder->Advise(pAdvSink, pdwConnection);
}

STDMETHODIMP CEx27cDoc::XOleObject::Unadvise(DWORD dwConnection)
{
	TRACE("CEx27cDoc::XOleObject::Unadvise\n");
	METHOD_PROLOGUE(CEx27cDoc, OleObject)
	ASSERT_VALID(pThis);
	return E_NOTIMPL;
}

STDMETHODIMP CEx27cDoc::XOleObject::EnumAdvise(
	LPENUMSTATDATA* ppenumAdvise)
{
	TRACE("CEx27cDoc::XOleObject::EnumAdvise\n");
	METHOD_PROLOGUE(CEx27cDoc, OleObject)
	ASSERT_VALID(pThis);
	return E_NOTIMPL;
}

STDMETHODIMP CEx27cDoc::XOleObject::GetMiscStatus(
	DWORD dwAspect, DWORD* pdwStatus)
{
	TRACE("CEx27cDoc::XOleObject::GetMiscStatus\n");
	METHOD_PROLOGUE(CEx27cDoc, OleObject)
	ASSERT_VALID(pThis);

	*pdwStatus = 0;

	CLSID clsid;
	pThis->m_xOleObject.GetUserClassID(&clsid);
	return OleRegGetMiscStatus(clsid, dwAspect, pdwStatus);
}

STDMETHODIMP CEx27cDoc::XOleObject::SetColorScheme(LPLOGPALETTE lpLogpal)
{
	TRACE("CEx27cDoc::XOleObject::SetColorScheme\n");
	METHOD_PROLOGUE(CEx27cDoc, OleObject)
	ASSERT_VALID(pThis);

	return E_NOTIMPL;
}

/////////////////////////////////////////////////////////////////////////////
// CEx27cDoc::XDataObject
// delegate many calls to embedded COleDataSource object, which manages formats

STDMETHODIMP_(ULONG) CEx27cDoc::XDataObject::AddRef()
{
	TRACE("CEx27cDoc::XDataObject::AddRef\n");
	METHOD_PROLOGUE(CEx27cDoc, DataObject)
	return pThis->InternalAddRef();
}

STDMETHODIMP_(ULONG) CEx27cDoc::XDataObject::Release()
{
	TRACE("CEx27cDoc::XDataObject::Release\n");
	METHOD_PROLOGUE(CEx27cDoc, DataObject)
	return pThis->InternalRelease();
}

STDMETHODIMP CEx27cDoc::XDataObject::QueryInterface(
	REFIID iid, LPVOID* ppvObj)
{
	ITrace(iid, "CEx27cDoc::XDataObject::QueryInterface");
	METHOD_PROLOGUE(CEx27cDoc, DataObject)
	return pThis->InternalQueryInterface(&iid, ppvObj);
}

STDMETHODIMP CEx27cDoc::XDataObject::GetData(
	LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium)
{
	TRACE("CEx27cDoc::XDataObject::GetData -- %d\n", 
		  lpFormatEtc->cfFormat);
	METHOD_PROLOGUE(CEx27cDoc, DataObject)
	ASSERT_VALID(pThis);
	
	if(lpFormatEtc->cfFormat != CF_METAFILEPICT) {
		return S_FALSE;
	}
	HGLOBAL hPict = pThis->MakeMetaFile();
	lpStgMedium->tymed = TYMED_MFPICT;
	lpStgMedium->hMetaFilePict = hPict;
	lpStgMedium->pUnkForRelease = NULL;
	return S_OK;
}

STDMETHODIMP CEx27cDoc::XDataObject::GetDataHere(
	LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium)
{
	TRACE("CEx27cDoc::XDataObject::GetDataHere\n");
	METHOD_PROLOGUE(CEx27cDoc, DataObject)
	ASSERT_VALID(pThis);
	return E_NOTIMPL;
}

STDMETHODIMP CEx27cDoc::XDataObject::QueryGetData(LPFORMATETC lpFormatEtc)
{
	TRACE("CEx27cDoc::XDataObject::QueryGetData -- %d\n", lpFormatEtc->cfFormat);
	METHOD_PROLOGUE(CEx27cDoc, DataObject)
	ASSERT_VALID(pThis);
	if(lpFormatEtc->cfFormat != CF_METAFILEPICT) {
		return S_FALSE;
	}
	return S_OK;
}

STDMETHODIMP CEx27cDoc::XDataObject::GetCanonicalFormatEtc(
	LPFORMATETC /*lpFormatEtcIn*/, LPFORMATETC /*lpFormatEtcOut*/)
{
	TRACE("CEx27cDoc::XDataObject::GetCanonicalFormatEtc\n");
	return DATA_S_SAMEFORMATETC;
}

STDMETHODIMP CEx27cDoc::XDataObject::SetData(
	LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium, BOOL bRelease)
{
	TRACE("CEx27cDoc::XDataObject::SetData\n");
	METHOD_PROLOGUE(CEx27cDoc, DataObject)
	ASSERT_VALID(pThis);
	return E_NOTIMPL;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -