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);
我正在尝试 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);