首页  编辑  

获取Richedit控件里面文字的RTF代码?

Tags: /超级猛料/VCL/Memo&Edit&Richedit/RichEdit、RxRichEdit/   Date Created:

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的方法也可类似实现。

img_25344.bmp (297.1KB)