опубликован 12-12-2001 19:20 MSK
Держи:#ifndef __YTEXT_H
#define __YTEXT_H
#include <afxcoll.h>
#include <afxrich.h>
/////////////////////////////////////////////////////////////////////////////
// Text collection
class CSimpleText;
class CRichEditText;
/////////////////////////////////////////////////////////////////////////////
// CSimpleText
class CSimpleText
{
protected:
void* m_pText;
UINT m_nSize;
public:
CSimpleText();
~CSimpleText();
Create(const void* pBuffer, UINT nSize);
Save(LPCTSTR szFileName) const;
Load(LPCTSTR szFileName);
const void* GetText() const
{return (m_pText);}
UINT GetSize() const
{return (m_nSize);}
};
/////////////////////////////////////////////////////////////////////////////
// CRichEditText
class CRichEditText : public CSimpleText
{
public:
CRichEditText();
GetRichEditCtrl(CRichEditCtrl* pRichEdit);
SetRichEditCtrl(CRichEditCtrl* pRichEdit);
protected:
static DWORD CALLBACK EditStreamCallback(
DWORD dwCookie, // application-defined value
LPBYTE pbBuff, // pointer to a buffer
LONG cb, // number of bytes to read or write
LONG *pcb // pointer to number of bytes transferred
);
DWORD GetCallback(LPBYTE pbBuff, LONG cb, LONG *pcb);
DWORD SetCallback(LPBYTE pbBuff, LONG cb, LONG *pcb);
int m_isRead;
ULONG m_nOffset;
};
#endif//__YTEXT_H
#include "stdafx.h"
#include "YText.h"
/////////////////////////////////////////////////////////////////////////////
// CSimpleText
CSimpleText::CSimpleText()
{
m_pText = NULL;
m_nSize = 0;
}
CSimpleText::~CSimpleText()
{
if(m_pText!=NULL)
throwed_free(m_pText);
}
CSimpleText::Create(const void* pBuffer, UINT nSize)
{
m_pText = throwed_malloc(nSize,&m_pText);
m_nSize = nSize;
memcpy(m_pText,pBuffer,nSize);
return 0;
}
CSimpleText::Save(LPCTSTR szFileName) const
{
CFile file(szFileName,CFile::modeCreate|CFile::modeWrite);
file.Write(m_pText,m_nSize);
file.Close();
return 0;
}
CSimpleText::Load(LPCTSTR szFileName)
{
if(m_pText!=NULL)
{ throwed_free(m_pText); m_nSize = 0; }
CFile file(szFileName,CFile::modeRead);
m_nSize = file.GetLength();
m_pText = throwed_malloc(m_nSize);
file.Read(m_pText,m_nSize);
file.Close();
return 0;
}
/////////////////////////////////////////////////////////////////////////////
// CRichEditText
CRichEditText::CRichEditText()
{
}
CRichEditText::GetRichEditCtrl(CRichEditCtrl* pRichEdit)
{
m_isRead = TRUE;
throwed_free(m_pText);
m_nSize = 0;
EDITSTREAM es;
es.dwCookie = (DWORD)(void*)this;
es.dwError = 0;
es.pfnCallback = CRichEditText::EditStreamCallback;
pRichEdit->StreamOut(SF_RTF,es);
if(es.dwError!=0)
::AfxThrowMemoryException();
return 0;
}
CRichEditText::SetRichEditCtrl(CRichEditCtrl* pRichEdit)
{
m_isRead = FALSE;
m_nOffset = 0;
EDITSTREAM es;
es.dwCookie = (DWORD)(void*)this;
es.dwError = 0;
es.pfnCallback = CRichEditText::EditStreamCallback;
pRichEdit->StreamIn(SF_RTF,es);
if(es.dwError!=0)
::AfxThrowMemoryException();
return 0;
}
DWORD CALLBACK CRichEditText::EditStreamCallback(
DWORD dwCookie, // application-defined value
LPBYTE pbBuff, // pointer to a buffer
LONG cb, // number of bytes to read or write
LONG *pcb // pointer to number of bytes transferred
){
CRichEditText* p = (CRichEditText*)(void*)dwCookie;
if(p->m_isRead)
return p->GetCallback(pbBuff,cb,pcb);
else
return p->SetCallback(pbBuff,cb,pcb);
}
DWORD CRichEditText::GetCallback(LPBYTE pbBuff, LONG cb, LONG *pcb)
{
void *p = m_pText;
if(p==NULL)
p = malloc(cb);
else
p = realloc(p,cb+m_nSize);
if(p==NULL)
return -1;
m_pText = p;
memcpy((LPBYTE)m_pText+m_nSize, pbBuff, cb);
m_nSize += cb;
*pcb = cb;
return 0;
}
DWORD CRichEditText::SetCallback(LPBYTE pbBuff, LONG cb, LONG *pcb)
{
if(m_nOffset+cb>m_nSize)
return -2;
memcpy((LPBYTE)m_pText+m_nOffset, pbBuff, cb);
m_nOffset += cb;
*pcb = cb;
return 0;
}