0

我正在尝试在 BCB6 中编写类似 rtf 编辑器的内容,并且在尝试将表添加到我的 RichEdit1 时遇到了这样的问题:

    RichEdit1->PlainText=true;
    AnsiString ret=RichEdit1->Text;
    ret.Insert(table, RichEdit1->SelStart);
    RichEdit1->Text=ret;
    RichEdit1->PlainText=false;
    RichEdit1->Repaint();

此代码将格式化文本(表格代码)添加到 RichEdit1,而不是将格式化代码作为纯文本添加并像表格一样显示。

我是不是做错了,或者可能是其他问题。

4

2 回答 2

0

PlainText属性仅由Lines->LoadFrom...()andLines->SaveTo...()方法使用,没有其他用途。

Text属性仅对纯文本进行操作。读取该属性会提取 RichEdit 的文本内容而不进行格式化。设置该属性根本不处理 RTF 代码,RichEdit 的文本内容将按原样替换为新文本。

如果您想在 RichEdit 中插入 RTF 代码,尤其是如果您不想覆盖 RichEdit 的当前内容,则必须EM_STREAMIN直接使用该消息。例如:

DWORD CALLBACK StreamInCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
    int numRead = reinterpret_cast<TStringStream*>(dwCookie)->Read(pbBuff, cb);
    if (pcb) *pcb = numRead;
    return 0;
}

TStringStream *strm = new TStringStream(table);

EDITSTREAM es = {0};
es.dwCookie = (DWORD_PTR) strm;
es.pfnCallback = &StreamInCallback;
SendMessage(RichEdit1->Handle, EM_STREAMIN, SF_RTF | SFF_SELECTION, reinterpret_cast<LPARAM>(&es));

delete strm;
于 2013-05-21T05:21:17.753 回答
0

问题解决了,由于表格代码不在{}括号中,所以没有添加格式,在表格代码周围添加它们并使用SendMessage后,程序运行良好。

于 2013-05-22T19:47:06.363 回答