1

我在这里看到了关于在富文本编辑控件中显示 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 文件。这就是我创建它的方式:

  1. 我在浏览器中访问了以下URL
  2. 我选择了所有修订历史内容并将其粘贴到 Microsoft Word 文件中。
  3. 我复制了 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

在此处输入图像描述

好处是显示与用户在帮助系统中看到的一致。

4

0 回答 0