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

字体大小: 中小 标准 ->行高大小: 标准
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