📄 textobject.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 + -