使用 CHtmlView
Posted
技术标签:
【中文标题】使用 CHtmlView【英文标题】:Using CHtmlView 【发布时间】:2011-05-26 20:44:46 【问题描述】:在我的 MFC 应用程序中,我在 CScrollView 中逐行显示文本。现在新的要求是以 html 格式显示文本(有时是图像),保留所有效果,例如粗体、斜体等。我知道我可以 来显示 html 文件,但我需要逐行显示存储在内存中的文本。有可能吗?
谢谢, 德米特里
【问题讨论】:
【参考方案1】:我们为我们的日志做类似的事情。
我们只保留一个“实时”的 html 文档并附加到它并重新显示到 html 视图中。
我们已经实现了一个小的自定义 html 构建器,用于向 html 添加项目。
您可以将字符串发送到 html 文档,例如:
IHTMLDocument2 *document = GetDocument();
if (document != NULL)
// construct text to be written to browser as SAFEARRAY
SAFEARRAY *safe_array = SafeArrayCreateVector(VT_VARIANT,0,1);
VARIANT *variant;
// string contains the HTML data.
// convert char* string to OLEstring
CComBSTR bstrTmp = string;
SafeArrayAccessData(safe_array,(LPVOID *)&variant);
variant->vt = VT_BSTR;
variant->bstrVal = bstrTmp;
SafeArrayUnaccessData(safe_array);
// write SAFEARRAY to browser document to append string
document->write(safe_array);
//Detach CComBSTR since string will be freed by SafeArrayDestroy
bstrTmp.Detach();
//free safe_array
SafeArrayDestroy(safe_array);
//release document
document->Release();
最大。
【讨论】:
【参考方案2】:解决方案非常简单
通过重载 OnDocumentComplete 函数等待文档加载完成
CHtmlView::OnDocumentComplete( LPCTSTR lpszURL)
IHTMLDocument2 *document = GetDocument();
IHTMLElement* pBody = document->get_body();
BSTR str = "your HTML";
pBody-> put_innerHTML(str);
document->close();
document->Release();
【讨论】:
它真的回答了这个问题吗? 是的。要求是使用 CHtmlView 在内存中显示 HTML,您可以在字符串“BSTR str”中加载 HTML 以在 CHtmlView 上显示【参考方案3】:不可能简单地在内存字符串中生成 HTML 并将其插入 CHtmlView。
我们的解决方案(效果很好)是生成一个临时 html 文件(在 Windows 临时目录中)并将 CHtml 视图导航到该文件。原则上:
OurTempFileClass theTempFile;
theTempFile.GetStream()->Put(mHTMLString.Get(), mHTMLString.GetLength());
CHtmlCtrl theHtmlCtrl;
theHtmlCtrl.Navigate2(theTempFile->GetFullPath());
(这是伪代码,因为我们不使用 stdlib c++ 类。
【讨论】:
非常感谢您的回答。我有一个现有的应用程序,它的视图是从 CScrollView 派生的。是否可以将其转换为使用 CHtmlView?我用 CScrollView 替换了基类并有void CBookView::OnDraw(CDC* pDC) Navigate2("C:\\Shared\\Monte\\mp3Text\\13.html");
但是什么都没有显示。
我不完全了解继承关系,但我认为您不应该在自己的 OnDraw() 函数中调用 Navigate() 函数。如果您覆盖 OnDraw() ,那么应该显示的所有内容都需要在此函数中发生。在这种情况下,永远不会使用 CHtmlView::OnDraw 函数(呈现 HTML 内容),因为您已将其替换为您自己的 OnDraw 函数。
但是除了我自己指定的内容之外还应该显示什么?在迁移到 CHtmlView 之前,我总是在自己的 OnDraw() 中使用 TextOut()。我决定创建一个基于 CHtmlView 的新应用程序,如果更改我现有的应用程序太麻烦的话。但我不知道从哪里调用 Navigate2()。在我发现它是从 OnInitialUpdate() 调用的示例中,但我想根据我打开的文档动态显示内容。你能告诉我我该怎么做吗?
另外,这里ms-news.net/f3292/… 有人声称他正在提供一种从内存中加载内容的方法,但我没有看到足够的信息来理解它是如何完成的。也许您可以为此提供任何cmets?非常感谢。
在上面的链接中,我只能看到问题,但没有人声称可以从内存中显示。 CHtmlView 使用 IE 来显示 HTML 内容。您无法完全控制渲染功能,因此 OnDraw() 绝对是错误的地方。每次要显示的内容发生变化时,您都需要生成临时文件并再次调用 Navigate2()。您可以在任何您想要的例程中执行此操作(甚至在您的 CHtmlView 派生类之外)。以上是关于使用 CHtmlView的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)