我正在尝试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内容的一个选项是使用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);