📄 ex27cdoc.cpp
字号:
// 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 + -