使用 CHtmlView

发布于 2024-11-09 19:42:02 字数 153 浏览 1 评论 0原文

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

谢谢, 德米特里

In my MFC application, I display text line by line in CScrollView. Now the new requirement is to display text (and sometimes images) in html format, preserving all effects e.g. bold, italic etc. I know I can use CHtmlView to display html files, but I need to display text stored in memory line by line. Is it possible?

Thanks,
Dmitriy

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

〆凄凉。 2024-11-16 19:42:02

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

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

We do something like that for our log.

We just keep a "live" html document and append to it and redisplay it to the html view.

We have implemented a small custom html builder for our own purpose to add items to the html.

You can send a string to an html document with something like :

    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();
    }

Max.

梦里寻她 2024-11-16 19:42:02

解决方案很简单,

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

The solution is very straightforward

Wait for document loading to be completed by overloading OnDocumentComplete function

CHtmlView::OnDocumentComplete( LPCTSTR lpszURL)
{

IHTMLDocument2 *document = GetDocument();

IHTMLElement* pBody = document->get_body();

BSTR str = "your HTML";

pBody-> put_innerHTML(str);

document->close();
document->Release();
}
落墨 2024-11-16 19:42:02

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

我们的解决方案(效果很好)是生成一个临时 html 文件(在 Windows 临时目录中)并将 CHtml 视图导航到该文件。原则上:(

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

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

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

It's not possible to simply generate HTML in a memory string and insert it in a CHtmlView.

Our solution (which works pretty well) is to generate a temporary html file (in Windows temp directory) and navigate the CHtml View to this file. In principle:

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

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

(this is pseudo code cause we do not use stdlib c++ classes.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文