使用CHtmlView

时间:2011-05-26 20:44:47

标签: visual-c++ mfc

在我的MFC应用程序中,我在CScrollView中逐行显示文本。现在新的要求是以html格式显示文本(有时是图像),保留所有效果,例如粗体,斜体等我知道我可以使用CHtmlView来显示html文件,但我需要逐行显示存储在内存中的文本。有可能吗?

谢谢, 德米特里

3 个答案:

答案 0 :(得分:2)

我们为日志做了类似的事情。

我们只保留一个“实时”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();
    }

最大

答案 1 :(得分:1)

不可能简单地在内存字符串中生成HTML并将其插入到CHtmlView中。

我们的解决方案(运行良好)是生成临时html文件(在Windows临时目录中)并将CHtml视图导航到此文件。原则上:

OurTempFileClass theTempFile;
theTempFile.GetStream()->Put(mHTMLString.Get(), mHTMLString.GetLength());

CHtmlCtrl theHtmlCtrl;
theHtmlCtrl.Navigate2(theTempFile->GetFullPath());

(这是伪代码,因为我们不使用stdlib c ++类。

答案 2 :(得分:1)

解决方案非常简单

通过重载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();
}