【发布时间】:2021-12-14 11:08:52
【问题描述】:
我在写字板中创建了一个简单的 RTF 文档,截图如下:
看来,除了图片,RTF 的所有格式都可以正常工作,图片替换为空字符串。这是 RichEdit 的截图:
我尝试了 .bmp 和 .png。我还尝试了不同版本的 RichEdit 库: Riched20.dll 和 Msftedit.dll。在我的 .rtf 文件中有一个字符串 {\*\generator Riched20 10.0.19041},我想它是一个库和 SDK 版本,在 Visual Studio 中我使用相同的。
我用来加载 RTF 的代码很流行,取自互联网:
static DWORD CALLBACK FileStreamCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG* pcb)
{
std::ifstream* pFile = (std::ifstream*)dwCookie;
pFile->read((char*)pbBuff, cb);
return 0;
}
// ...
std::fstream file{ filePath };
EDITSTREAM editStream = { 0 };
editStream.dwCookie = (DWORD)&file;
editStream.pfnCallback = FileStreamCallback;
SendMessage(hwndEdit, EM_STREAMIN, SF_RTF, (LPARAM)&editStream);
为了简洁起见,这里是带有剪切图像数据的 RTF:
{\rtf1\ansi\ansicpg1251\deff0\nouicompat\deflang1049\deflangfe1049{\fonttbl{\f0\fswiss\fprq2\fcharset204 Calibri;}{\f1\fswiss\fprq2\fcharset0 Calibri;}}
{\colortbl ;\red0\green0\blue255;}
{\*\generator Riched20 10.0.19041}{\*\mmathPr\mdispDef1\mwrapIndent1440 }\viewkind4\uc1
\pard\nowidctlpar\sa200\sl240\slmult1\f0\fs22{\pict{\*\picprop}\wmetafile8\picw1323\pich1323\picwgoal750\pichgoal750
010009000003260300000000fd02000000000400000003010800050000000b0200000000050000
// intermediate data
0000002701ffff030000000000
}\par
\strike Hello\strike0 .\par
\pard
{\pntext\f0 a.\tab}{\*\pn\pnlvlbody\pnf0\pnindent0\pnstart1\pnlcltr{\pntxta.}}
\nowidctlpar\fi-360\li720\sa200\sl240\slmult1\f1\lang1033 34\f0\lang1049\par
{\pntext\f0 b.\tab}\f1\lang1033 28\f0\lang1049\par
\pard\nowidctlpar\sa200\sl240\slmult1 {\f1\lang1033{\field{\*\fldinst{HYPERLINK www.google.com }}{\fldrslt{www.google.com\ul0\cf0}}}}\f0\fs22\par
}
我也发现了一些指控,即 RichEdit 实际上无法使用上述方法处理图像。我不知道如何对待他们。
【问题讨论】: