MFC:通过关于:或数据:将 CHtmlView 与内存字符串一起使用?

MFC: Using CHtmlView with memory string via about: or data:?

我正在尝试 CHtmlView 从内存变量中显示 html。在处理了进入调试模式的各种异常后,让它通过 about: uri 处理非常小的字符串。

示例:

Navigate(_T("about:<html><head></head><body>Hello</body></html>"))

适用于小物品,但不适用于较大的字符串。有谁知道 about: 的记录限制?

现在我发现了一个应该可用于 IE 的新项目,data: 条目,但是当我尝试

Navigate(_T("data:text/html, <html><head></head><body>Hello</body></html>"))

不行,搞出花哨的网页无法显示页面。有谁知道为什么 CHtmlView 不支持 data: 以及是否有任何其他技巧可用于将内存变量数据用于 html 显示在 CHtmlView 中?

直接设置 HTML 内容的一个选项是使用 IStream

从内存中读取

MFC的CHtmlEditCtrl使用类似的方法设置文档html内容,不同的是MFC使用CStreamOnCString.

您可能需要将内容设置为 UTF8 以实现兼容性。要使用 UTF8, 在下面的代码中将 CString 更改为 CStringA,并将 UTF8 字符串传递给函数 SetHTMLContent(htmlview, u8"<html>...")

HRESULT SetHTMLContent(CHtmlView* htmlview, CString html)
{
    if(!html.GetLength()) return E_FAIL;

    CComPtr<IDispatch> disp = htmlview->GetHtmlDocument();
    if(!disp)
    {
        //not initialized, try again
        htmlview->Navigate(_T("about:"));
        disp = htmlview->GetHtmlDocument();
        if(!disp)
            return E_NOINTERFACE;
    }

    CComQIPtr<IHTMLDocument2> doc2 = disp;
    if(!doc2) return E_NOINTERFACE;

    int charsize = sizeof(html.GetAt(0));
    IStream *istream = SHCreateMemStream(
        reinterpret_cast<const BYTE*>(html.GetBuffer()), charsize * html.GetLength());
    HRESULT hr = E_FAIL;
    if(istream)
    {
        CComQIPtr<IPersistStreamInit> psi = doc2;
        if(psi)
            hr = psi->Load(istream);
        istream->Release();
    }
    html.ReleaseBuffer();

    return hr;
}

用法:

CString str = _T("<html><head></head><body>Hello</body></html>");
SetHTMLContent(m_chtmlview, str);