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

📄 textobject.cpp

📁 复合文档范例-比较文本
💻 CPP
字号:
// TextObject.cpp : implementation file
//

#include "stdafx.h"
#include "TextComp.h"
#include "TextObject.h"

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

/////////////////////////////////////////////////////////////////////////////
// CTextObject

IMPLEMENT_DYNCREATE(CTextObject, CCmdTarget)

CTextObject::CTextObject()
{
	EnableAutomation();
	
	// To keep the application running as long as an OLE automation 
	//	object is active, the constructor calls AfxOleLockApp.
	
	AfxOleLockApp();
}

CTextObject::~CTextObject()
{
	// To terminate the application when all objects created with
	// 	with OLE automation, the destructor calls AfxOleUnlockApp.
	
	AfxOleUnlockApp();
}


void CTextObject::OnFinalRelease()
{
	// When the last reference for an automation object is released
	// OnFinalRelease is called.  The base class will automatically
	// deletes the object.  Add additional cleanup required for your
	// object before calling the base class.

	CCmdTarget::OnFinalRelease();
}


BEGIN_MESSAGE_MAP(CTextObject, CCmdTarget)
	//{{AFX_MSG_MAP(CTextObject)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

BEGIN_DISPATCH_MAP(CTextObject, CCmdTarget)
	//{{AFX_DISPATCH_MAP(CTextObject)
	DISP_PROPERTY_EX(CTextObject, "Text", GetText, SetText, VT_VARIANT)
	//}}AFX_DISPATCH_MAP
END_DISPATCH_MAP()


// Note: we add support for IID_ITextObject to support typesafe binding
//  from VBA.  This IID must match the GUID that is attached to the 
//  dispinterface in the .ODL file.

// {2671E622-5AB0-4347-A9F2-01CFB70D67CD}
static const IID IID_ITextObject =
{ 0x2671e622, 0x5ab0, 0x4347, { 0xa9, 0xf2, 0x1, 0xcf, 0xb7, 0xd, 0x67, 0xcd } };

BEGIN_INTERFACE_MAP(CTextObject, CCmdTarget)
	INTERFACE_PART(CTextObject,IID_IPersistStream,PersistStream)
	INTERFACE_PART(CTextObject, IID_ITextObject, Dispatch)
END_INTERFACE_MAP()


// {F24D0757-0AEE-41F1-88D0-63D2486F0BE8}
IMPLEMENT_OLECREATE(CTextObject, "Text.Object", 0xf24d0757, 0xaee, 0x41f1, 0x88, 0xd0, 0x63, 0xd2, 0x48, 0x6f, 0xb, 0xe8)

/////////////////////////////////////////////////////////////////////////////
// CTextObject message handlers

VARIANT CTextObject::GetText() 
{
	//VARIANT vaResult;
	//VariantInit(&vaResult);
	// TODO: Add your property handler here
	return COleVariant(m_pText).Detach();
	//return vaResult;
}

void CTextObject::SetText(const VARIANT FAR& newValue) 
{
	// TODO: Add your property handler here
	CString strTemp;
	ASSERT(newValue.vt == VT_BSTR);
	if(m_pText != NULL){
		delete [] m_pText;
	}
	strTemp = newValue.bstrVal;
	m_pText = new char[strTemp.GetLength()+1];
	strcpy(m_pText,strTemp);
}


////////////////////////////////////////////////////////////////

STDMETHODIMP_(ULONG) CTextObject::XPersistStream::AddRef()
{
	METHOD_PROLOGUE(CTextObject,PersistStream)
	return (ULONG)pThis->ExternalAddRef();
}

STDMETHODIMP_(ULONG) CTextObject::XPersistStream::Release()
{
	METHOD_PROLOGUE(CTextObject,PersistStream)
	return (ULONG)pThis->ExternalRelease();
}

STDMETHODIMP CTextObject::XPersistStream::QueryInterface(REFIID iid,void FAR* FAR* ppvObj)
{
	METHOD_PROLOGUE(CTextObject,PersistStream)
	return (ULONG)pThis->ExternalQueryInterface(&iid,ppvObj);
}

////////////////////////////////////////////////////////////////

STDMETHODIMP CTextObject::XPersistStream::GetClassID(LPCLSID lpClassID)
{
	METHOD_PROLOGUE(CTextObject,PersistStream)
	ASSERT_VALID(pThis);

	*lpClassID = CTextObject::guid;
	return NOERROR;
}

STDMETHODIMP CTextObject::XPersistStream::IsDirty()
{
	METHOD_PROLOGUE(CTextObject,PersistStream)
	ASSERT_VALID(pThis);
	return NOERROR;
}

STDMETHODIMP CTextObject::XPersistStream::Load(LPSTREAM pStm)
{
	ULONG nLength;
	STATSTG statstg;

	METHOD_PROLOGUE(CTextObject,PersistStream)
	ASSERT_VALID(pThis);
	if(pThis->m_pText != NULL)	{
		delete []pThis->m_pText;
	}

	//don't need to free
	VERIFY(pStm->Stat(&statstg,STATFLAG_NONAME) == NOERROR);
	int nSize = statstg.cbSize.LowPart;
	if(nSize > 0){
		pThis->m_pText = new char[nSize];
		pStm->Read(pThis->m_pText,nSize,&nLength);
	}
	return NOERROR;
}

STDMETHODIMP CTextObject::XPersistStream::Save(LPSTREAM pStm,BOOL fClearDirty)
{
	METHOD_PROLOGUE(CTextObject,PersistStream)
	ASSERT_VALID(pThis);
	int nSize = strlen(pThis->m_pText) + 1;
	pStm->Write(pThis->m_pText,nSize,NULL);
	return NOERROR;
}

STDMETHODIMP CTextObject::XPersistStream::GetSizeMax(ULARGE_INTEGER FAR* pcbSize)
{
	METHOD_PROLOGUE(CTextObject,PersistStream)
	ASSERT_VALID(pThis);
	pcbSize->LowPart = strlen(pThis->m_pText) + 1;
	pcbSize->HighPart = 0;
	return NOERROR;
}

///////////////////////////////////////////////////////////
/*
STDMETHODIMP_(ULONG) CTextObject::XDispatch::AddRef()
{
	METHOD_PROLOGUE(CTextObject,Dispatch)
	return (ULONG)pThis->ExternalAddRef();
}


STDMETHODIMP_(ULONG) CTextObject::XDispatch::Release()
{
	METHOD_PROLOGUE(CTextObject,Dispatch)
	return (ULONG)pThis->ExternalRelease();
}

STDMETHODIMP CTextObject::XDispatch::QueryInterface(REFIID iid,void FAR* FAR* ppvObj)
{
	METHOD_PROLOGUE(CTextObject,Dispatch)
	return (ULONG)pThis->ExternalQueryInterface(&iid,ppvObj);
}

STDMETHODIMP CTextObject::XDispatch::GetTypeInfoCount(UINT *pctinfo)
{
//	METHOD_PROLOGUE(CTextObject,Dispatch)
//	return (ULONG)pThis->ExternalGetTypeInfoCount(pctinfo);
	return NOERROR;
}

STDMETHODIMP CTextObject::XDispatch::GetTypeInfo(UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo)
{
	return NOERROR;
}

STDMETHODIMP CTextObject::XDispatch::GetIDsOfNames(REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId)
{
	return NOERROR;
}

STDMETHODIMP CTextObject::XDispatch::Invoke(DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,
											VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr)
{
	return NOERROR;
}
*/

⌨️ 快捷键说明

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