我已经实现了使用cricheditctrl
来连接 rtf 文本,但\par
在文件末尾遇到了问题。写字板使用相同的生成器并执行相同的操作。(Msftedit 5.41.21.2510)。
如果我,其中 wtrf 是一个 cricheditctrl:
const char* header = "this is a test header\r\n";
wrtf.SetWindowTextA(header);
结果 rtf 是:
{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fprq2\fcharset0 System;}}
{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\b\f0\fs20 this is a test header\par
\par}
最后两个\par
。
从更大的角度来看,我正在用 rtf 内容做我自己的事情。如果我最后不使用双曲作曲\par
,请执行以下操作:
std::string dest(_RichEditPreamble);
dest+= std::string("\\cf1 this is a test\\par\\par}";
SetRichText(wrtf,dest.c_str());
wrtf.SetSel(-1, -1); // Select last character
SetRichText(wrtf, more_rtf, SF_RTF | SFF_SELECTION);
我不会在两个条目之间得到段落分隔符。他们会互相对接。如果我输入一个简单的字板:
test
用一个换行符,我得到:
...\viewkind4\uc1\pard\sa120\cf1\f0\fs24 test\par
\f1\par
}
所以,至少,这在我的机器上总是一致的。但我在Word 2007: Rich Text Format (RTF) Specification, version 1.9.1中找不到有关它的内容。
我担心这不是恒定的行为,我可能会在其他机器上得到不同的结果。然后,也许我错过了一些关于如何正确结束 RTF 文档的内容。我确实搜索了这个。谢谢。
更新:我很抱歉这张图片,但我认为它有帮助。它只会变得更加混乱。
{rtf_stuff ... content\par}
并进入顶部窗口,您可以看到段落标记正在工作,只有一个。
sel= GetRichText( re, SF_RTF );
std::ofstream ts(R"(C:\cpp\ReserveAnalyst_14\StockCommentParser\test.txt)");
ts << sel;
test.txt 有:
{\rtf1\stuff ... asphalt sealing.\par
\par
}
现在有两个\par
。在我放置数据的第二个 RTF 窗口中:
SetRichText( pCommentFrm->GetRichCtrl( ), text, SF_RTF | SFF_SELECTION ); //todo ??
我最后有两段!(第二个 rtf 窗口)
所以,以防万一,这是我使用了 20 年的回调:
DWORD CALLBACK EditStreamCallBack(
DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb )
{
_afxRichEditStreamCookie* pCookie = (_afxRichEditStreamCookie*)dwCookie;
CArchive& ar = pCookie->m_ar;
DWORD dw = 0;
*pcb = cb;
TRY
{
if ( ar.IsStoring( ) )
ar.GetFile( )->Write( pbBuff, cb );
else
*pcb = ar.GetFile( )->Read( pbBuff, cb );
}
CATCH( CFileException, e )
{
*pcb = 0;
pCookie->m_dwError = (DWORD)e->m_cause;
dw = 1;
e->Delete( );
}
AND_CATCH_ALL( e )
{
*pcb = 0;
pCookie->m_dwError = -1;
dw = 1;
e->Delete( );
}
END_CATCH_ALL
return dw;
}
UPDATE2:现在我不得不相信这是控制中的一个缺陷。我看到了它,但它并没有在我的脑海中记录下来。所以有了这个:
std::string source1(_RichEditPreamble);
source1 += "\\cf1 test 1\\par}";
SetRichText(wrtf,source1.c_str());
std::string source2(_RichEditPreamble);
source2 += "\\cf0 test 2\\par";
wrtf.SetSel(-1, -1); // Select last character
SetRichText(wrtf, source2.c_str(), SF_RTF | SFF_SELECTION);
auto result = GetRichText(wrtf);
std::ofstream ts("..\\rtf_io.rtf");
ts << result;
文件中的结果是:
{\rtf1\,,,\viewkind4\uc1\pard\sa120\cf1\f0\fs24 test 1\cf2 test 2\cf1\par}
是将wrtf.SetSel(-1, -1);
插入点放在最后一个\par
之前,而不是在它之后。线索是最后一个 par 有一个\cf1
从第一个插入开始的颜色标签。在这种情况下,它正在放弃我的一个\par
where 在前一种情况下它不是,所以看起来我得到了额外的\par
。它快把我逼疯了!:)