WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Как достать RTF из RichEdit'a (Win32API)

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Как достать RTF из RichEdit'a (Win32API)
SUnteXx опубликован 04-12-2001 23:59 MSK   Click Here to See the Profile for SUnteXx   Click Here to Email SUnteXx  
Я не могу понять как можно определить размер текста (в РТФ формате) в RichEdit'e, ведь текст в РТФ весит в несколько раз больше, чем простой! Как можно это реализовать (не доставая текст и не считая самому сколько он весит (использую CallBack ф-цию))?

Попутно вопрос, как можно самому заслать текст (в РТФ формате) в RichEdit. Я знаю, что можно заслать при помощи StreamIn/StreamOut, но не знаю как точно, пробовал - не получалось!

Подскажите кто чем может, а если кто-нить сможет - привидите пример (желательно на АПИ, но не обязательно)!

SUnteXx опубликован 06-12-2001 02:12 MSK     Click Here to See the Profile for SUnteXx  Click Here to Email SUnteXx     
Может кто идею подскажит?
Jack опубликован 06-12-2001 09:21 MSK     Click Here to See the Profile for Jack  Click Here to Email Jack     
Может кто предложит способ и получше, но я пользовал SendMessage():

Для записи в RichEdit -
SendMessage(hWnd, WM_SETTEXT, 0, (LPARAM)"qwerty");

Для чтения -
SendMessage(hWnd, WM_GETTEXT, (WPARAM)sizeof(buf), (LPARAM)buf);

zer опубликован 06-12-2001 09:35 MSK     Click Here to See the Profile for zer  Click Here to Email zer     
Для записи в RichEdit -
SetWindowText
Для чтения -
GetWindowText
SUnteXx опубликован 06-12-2001 12:03 MSK     Click Here to See the Profile for SUnteXx  Click Here to Email SUnteXx     
Я все понимаю, но эти ф-ции хороши только для засылки текста в обычном формате, а мне надо заслать текст в формате РТФ (RTF)!
SUnteXx опубликован 10-12-2001 12:01 MSK     Click Here to See the Profile for SUnteXx  Click Here to Email SUnteXx     
Na und? Kommentarlos, oder?
zer опубликован 10-12-2001 20:36 MSK     Click Here to See the Profile for zer  Click Here to Email zer     
Короче так. Берешь в фаре давишь на любом РТФнике F3 только не ворда 2000 так как там мусора много. И смотришь как он устроен
Делаешь
long n=...;
char *szText=new char[n];
lstrcpy(szText,"здесь РТФ");
SetWindowText(handle,szText);
delete [] szText;

Надо только знать как устроен РТФ и все

SUnteXx опубликован 12-12-2001 12:09 MSK     Click Here to See the Profile for SUnteXx  Click Here to Email SUnteXx     
2zer: Методы аля SetWindowText и ее производных (месаги потобного рода) не катят - не работают!

ЗЫ
Может кто-нить все-таки знает как енту бодягу можно реализовать?

FreeArtist опубликован 12-12-2001 19:20 MSK     Click Here to See the Profile for FreeArtist  Click Here to Email FreeArtist     
Держи:

#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;
}

SUnteXx опубликован 13-12-2001 12:01 MSK     Click Here to See the Profile for SUnteXx  Click Here to Email SUnteXx     
2FreeArtist: а пояснения можешь привести!

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.