我在这里看到了关于在富文本编辑控件中显示 RTF 文件的讨论。也许我试图做的太多了。
在我的对话框类中,我定义了一个静态方法:
static DWORD CALLBACK MyStreamInCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG* pcb)
{
std::ifstream* pFile = (std::ifstream*)dwCookie;
pFile->read((char*)pbBuff, cb);
return 0;
}
在我的对话框OnInitDialog
类中,我尝试显示数据:
std::ifstream File("d:\\RevisionHistoryTest.rtf");
EDITSTREAM es = { 0 };
es.dwCookie = (DWORD)&File;
es.pfnCallback = MyStreamInCallback;
::SendMessage(m_rtfEdit, EM_STREAMIN, SF_RTF, (LPARAM)&es);
现在,这里是一个示例项目的链接。我不知道从长远来看我可以把这个项目放在哪里,但我的 DropBox 现在可以了。该项目不包括 RTF 文件。这就是我创建它的方式:
- 我在浏览器中访问了以下URL。
- 我选择了所有修订历史内容并将其粘贴到 Microsoft Word 文件中。
- 我复制了 Microsoft Word 内容并将其粘贴到写字板会话中并保存。
例子:
有趣的是,当我随后在写字板中打开我的 RTF 文件时,我收到一条弹出消息:
如果我选择取消阻止,那么它仍会在编辑器中打开。我认为这是因为所有图像仍必须链接到我网站上的图像。我认为这与我的测试项目的问题有关,因为这是我所看到的:
我没有得到任何错误或任何东西。它只是读取第一行并停止。
我试图找到在 RTF 窗口中显示我的 HTML 历史记录的最简单方法。
我的初衷是改用CHtmlView
控件(这样做很有意义)并直接从互联网上读取我的修订历史文件。但我的帮助系统旨在永久显示左侧的内容窗格。这就是为什么我认为 RTF 可能是一个合适的选择。但与之斗争。
更新
根据对 64 位构建的评论,我找到了适用于 32 位和 64 位的本教程。它们都只显示“修订历史”。
BOOL FillRichEditFromFile(HWND hwnd, LPCTSTR pszFile)
{
BOOL fSuccess = FALSE;
HANDLE hFile = CreateFile(pszFile, GENERIC_READ,
FILE_SHARE_READ, 0, OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
EDITSTREAM es = { 0 };
es.pfnCallback = MyStreamInCallback;
es.dwCookie = (DWORD_PTR)hFile;
if (SendMessage(hwnd, EM_STREAMIN, SF_RTF, (LPARAM)&es) && es.dwError == 0)
{
fSuccess = TRUE;
}
CloseHandle(hFile);
}
return fSuccess;
}
在OnInitDialog
:
FillRichEditFromFile(m_rtfEdit.GetSafeHwnd(), _T("d:\\RevisionHistoryTest.rtf"));
但我最初的问题仍然存在。
更新
我忘记将控件设置为多行!这是问题的一部分:
至少现在所有文本都是可见的。只是不是图像。而且我不喜欢某些链接的显示方式。
我已经能够编辑文件并将缩进移到左侧以使其看起来更好。但图像仍然不会显示。
更新
作为一种解决方法,我意识到我可以简单地将我的 HTML 修订历史复制为一个独立的页面。然后我可以使用CHtmlView
:
好处是显示与用户在帮助系统中看到的一致。