MFC:使用CHtmlView和内存字符串通过about:或data:?

问题描述 投票:0回答:1

我正在尝试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:,是否还有其他技巧可用于在CHtmlView中使用内存变量数据进行html显示?

html mfc uri
1个回答
1
投票

直接设置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;

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

    IHTMLDocument2 *doc2 = NULL;
    hr = disp->QueryInterface(IID_IHTMLDocument2, (void**)&doc2);

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

用法:

CString str = _T("<html><head></head><body>Hello</body></html>");
SetHTMLContent(m_chtmlview, str);
© www.soinside.com 2019 - 2024. All rights reserved.