使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)