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;}}{\colortbl\red0\green0\blue0;}"
"\deflang1033\pard\tx360\tx720\tx1080\tx1440\tx1800"
"\tx2160\tx2520\tx2880\tx3240\tx3600\tx3960\tx4320"
"\tx4680\tx5040\tx5400\tx5760\tx6120"
"\tx6480\plain\f3\fs20 ";
rtfPostfix = "\par }";
//DEMO String 你可用自己的参数替代
CString rtfString = rtfPrefix + "\b Bold\b0" + rtfPostfix;
EDITSTREAM es = {(DWORD)&rtfString, 0, EditStreamCallBack};
StreamIn(SF_RTF | SFF_SELECTION, es);
}
关于读RTF的方法也可类似实现。
此文章由 http://www.ositren.com 收集整理 ,地址为:
http://www.ositren.com/htmls/68143.html