get the Rtf formating from a RichEdit?
function GetRTFText(ARichEdit: TRichedit): string;
var
ss: TStringStream;
emptystr: string;
begin
emptystr := '';
ss := TStringStream.Create(emptystr);
try
ARichEdit.PlainText := False;
ARichEdit.Lines.SaveToStream(ss);
Result := ss.DataString;
finally
ss.Free
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Text := GetRTFText(RichEdit1);
end;
*********************************************************************
RTF 控件为我们开发提供了很大的方便并减轻了我们开发的工作量,但是它并没有提供一种类似于SetWindowText的简便方法让我们存取内容。一般的方法可以是插入文本再进行格式化,或是利用回调函数进行设置,针对这一原因本文讲述一种利用CString变量存取RTF Contrl中的文本内容的方法,虽然这也是建立在回调函数之上的却可以使其具有重用性。
1、定义回调函数
static DWORD CALLBACK EditStreamCallBack(DWORD dwCookie, LPBYTE pbBuff, LONG cb,
LONG *pcb)
{
CString *pstr = (CString *)dwCookie;
if( pstr->GetLength() < cb )
{
*pcb = pstr->GetLength();
memcpy(pbBuff, (LPCSTR)*pstr, *pcb );
pstr->Empty();
}
else
{
*pcb = cb;
memcpy(pbBuff, (LPCSTR)*pstr, *pcb );
*pstr = pstr->Right( pstr->GetLength() - cb );
}
return 0;
}
参数dwCokkie为用户定义数据,我们利用他传入一个CString的指针,pbBuff为RTF用于保存数据的缓冲,cb为RTF要求的数据量,pcb为用户提供的数据量(返回值),如果该数值如果小于cb表示写数据结束,RTF将停止调用回调函数。请注意该函数将被RTF调用一次或多次。函数说明中的CALLBACK一定要加上。
2、定义新类
CNewRTF::SetRTFText(....)
{
CString rtfPrefix, rtfPostfix;
rtfPrefix = "{\\rtf1\\ansi\\deff0\\deftab720{\\fonttbl{\\f0\\froman "
"Times New Roman;}}\n{\\colortbl\\red0\\green0\\blue0;}\n"
"\\deflang1033\\pard\\tx360\\tx720\\tx1080\\tx1440\\tx1800"
"\\tx2160\\tx2520\\tx2880\\tx3240\\tx3600\\tx3960\\tx4320"
"\\tx4680\\tx5040\\tx5400\\tx5760\\tx6120"
"\\tx6480\\plain\\f3\\fs20 ";
rtfPostfix = "\n\\par }";
//DEMO String 你可用自己的参数替代
CString rtfString = rtfPrefix + "\\b Bold\\b0" + rtfPostfix;
EDITSTREAM es = {(DWORD)&rtfString, 0, EditStreamCallBack};
StreamIn(SF_RTF | SFF_SELECTION, es);
}
关于读RTF的方法也可类似实现。